diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 886af1626e65..e8edba7b5623 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -59,8 +59,6 @@ source "drivers/staging/wlan-ng/Kconfig" source "drivers/staging/echo/Kconfig" -source "drivers/staging/otus/Kconfig" - source "drivers/staging/brcm80211/Kconfig" source "drivers/staging/rt2860/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index e6f88b9af290..d8eeea4e63ae 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -13,7 +13,6 @@ obj-$(CONFIG_USB_IP_COMMON) += usbip/ obj-$(CONFIG_W35UND) += winbond/ obj-$(CONFIG_PRISM2_USB) += wlan-ng/ obj-$(CONFIG_ECHO) += echo/ -obj-$(CONFIG_OTUS) += otus/ obj-$(CONFIG_BRCM80211) += brcm80211/ obj-$(CONFIG_RT2860) += rt2860/ obj-$(CONFIG_RT2870) += rt2870/ diff --git a/drivers/staging/otus/80211core/amsdu.c b/drivers/staging/otus/80211core/amsdu.c deleted file mode 100644 index 0321288d107e..000000000000 --- a/drivers/staging/otus/80211core/amsdu.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * 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 */ - newBuf = zfwBufAllocate(dev, 24+2+subframeLen); - if (newBuf != 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; -} diff --git a/drivers/staging/otus/80211core/cagg.c b/drivers/staging/otus/80211core/cagg.c deleted file mode 100644 index c3cef1a02aa4..000000000000 --- a/drivers/staging/otus/80211core/cagg.c +++ /dev/null @@ -1,3621 +0,0 @@ -/* - * 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.c */ -/* */ -/* Abstract */ -/* This module contains A-MPDU aggregation related functions. */ -/* */ -/* NOTES */ -/* None */ -/* */ -/************************************************************************/ - -#include "cprecomp.h" - -extern u8_t zcUpToAc[8]; -const u8_t pri[] = {3,3,2,3,2,1,3,2,1,0}; - - -u16_t aggr_count; -u32_t success_mpdu; -u32_t total_mpdu; - -void zfAggInit(zdev_t* dev) -{ - u16_t i,j; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - /* - * reset sta information - */ - - zmw_enter_critical_section(dev); - wd->aggInitiated = 0; - wd->addbaComplete = 0; - wd->addbaCount = 0; - wd->reorder = 1; - for (i=0; iaggSta[i].aggQNumber[j] = ZM_AGG_POOL_SIZE; - wd->aggSta[i].aggFlag[j] = wd->aggSta[i].count[j] = 0; - wd->aggSta[i].tid_tx[j] = NULL; - wd->aggSta[i].tid_tx[j+1] = NULL; - - } - } - - /* - * reset Tx/Rx aggregation queue information - */ - wd->aggState = 0; - for (i=0; iaggQPool[i] = zfwMemAllocate(dev, sizeof(struct aggQueue)); - if(!wd->aggQPool[i]) - { - zmw_leave_critical_section(dev); - return; - } - wd->aggQPool[i]->aggHead = wd->aggQPool[i]->aggTail = - wd->aggQPool[i]->aggQEnabled = wd->aggQPool[i]->aggReady = - wd->aggQPool[i]->clearFlag = wd->aggQPool[i]->deleteFlag = 0; - //wd->aggQPool[i]->aggSize = 16; - - /* - * reset rx aggregation queue - */ - wd->tid_rx[i] = zfwMemAllocate(dev, sizeof(struct agg_tid_rx)); - if (!wd->tid_rx[i]) - { - zmw_leave_critical_section(dev); - return; - } - wd->tid_rx[i]->aid = ZM_MAX_STA_SUPPORT; - wd->tid_rx[i]->seq_start = wd->tid_rx[i]->baw_head = \ - wd->tid_rx[i]->baw_tail = 0; - wd->tid_rx[i]->sq_exceed_count = wd->tid_rx[i]->sq_behind_count = 0; - for (j=0; j<=ZM_AGG_BAW_SIZE; j++) - wd->tid_rx[i]->frame[j].buf = 0; - /* - * reset ADDBA exchange status code - * 0: NULL - * 1: ADDBA Request sent/received - * 2: ACK for ADDBA Request sent/received - * 3: ADDBA Response sent/received - * 4: ACK for ADDBA Response sent/received - */ - wd->tid_rx[i]->addBaExchangeStatusCode = 0; - - } - zmw_leave_critical_section(dev); - zfAggTallyReset(dev); - DESTQ.init = zfAggDestInit; - DESTQ.init(dev); - wd->aggInitiated = 1; - aggr_count = 0; - success_mpdu = 0; - total_mpdu = 0; -#ifdef ZM_ENABLE_AGGREGATION -#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW - BAW = zfwMemAllocate(dev, sizeof(struct baw_enabler)); - if(!BAW) - { - return; - } - BAW->init = zfBawInit; - BAW->init(dev); -#endif //disable BAW -#endif -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggGetSta */ -/* return STA AID. */ -/* take buf as input, use the dest address of buf as index to */ -/* search STA AID. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer for one particular packet */ -/* */ -/* OUTPUTS */ -/* AID */ -/* */ -/* AUTHOR */ -/* Honda ZyDAS Technology Corporation 2006.11 */ -/* */ -/************************************************************************/ - - - -u16_t zfAggGetSta(zdev_t* dev, zbuf_t* buf) -{ - u16_t id; - u16_t dst[3]; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - dst[0] = zmw_rx_buf_readh(dev, buf, 0); - dst[1] = zmw_rx_buf_readh(dev, buf, 2); - dst[2] = zmw_rx_buf_readh(dev, buf, 4); - - zmw_enter_critical_section(dev); - - if(wd->wlanMode == ZM_MODE_AP) { - id = zfApFindSta(dev, dst); - } - else { - id = 0; - } - zmw_leave_critical_section(dev); - -#if ZM_AGG_FPGA_DEBUG - id = 0; -#endif - - return id; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxGetQueue */ -/* return Queue Pool index. */ -/* take aid as input, look for the queue index associated */ -/* with this aid. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* aid : associated id */ -/* */ -/* OUTPUTS */ -/* Queue number */ -/* */ -/* AUTHOR */ -/* Honda ZyDAS Technology Corporation 2006.11 */ -/* */ -/************************************************************************/ -TID_TX zfAggTxGetQueue(zdev_t* dev, u16_t aid, u16_t tid) -{ - //u16_t i; - TID_TX tid_tx; - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - /* - * not a STA aid - */ - if (0xffff == aid) - return NULL; - - //zmw_enter_critical_section(dev); - - tid_tx = wd->aggSta[aid].tid_tx[tid]; - if (!tid_tx) return NULL; - if (0 == tid_tx->aggQEnabled) - return NULL; - - //zmw_leave_critical_section(dev); - - return tid_tx; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxNewQueue */ -/* return Queue Pool index. */ -/* take aid as input, find a new queue for this aid. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* aid : associated id */ -/* */ -/* OUTPUTS */ -/* Queue number */ -/* */ -/* AUTHOR */ -/* Honda ZyDAS Technology Corporation 2006.12 */ -/* */ -/************************************************************************/ -TID_TX zfAggTxNewQueue(zdev_t* dev, u16_t aid, u16_t tid, zbuf_t* buf) -{ - u16_t i; - TID_TX tid_tx=NULL; - u16_t ac = zcUpToAc[tid&0x7] & 0x3; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - /* - * not a STA aid - */ - if (0xffff == aid) - return NULL; - - zmw_enter_critical_section(dev); - - /* - * find one new queue for sta - */ - for (i=0; iaggQPool[i]->aggQEnabled) - { - /* - * this q is enabled - */ - } - else - { - tid_tx = wd->aggQPool[i]; - tid_tx->aggQEnabled = 1; - tid_tx->aggQSTA = aid; - tid_tx->ac = ac; - tid_tx->tid = tid; - tid_tx->aggHead = tid_tx->aggTail = tid_tx->size = 0; - tid_tx->aggReady = 0; - wd->aggSta[aid].tid_tx[tid] = tid_tx; - tid_tx->dst[0] = zmw_rx_buf_readh(dev, buf, 0); - tid_tx->dst[1] = zmw_rx_buf_readh(dev, buf, 2); - tid_tx->dst[2] = zmw_rx_buf_readh(dev, buf, 4); - break; - } - } - - zmw_leave_critical_section(dev); - - return tid_tx; -} - - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxEnqueue */ -/* return Status code ZM_SUCCESS or error code */ -/* take (aid,ac,qnum,buf) as input */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* aid : associated id */ -/* ac : access category */ -/* qnum: the queue number to which will be enqueued */ -/* buf : the packet to be queued */ -/* */ -/* OUTPUTS */ -/* status code */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfAggTxEnqueue(zdev_t* dev, zbuf_t* buf, u16_t aid, TID_TX tid_tx) -{ - //u16_t qlen, frameLen; - u32_t time; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - - if (tid_tx->size < (ZM_AGGQ_SIZE - 2)) - { - /* Queue not full */ - - - /* - * buffer copy - * in zfwBufFree will return a ndismsendcomplete - * to resolve the synchronize problem in aggregate - */ - - u8_t sendComplete = 0; - - tid_tx->aggvtxq[tid_tx->aggHead].buf = buf; - time = zm_agg_GetTime(); - tid_tx->aggvtxq[tid_tx->aggHead].arrivalTime = time; - tid_tx->aggvtxq[tid_tx->aggHead].baw_retransmit = 0; - - tid_tx->aggHead = ((tid_tx->aggHead + 1) & ZM_AGGQ_SIZE_MASK); - tid_tx->lastArrival = time; - tid_tx->size++; - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - if (buf && (tid_tx->size < (ZM_AGGQ_SIZE - 10))) { - tid_tx->complete = tid_tx->aggHead; - sendComplete = 1; - } - zmw_leave_critical_section(dev); - - if (!DESTQ.exist(dev, 0, tid_tx->ac, tid_tx, NULL)) { - DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL); - } - - zm_msg1_agg(ZM_LV_0, "tid_tx->size=", tid_tx->size); - //zm_debug_msg1("tid_tx->size=", tid_tx->size); - - if (buf && sendComplete && wd->zfcbSendCompleteIndication) { - //zmw_leave_critical_section(dev); - wd->zfcbSendCompleteIndication(dev, buf); - } - - /*if (tid_tx->size >= 16 && zfHpGetFreeTxdCount(dev) > 20) - zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx); - */ - return ZM_SUCCESS; - } - else - { - zm_msg1_agg(ZM_LV_0, "can't enqueue, tid_tx->size=", tid_tx->size); - /* - * Queue Full - */ - - /* - * zm_msg1_agg(ZM_LV_0, "Queue full, qnum = ", qnum); - * wd->commTally.txQosDropCount[ac]++; - * zfwBufFree(dev, buf, ZM_SUCCESS); - * zm_msg1_agg(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac); - * - * return ZM_ERR_EXCEED_PRIORITY_THRESHOLD; - */ - } - - zmw_leave_critical_section(dev); - - if (!DESTQ.exist(dev, 0, tid_tx->ac, tid_tx, NULL)) { - DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL); - } - - return ZM_ERR_EXCEED_PRIORITY_THRESHOLD; -} - -u16_t zfAggDestExist(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq) { - struct dest* dest; - u16_t exist = 0; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if (!DESTQ.Head[ac]) { - exist = 0; - } - else { - dest = DESTQ.Head[ac]; - if (dest->tid_tx == tid_tx) { - exist = 1; - } - else { - while (dest->next != DESTQ.Head[ac]) { - dest = dest->next; - if (dest->tid_tx == tid_tx){ - exist = 1; - break; - } - } - } - } - - zmw_leave_critical_section(dev); - - return exist; -} - -void zfAggDestInsert(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq) -{ - struct dest* new_dest; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - new_dest = zfwMemAllocate(dev, sizeof(struct dest)); - if(!new_dest) - { - return; - } - new_dest->Qtype = Qtype; - new_dest->tid_tx = tid_tx; - if (0 == Qtype) - new_dest->tid_tx = tid_tx; - else - new_dest->vtxq = vtxq; - if (!DESTQ.Head[ac]) { - - zmw_enter_critical_section(dev); - new_dest->next = new_dest; - DESTQ.Head[ac] = DESTQ.dest[ac] = new_dest; - zmw_leave_critical_section(dev); - } - else { - - zmw_enter_critical_section(dev); - new_dest->next = DESTQ.dest[ac]->next; - DESTQ.dest[ac]->next = new_dest; - zmw_leave_critical_section(dev); - } - - - //DESTQ.size[ac]++; - return; -} - -void zfAggDestDelete(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq) -{ - struct dest* dest, *temp; - u16_t i; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if (wd->destLock) { - zmw_leave_critical_section(dev); - return; - } - - - //zmw_declare_for_critical_section(); - for (i=0; i<4; i++) { - if (!DESTQ.Head[i]) continue; - dest = DESTQ.Head[i]; - if (!dest) continue; - - - while (dest && (dest->next != DESTQ.Head[i])) { - if (Qtype == 0 && dest->next->tid_tx == tid_tx){ - break; - } - if (Qtype == 1 && dest->next->vtxq == vtxq) { - break; - } - dest = dest->next; - } - - if ((Qtype == 0 && dest->next->tid_tx == tid_tx) || (Qtype == 1 && dest->next->vtxq == vtxq)) { - - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - if (tid_tx->size) { - zmw_leave_critical_section(dev); - return; - } - if (!DESTQ.Head[i]) { - temp = NULL; - } - else { - temp = dest->next; - if (temp == dest) { - DESTQ.Head[i] = DESTQ.dest[i] = NULL; - //DESTQ.size[i] = 0; - } - else { - dest->next = dest->next->next; - } - } - - if (temp == NULL) - {/* do nothing */} //zfwMemFree(dev, temp, sizeof(struct dest)); - else - zfwMemFree(dev, temp, sizeof(struct dest)); - - /*zmw_enter_critical_section(dev); - if (DESTQ.size[i] > 0) - DESTQ.size[i]--; - zmw_leave_critical_section(dev); - */ - } - - } - zmw_leave_critical_section(dev); - return; -} - -void zfAggDestInit(zdev_t* dev) -{ - u16_t i; - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - for (i=0; i<4; i++) { - //wd->destQ.Head[i].next = wd->destQ.Head[i]; - //wd->destQ.dest[i] = wd->destQ.Head[i]; - //DESTQ.size[i] = 0; - DESTQ.Head[i] = NULL; - } - DESTQ.insert = zfAggDestInsert; - DESTQ.delete = zfAggDestDelete; - DESTQ.init = zfAggDestInit; - DESTQ.getNext = zfAggDestGetNext; - DESTQ.exist = zfAggDestExist; - DESTQ.ppri = 0; - return; -} - -struct dest* zfAggDestGetNext(zdev_t* dev, u16_t ac) -{ - struct dest *dest = NULL; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if (DESTQ.dest[ac]) { - dest = DESTQ.dest[ac]; - DESTQ.dest[ac] = DESTQ.dest[ac]->next; - } - else { - dest = NULL; - } - zmw_leave_critical_section(dev); - - return dest; -} - -#ifdef ZM_ENABLE_AGGREGATION -#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW -u16_t zfAggTidTxInsertHead(zdev_t* dev, struct bufInfo *buf_info,TID_TX tid_tx) -{ - zbuf_t* buf; - u32_t time; - struct baw_header *baw_header; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - - buf = buf_info->buf; - - zmw_enter_critical_section(dev); - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - zmw_leave_critical_section(dev); - - if (tid_tx->size >= (ZM_AGGQ_SIZE - 2)) { - zfwBufFree(dev, buf, ZM_SUCCESS); - return 0; - } - - zmw_enter_critical_section(dev); - tid_tx->aggTail = (tid_tx->aggTail == 0)? ZM_AGGQ_SIZE_MASK: tid_tx->aggTail - 1; - tid_tx->aggvtxq[tid_tx->aggTail].buf = buf; - //time = zm_agg_GetTime(); - tid_tx->aggvtxq[tid_tx->aggTail].arrivalTime = buf_info->timestamp; - tid_tx->aggvtxq[tid_tx->aggTail].baw_retransmit = buf_info->baw_retransmit; - - baw_header = &tid_tx->aggvtxq[tid_tx->aggTail].baw_header; - baw_header->headerLen = buf_info->baw_header->headerLen; - baw_header->micLen = buf_info->baw_header->micLen; - baw_header->snapLen = buf_info->baw_header->snapLen; - baw_header->removeLen = buf_info->baw_header->removeLen; - baw_header->keyIdx = buf_info->baw_header->keyIdx; - zfwMemoryCopy((u8_t *)baw_header->header, (u8_t *)buf_info->baw_header->header, 58); - zfwMemoryCopy((u8_t *)baw_header->mic , (u8_t *)buf_info->baw_header->mic , 8); - zfwMemoryCopy((u8_t *)baw_header->snap , (u8_t *)buf_info->baw_header->snap , 8); - - tid_tx->size++; - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - zmw_leave_critical_section(dev); - - //tid_tx->lastArrival = time; - if (1 == tid_tx->size) { - DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL); - } - - - zm_msg1_agg(ZM_LV_0, "0xC2:insertHead, tid_tx->size=", tid_tx->size); - - return TRUE; -} -#endif //disable BAW -#endif - -void zfiTxComplete(zdev_t* dev) -{ - - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - if( (wd->wlanMode == ZM_MODE_AP) || - (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) || - (wd->wlanMode == ZM_MODE_PSEUDO) ) { - zfAggTxScheduler(dev, 0); - } - - return; -} - -TID_TX zfAggTxReady(zdev_t* dev) { - //struct dest* dest; - u16_t i; - TID_TX tid_tx = NULL; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - for (i=0; iaggQPool[i]->aggQEnabled) - { - if (wd->aggQPool[i]->size >= 16) { - tid_tx = wd->aggQPool[i]; - break; - } - } - else { - } - } - zmw_leave_critical_section(dev); - return tid_tx; -} - -u16_t zfAggValidTidTx(zdev_t* dev, TID_TX tid_tx) { - u16_t i, valid = 0; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - for (i=0; iaggQPool[i] == tid_tx) - { - valid = 1; - break; - } - else { - } - } - zmw_leave_critical_section(dev); - - return valid; -} - -void zfAggTxScheduler(zdev_t* dev, u8_t ScanAndClear) -{ - TID_TX tid_tx = NULL; - void* vtxq; - struct dest* dest; - zbuf_t* buf; - u32_t txql, min_txql; - //u16_t aggr_size = 1; - u16_t txq_threshold; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if (!wd->aggInitiated) - { - return; - } - - /* debug */ - txql = TXQL; - min_txql = AGG_MIN_TXQL; - - if(wd->txq_threshold) - txq_threshold = wd->txq_threshold; - else - txq_threshold = AGG_MIN_TXQL; - - tid_tx = zfAggTxReady(dev); - if (tid_tx) ScanAndClear = 0; - while (zfHpGetFreeTxdCount(dev) > 20 && (TXQL < txq_threshold || tid_tx)) { - //while (zfHpGetFreeTxdCount(dev) > 20 && (ScanAndClear || tid_tx)) { - //while (TXQL < txq_threshold) { - u16_t i; - u8_t ac; - s8_t destQ_count = 0; - //while ((zfHpGetFreeTxdCount(dev)) > 32) { - - //DbgPrint("zfAggTxScheduler: in while loop"); - for (i=0; i<4; i++) { - if (DESTQ.Head[i]) destQ_count++; - } - if (0 >= destQ_count) break; - - zmw_enter_critical_section(dev); - ac = pri[DESTQ.ppri]; DESTQ.ppri = (DESTQ.ppri + 1) % 10; - zmw_leave_critical_section(dev); - - for (i=0; i<10; i++){ - if(DESTQ.Head[ac]) break; - - zmw_enter_critical_section(dev); - ac = pri[DESTQ.ppri]; DESTQ.ppri = (DESTQ.ppri + 1) % 10; - zmw_leave_critical_section(dev); - } - if (i == 10) break; - //DbgPrint("zfAggTxScheduler: have dest Q"); - zmw_enter_critical_section(dev); - wd->destLock = 1; - zmw_leave_critical_section(dev); - - dest = DESTQ.getNext(dev, ac); - if (!dest) { - zmw_enter_critical_section(dev); - wd->destLock = 0; - zmw_leave_critical_section(dev); - - DbgPrint("bug report! DESTQ.getNext got nothing!"); - break; - } - if (dest->Qtype == 0) { - tid_tx = dest->tid_tx; - - //DbgPrint("zfAggTxScheduler: have tid_tx Q"); - - if(tid_tx && zfAggValidTidTx(dev, tid_tx)) - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - else { - zmw_enter_critical_section(dev); - wd->destLock = 0; - zmw_leave_critical_section(dev); - - tid_tx = zfAggTxReady(dev); - continue; - } - - zmw_enter_critical_section(dev); - wd->destLock = 0; - zmw_leave_critical_section(dev); - //zmw_enter_critical_section(dev); - if (tid_tx && !tid_tx->size) { - - //zmw_leave_critical_section(dev); - //DESTQ.delete(dev, 0, tid_tx, NULL); - } - else if(wd->aggState == 0){ - //wd->aggState = 1; - //zmw_leave_critical_section(dev); - zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx); - //wd->aggState = 0; - } - else { - //zmw_leave_critical_section(dev); - break; - } - } - else { - vtxq = dest->vtxq; - buf = zfGetVtxq(dev, ac); - zm_assert( buf != 0 ); - - zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0); - - } - /*flush all but < 16 frames in tid_tx to TXQ*/ - tid_tx = zfAggTxReady(dev); - } - - /*while ((zfHpGetFreeTxdCount(dev)) > 32) { - //while ((zfHpGetFreeTxdCount(dev)) > 32) { - - destQ_count = 0; - for (i=0; i<4; i++) destQ_count += wd->destQ.size[i]; - if (0 >= destQ_count) break; - - ac = pri[wd->destQ.ppri]; wd->destQ.ppri = (wd->destQ.ppri + 1) % 10; - for (i=0; i<10; i++){ - if(wd->destQ.size[ac]!=0) break; - ac = pri[wd->destQ.ppri]; wd->destQ.ppri = (wd->destQ.ppri + 1) % 10; - } - if (i == 10) break; - dest = wd->destQ.getNext(dev, ac); - if (dest->Qtype == 0) { - tid_tx = dest->tid_tx; - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - if (!tid_tx->size) { - wd->destQ.delete(dev, 0, tid_tx, NULL); - break; - } - else if((wd->aggState == 0) && (tid_tx->size >= 16)){ - zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx); - } - else { - break; - } - } - - } - */ - return; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTx */ -/* return Status code ZM_SUCCESS or error code */ -/* management A-MPDU aggregation function, */ -/* management aggregation queue, calculate arrivalrate, */ -/* add/delete an aggregation queue of a stream, */ -/* enqueue packets into responsible aggregate queue. */ -/* take (dev, buf, ac) as input */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : packet buff */ -/* ac : access category */ -/* */ -/* OUTPUTS */ -/* status code */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfAggTx(zdev_t* dev, zbuf_t* buf, u16_t tid) -{ - u16_t aid; - //u16_t qnum; - //u16_t aggflag = 0; - //u16_t arrivalrate = 0; - TID_TX tid_tx; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if(!wd->aggInitiated) - { - return ZM_ERR_TX_BUFFER_UNAVAILABLE; - } - - aid = zfAggGetSta(dev, buf); - - //arrivalrate = zfAggTxArrivalRate(dev, aid, tid); - - if (0xffff == aid) - { - /* - * STA not associated, this is a BC/MC or STA->AP packet - */ - - return ZM_ERR_TX_BUFFER_UNAVAILABLE; - } - - /* - * STA associated, a unicast packet - */ - - tid_tx = zfAggTxGetQueue(dev, aid, tid); - - /*tid_q.tid_tx = tid_tx; - wd->destQ.insert = zfAggDestInsert; - wd->destQ.insert(dev, 0, tid_q); - */ - if (tid_tx != NULL) - { - /* - * this (aid, ac) is aggregated - */ - - //if (arrivalrate < ZM_AGG_LOW_THRESHOLD) - if (0) - { - /* - * arrival rate too low - * delete this aggregate queue - */ - - zmw_enter_critical_section(dev); - - //wd->aggQPool[qnum]->clearFlag = wd->aggQPool[qnum]->deleteFlag =1; - - zmw_leave_critical_section(dev); - - } - - return zfAggTxEnqueue(dev, buf, aid, tid_tx); - - } - else - { - /* - * this (aid, ac) not yet aggregated - * queue not found - */ - - //if (arrivalrate > ZM_AGG_HIGH_THRESHOLD) - if (1) - { - /* - * arrivalrate high enough to get a new agg queue - */ - - tid_tx = zfAggTxNewQueue(dev, aid, tid, buf); - - //zm_msg1_agg(ZM_LV_0, "get new AggQueue qnum = ", tid_tx->); - - if (tid_tx) - { - /* - * got a new aggregate queue - */ - - //zmw_enter_critical_section(dev); - - //wd->aggSta[aid].aggFlag[ac] = 1; - - //zmw_leave_critical_section(dev); - - /* - * add ADDBA functions here - * return ZM_ERR_TX_BUFFER_UNAVAILABLE; - */ - - - //zfAggSendAddbaRequest(dev, tid_tx->dst, tid_tx->ac, tid_tx->tid); - //zmw_enter_critical_section(dev); - - //wd->aggSta[aid].aggFlag[ac] = 0; - - //zmw_leave_critical_section(dev); - - return zfAggTxEnqueue(dev, buf, aid, tid_tx); - - } - else - { - /* - * just can't get a new aggregate queue - */ - - return ZM_ERR_TX_BUFFER_UNAVAILABLE; - } - } - else - { - /* - * arrival rate is not high enough to get a new agg queue - */ - - return ZM_ERR_TX_BUFFER_UNAVAILABLE; - } - } - - - -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxReadyCount */ -/* return counter of ready to aggregate queues. */ -/* take (dev, ac) as input, only calculate the ready to aggregate */ -/* queues of one particular ac. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* ac : access category */ -/* */ -/* OUTPUTS */ -/* counter of ready to aggregate queues */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfAggTxReadyCount(zdev_t* dev, u16_t ac) -{ - u16_t i; - u16_t readycount = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - for (i=0 ; iaggQPool[i]->aggQEnabled && (wd->aggQPool[i]->aggReady || \ - wd->aggQPool[i]->clearFlag) && ac == wd->aggQPool[i]->ac) - readycount++; - } - - zmw_leave_critical_section(dev); - - return readycount; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxPartial */ -/* return the number that Vtxq has to send. */ -/* take (dev, ac, readycount) as input, calculate the ratio of */ -/* Vtxq length to (Vtxq length + readycount) of a particular ac, */ -/* and returns the Vtxq length * the ratio */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* ac : access category */ -/* readycount: the number of ready to aggregate queues of this ac */ -/* */ -/* OUTPUTS */ -/* Vtxq length * ratio */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfAggTxPartial(zdev_t* dev, u16_t ac, u16_t readycount) -{ - u16_t qlen; - u16_t partial; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - qlen = zm_agg_qlen(dev, wd->vtxqHead[ac], wd->vtxqTail[ac]); - - if ((qlen + readycount) > 0) - { - partial = (u16_t)( zm_agg_weight(ac) * ((u16_t)qlen/(qlen + \ - readycount)) ); - } - else - { - partial = 0; - } - - zmw_leave_critical_section(dev); - - if (partial > qlen) - partial = qlen; - - return partial; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxSend */ -/* return sentcount */ -/* take (dev, ac, n) as input, n is the number of scheduled agg */ -/* queues to be sent of the particular ac. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* ac : access category */ -/* n : the number of scheduled aggregation queues to be sent */ -/* */ -/* OUTPUTS */ -/* sentcount */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfAggTxSend(zdev_t* dev, u32_t freeTxd, TID_TX tid_tx) -{ - //u16_t qnum; - //u16_t qlen; - u16_t j; - //u16_t sentcount = 0; - zbuf_t* buf; - struct aggControl aggControl; - u16_t aggLen; - //zbuf_t* newBuf; - //u16_t bufLen; - //TID_BAW tid_baw = NULL; - //struct bufInfo *buf_info; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - //while (tid_tx->size > 0) - - zmw_enter_critical_section(dev); - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - aggLen = zm_agg_min(16, zm_agg_min(tid_tx->size, (u16_t)(freeTxd - 2))); - zmw_leave_critical_section(dev); - - /* - * why there have to be 2 free Txd? - */ - if (aggLen <=0 ) - return 0; - - - if (aggLen == 1) { - buf = zfAggTxGetVtxq(dev, tid_tx); - if (buf) - zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0); - if (tid_tx->size == 0) { - //DESTQ.delete(dev, 0, tid_tx, NULL); - } - - return 1; - } - /* - * Free Txd queue is big enough to put aggregation - */ - zmw_enter_critical_section(dev); - if (wd->aggState == 1) { - zmw_leave_critical_section(dev); - return 0; - } - wd->aggState = 1; - zmw_leave_critical_section(dev); - - - zm_msg1_agg(ZM_LV_0, "aggLen=", aggLen); - tid_tx->aggFrameSize = 0; - for (j=0; j < aggLen; j++) { - buf = zfAggTxGetVtxq(dev, tid_tx); - - zmw_enter_critical_section(dev); - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - zmw_leave_critical_section(dev); - - if ( buf ) { - //struct aggTally *agg_tal; - u16_t completeIndex; - - if (0 == j) { - aggControl.ampduIndication = ZM_AGG_FIRST_MPDU; - - } - else if ((j == (aggLen - 1)) || tid_tx->size == 0) - { - aggControl.ampduIndication = ZM_AGG_LAST_MPDU; - //wd->aggState = 0; - - } - else - { - aggControl.ampduIndication = ZM_AGG_MIDDLE_MPDU; - /* the packet is delayed more than 500 ms, drop it */ - - } - tid_tx->aggFrameSize += zfwBufGetSize(dev, buf); - aggControl.addbaIndication = 0; - aggControl.aggEnabled = 1; - -#ifdef ZM_AGG_TALLY - agg_tal = &wd->agg_tal; - agg_tal->sent_packets_sum++; - -#endif - - zfAggTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0, &aggControl, tid_tx); - - zmw_enter_critical_section(dev); - completeIndex = tid_tx->complete; - if(zm_agg_inQ(tid_tx, tid_tx->complete)) - zm_agg_plus(tid_tx->complete); - zmw_leave_critical_section(dev); - - if(zm_agg_inQ(tid_tx, completeIndex) && wd->zfcbSendCompleteIndication - && tid_tx->aggvtxq[completeIndex].buf) { - wd->zfcbSendCompleteIndication(dev, tid_tx->aggvtxq[completeIndex].buf); - zm_debug_msg0("in queue complete worked!"); - } - - } - else { - /* - * this aggregation queue is empty - */ - zm_msg1_agg(ZM_LV_0, "aggLen not reached, but no more frame, j=", j); - - break; - } - } - zmw_enter_critical_section(dev); - wd->aggState = 0; - zmw_leave_critical_section(dev); - - //zm_acquire_agg_spin_lock(Adapter); - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - //zm_release_agg_spin_lock(Adapter); - - if (tid_tx->size == 0) { - //DESTQ.delete(dev, 0, tid_tx, NULL); - } - - - - //zfAggInvokeBar(dev, tid_tx); - if(j>0) { - aggr_count++; - zm_msg1_agg(ZM_LV_0, "0xC2:sent 1 aggr, aggr_count=", aggr_count); - zm_msg1_agg(ZM_LV_0, "0xC2:sent 1 aggr, aggr_size=", j); - } - return j; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxGetReadyQueue */ -/* return the number of the aggregation queue */ -/* take (dev, ac) as input, find the agg queue with smallest */ -/* arrival time (waited longest) among those ready or clearFlag */ -/* set queues. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* ac : access category */ -/* */ -/* OUTPUTS */ -/* aggregation queue number */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -TID_TX zfAggTxGetReadyQueue(zdev_t* dev, u16_t ac) -{ - //u16_t qnum = ZM_AGG_POOL_SIZE; - u16_t i; - u32_t time = 0; - TID_TX tid_tx = NULL; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - for (i=0 ;iaggQPool[i]->aggQEnabled && ac == wd->aggQPool[i]->ac && - (wd->aggQPool[i]->size > 0)) - { - if (0 == time || time > wd->aggQPool[i]->aggvtxq[ \ - wd->aggQPool[i]->aggHead ].arrivalTime) - { - tid_tx = wd->aggQPool[i]; - time = tid_tx->aggvtxq[ tid_tx->aggHead ].arrivalTime; - } - } - } - - zmw_leave_critical_section(dev); - - return tid_tx; -} - - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxGetVtxq */ -/* return an MSDU */ -/* take (dev, qnum) as input, return an MSDU out of the agg queue. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* qnum: queue number */ -/* */ -/* OUTPUTS */ -/* a MSDU */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -zbuf_t* zfAggTxGetVtxq(zdev_t* dev, TID_TX tid_tx) -{ - zbuf_t* buf = NULL; - - zmw_declare_for_critical_section(); - - if (tid_tx->aggHead != tid_tx->aggTail) - { - buf = tid_tx->aggvtxq[ tid_tx->aggTail ].buf; - - tid_tx->aggvtxq[tid_tx->aggTail].buf = NULL; - - zmw_enter_critical_section(dev); - tid_tx->aggTail = ((tid_tx->aggTail + 1) & ZM_AGGQ_SIZE_MASK); - if(tid_tx->size > 0) tid_tx->size--; - tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail); - if (NULL == buf) { - //tid_tx->aggTail = tid_tx->aggHead = tid_tx->size = 0; - //zm_msg1_agg(ZM_LV_0, "GetVtxq buf == NULL, tid_tx->size=", tid_tx->size); - } - zmw_leave_critical_section(dev); - } - else - { - /* - * queue is empty - */ - zm_msg1_agg(ZM_LV_0, "tid_tx->aggHead == tid_tx->aggTail, tid_tx->size=", tid_tx->size); - - } - - if (zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail) != tid_tx->size) - zm_msg1_agg(ZM_LV_0, "qlen!=tid_tx->size! tid_tx->size=", tid_tx->size); - return buf; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxDeleteQueue */ -/* return ZM_SUCCESS (can't fail) */ -/* take (dev, qnum) as input, reset (delete) this aggregate queue, */ -/* this queue is virtually returned to the aggregate queue pool. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* qnum: queue number */ -/* */ -/* OUTPUTS */ -/* ZM_SUCCESS */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfAggTxDeleteQueue(zdev_t* dev, u16_t qnum) -{ - u16_t ac, tid; - struct aggQueue *tx_tid; - struct aggSta *agg_sta; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - tx_tid = wd->aggQPool[qnum]; - agg_sta = &wd->aggSta[tx_tid->aggQSTA]; - ac = tx_tid->ac; - tid = tx_tid->tid; - - zmw_enter_critical_section(dev); - - tx_tid->aggQEnabled = 0; - tx_tid->aggHead = tx_tid->aggTail = 0; - tx_tid->aggReady = 0; - tx_tid->clearFlag = tx_tid->deleteFlag = 0; - tx_tid->size = 0; - agg_sta->count[ac] = 0; - - agg_sta->tid_tx[tid] = NULL; - agg_sta->aggFlag[ac] = 0; - - zmw_leave_critical_section(dev); - - zm_msg1_agg(ZM_LV_0, "queue deleted! qnum=", qnum); - - return ZM_SUCCESS; -} - -#ifdef ZM_ENABLE_AGGREGATION -#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW -void zfBawCore(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen) { - TID_BAW tid_baw; - s16_t i; - zbuf_t* buf; - struct bufInfo *buf_info; - - zmw_get_wlan_dev(dev); - //zmw_declare_for_critical_section(); - tid_baw = BAW->getQ(dev, baw_seq); - //tid_baw = NULL; - if (NULL == tid_baw) - return; - - total_mpdu += aggLen; - for (i = aggLen - 1; i>=0; i--) { - if (((bitmap >> i) & 0x1) == 0) { - buf_info = BAW->pop(dev, i, tid_baw); - buf = buf_info->buf; - if (buf) { - //wd->zfcbSetBawQ(dev, buf, 0); - zfAggTidTxInsertHead(dev, buf_info, tid_baw->tid_tx); - } - } - else { - success_mpdu++; - } - } - BAW->disable(dev, tid_baw); - zfAggTxScheduler(dev); - zm_debug_msg1("success_mpdu = ", success_mpdu); - zm_debug_msg1(" total_mpdu = ", total_mpdu); -} - -void zfBawInit(zdev_t* dev) { - TID_BAW tid_baw; - u16_t i,j; - zmw_get_wlan_dev(dev); - //zmw_declare_for_critical_section(); - - for (i=0; itid_baw[i]; - for (j=0; jframe[j].buf = NULL; - } - tid_baw->enabled = tid_baw->head = tid_baw->tail = tid_baw->size = 0; - tid_baw->start_seq = 0; - } - BAW->delPoint = 0; - BAW->core = zfBawCore; - BAW->getNewQ = zfBawGetNewQ; - BAW->insert = zfBawInsert; - BAW->pop = zfBawPop; - BAW->enable = zfBawEnable; - BAW->disable = zfBawDisable; - BAW->getQ = zfBawGetQ; -} - - - -TID_BAW zfBawGetNewQ(zdev_t* dev, u16_t start_seq, TID_TX tid_tx) { - TID_BAW tid_baw=NULL; - TID_BAW next_baw=NULL; - u16_t i; - zmw_get_wlan_dev(dev); - //zmw_declare_for_critical_section(); - - /* - for (i=0; itid_baw[i]; - if (FALSE == tid_baw->enabled) - break; - } - */ - - tid_baw = &BAW->tid_baw[BAW->delPoint]; - i = BAW->delPoint; - //if (ZM_BAW_POOL_SIZE == i) { - //return NULL; - // u8_t temp = BAW->delPoint; - // tid_baw = &BAW->tid_baw[BAW->delPoint]; - // BAW->disable(dev, tid_baw); - // BAW->delPoint = (BAW->delPoint < (ZM_BAW_POOL_SIZE - 1))? (BAW->delPoint + 1): 0; - // temp = BAW->delPoint; - //} - - zm_msg1_agg(ZM_LV_0, "get new tid_baw, index=", i); - BAW->delPoint = (i < (ZM_BAW_POOL_SIZE -1))? (i + 1): 0; - next_baw = &BAW->tid_baw[BAW->delPoint]; - if (1 == next_baw->enabled) BAW->disable(dev, next_baw); - - BAW->enable(dev, tid_baw, start_seq); - tid_baw->tid_tx = tid_tx; - - return tid_baw; -} - -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) { - //TID_BAW tid_baw; - //u16_t bufLen; - - //zmw_get_wlan_dev(dev); - //zmw_declare_for_critical_section(); - - if(tid_baw->size < (ZM_VTXQ_SIZE - 1)) { - struct baw_header *baw_header = &tid_baw->frame[tid_baw->head].baw_header; - - baw_header->headerLen = header_r->headerLen; - baw_header->micLen = header_r->micLen; - baw_header->snapLen = header_r->snapLen; - baw_header->removeLen = header_r->removeLen; - baw_header->keyIdx = header_r->keyIdx; - zfwMemoryCopy((u8_t *)baw_header->header, (u8_t *)header_r->header, 58); - zfwMemoryCopy((u8_t *)baw_header->mic , (u8_t *)header_r->mic , 8); - zfwMemoryCopy((u8_t *)baw_header->snap , (u8_t *)header_r->snap , 8); - //wd->zfcbSetBawQ(dev, buf, 1); - tid_baw->frame[tid_baw->head].buf = buf; - tid_baw->frame[tid_baw->head].baw_seq = baw_seq; - tid_baw->frame[tid_baw->head].baw_retransmit = baw_retransmit + 1; - - //tid_baw->frame[tid_baw->head].data = pBuf->data; - tid_baw->head++; - tid_baw->size++; - } - else { - //wd->zfcbSetBawQ(dev, buf, 0); - zfwBufFree(dev, buf, ZM_SUCCESS); - return FALSE; - } - return TRUE; -} - -struct bufInfo* zfBawPop(zdev_t* dev, u16_t index, TID_BAW tid_baw) { - //TID_BAW tid_baw; - //zbuf_t* buf; - struct bufInfo *buf_info; - zmw_get_wlan_dev(dev); - - buf_info = &wd->buf_info; - buf_info->baw_header = NULL; - - if (NULL == (buf_info->buf = tid_baw->frame[index].buf)) - return buf_info; - - buf_info->baw_retransmit = tid_baw->frame[index].baw_retransmit; - buf_info->baw_header = &tid_baw->frame[index].baw_header; - buf_info->timestamp = tid_baw->frame[index].timestamp; - //pBuf->data = pBuf->buffer; - //wd->zfcbRestoreBufData(dev, buf); - tid_baw->frame[index].buf = NULL; - - return buf_info; -} - -void zfBawEnable(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq) { - //TID_BAW tid_baw; - - //zmw_get_wlan_dev(dev); - //zmw_declare_for_critical_section(); - - tid_baw->enabled = TRUE; - tid_baw->head = tid_baw->tail = tid_baw->size = 0; - tid_baw->start_seq = start_seq; -} - -void zfBawDisable(zdev_t* dev, TID_BAW tid_baw) { - //TID_BAW tid_baw; - u16_t i; - - //zmw_get_wlan_dev(dev); - //zmw_declare_for_critical_section(); - for (i=0; iframe[i].buf) { - - //wd->zfcbSetBawQ(dev, tid_baw->frame[i].buf, 0); - zfwBufFree(dev, tid_baw->frame[i].buf, ZM_SUCCESS); - tid_baw->frame[i].buf = NULL; - } - } - - tid_baw->enabled = FALSE; -} - -TID_BAW zfBawGetQ(zdev_t* dev, u16_t baw_seq) { - TID_BAW tid_baw=NULL; - u16_t i; - - zmw_get_wlan_dev(dev); - //zmw_declare_for_critical_section(); - for (i=0; itid_baw[i]; - if (TRUE == tid_baw->enabled) - { - zm_msg1_agg(ZM_LV_0, "get an old tid_baw, baw_seq=", baw_seq); - zm_msg1_agg(ZM_LV_0, "check a tid_baw->start_seq=", tid_baw->start_seq); - if(baw_seq == tid_baw->start_seq) - break; - } - - } - if (ZM_BAW_POOL_SIZE == i) - return NULL; - return tid_baw; -} -#endif //disable BAW -#endif - -u16_t zfAggTallyReset(zdev_t* dev) -{ - struct aggTally* agg_tal; - - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - agg_tal = &wd->agg_tal; - agg_tal->got_packets_sum = 0; - agg_tal->got_bytes_sum = 0; - agg_tal->sent_bytes_sum = 0; - agg_tal->sent_packets_sum = 0; - agg_tal->avg_got_packets = 0; - agg_tal->avg_got_bytes = 0; - agg_tal->avg_sent_packets = 0; - agg_tal->avg_sent_bytes = 0; - agg_tal->time = 0; - return 0; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggScanAndClear */ -/* If the packets in a queue have waited for too long, clear and */ -/* delete this aggregation queue. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* time : current time */ -/* */ -/* OUTPUTS */ -/* ZM_SUCCESS */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfAggScanAndClear(zdev_t* dev, u32_t time) -{ - u16_t i; - u16_t head; - u16_t tail; - u32_t tick; - u32_t arrivalTime; - //u16_t aid, ac; - TID_TX tid_tx; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if(!(wd->state == ZM_WLAN_STATE_ENABLED)) return 0; - zfAggTxScheduler(dev, 1); - tick = zm_agg_GetTime(); - for (i=0; iaggQPool[i]) return 0; - if (1 == wd->aggQPool[i]->aggQEnabled) - { - tid_tx = wd->aggQPool[i]; - zmw_enter_critical_section(dev); - - head = tid_tx->aggHead; - tail = tid_tx->aggTail; - - arrivalTime = (u32_t)tid_tx->aggvtxq[tid_tx->aggTail].arrivalTime; - - - if((tick - arrivalTime) <= ZM_AGG_CLEAR_TIME) - { - - } - else if((tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail)) > 0) - { - - tid_tx->clearFlag = 1; - - //zm_msg1_agg(ZM_LV_0, "clear queue tick =", tick); - //zm_msg1_agg(ZM_LV_0, "clear queue arrival =", arrivalTime); - - - //zmw_leave_critical_section(dev); - //zfAggTxScheduler(dev); - //zmw_enter_critical_section(dev); - - } - - if (tid_tx->size == 0) - { - /* - * queue empty - */ - if (tick - tid_tx->lastArrival > ZM_AGG_DELETE_TIME) - { - zm_msg1_agg(ZM_LV_0, "delete queue, idle for n sec. n = ", \ - ZM_AGG_DELETE_TIME/10); - - zmw_leave_critical_section(dev); - zfAggTxDeleteQueue(dev, i); - zmw_enter_critical_section(dev); - } - } - - zmw_leave_critical_section(dev); - } - } - - zfAggRxClear(dev, time); - -#ifdef ZM_AGG_TALLY - if((wd->tick % 100) == 0) { - zfAggPrintTally(dev); - } -#endif - - return ZM_SUCCESS; -} - -u16_t zfAggPrintTally(zdev_t* dev) -{ - struct aggTally* agg_tal; - - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - agg_tal = &wd->agg_tal; - - if(agg_tal->got_packets_sum < 10) - { - zfAggTallyReset(dev); - return 0; - } - - agg_tal->time++; - agg_tal->avg_got_packets = (agg_tal->avg_got_packets * (agg_tal->time - 1) + - agg_tal->got_packets_sum) / agg_tal->time; - agg_tal->avg_got_bytes = (agg_tal->avg_got_bytes * (agg_tal->time - 1) + - agg_tal->got_bytes_sum) / agg_tal->time; - agg_tal->avg_sent_packets = (agg_tal->avg_sent_packets * (agg_tal->time - 1) - + agg_tal->sent_packets_sum) / agg_tal->time; - agg_tal->avg_sent_bytes = (agg_tal->avg_sent_bytes * (agg_tal->time - 1) + - agg_tal->sent_bytes_sum) / agg_tal->time; - zm_msg1_agg(ZM_LV_0, "got_packets_sum =", agg_tal->got_packets_sum); - zm_msg1_agg(ZM_LV_0, " got_bytes_sum =", agg_tal->got_bytes_sum); - zm_msg1_agg(ZM_LV_0, "sent_packets_sum=", agg_tal->sent_packets_sum); - zm_msg1_agg(ZM_LV_0, " sent_bytes_sum =", agg_tal->sent_bytes_sum); - agg_tal->got_packets_sum = agg_tal->got_bytes_sum =agg_tal->sent_packets_sum - = agg_tal->sent_bytes_sum = 0; - zm_msg1_agg(ZM_LV_0, "avg_got_packets =", agg_tal->avg_got_packets); - zm_msg1_agg(ZM_LV_0, " avg_got_bytes =", agg_tal->avg_got_bytes); - zm_msg1_agg(ZM_LV_0, "avg_sent_packets=", agg_tal->avg_sent_packets); - zm_msg1_agg(ZM_LV_0, " avg_sent_bytes =", agg_tal->avg_sent_bytes); - if ((wd->commTally.BA_Fail == 0) || (wd->commTally.Hw_Tx_MPDU == 0)) - { - zm_msg1_agg(ZM_LV_0, "Hardware Tx MPDU=", wd->commTally.Hw_Tx_MPDU); - zm_msg1_agg(ZM_LV_0, " BA Fail number=", wd->commTally.BA_Fail); - } - else - zm_msg1_agg(ZM_LV_0, "1/(BA fail rate)=", wd->commTally.Hw_Tx_MPDU/wd->commTally.BA_Fail); - - return 0; -} - -u16_t zfAggRxClear(zdev_t* dev, u32_t time) -{ - u16_t i; - struct agg_tid_rx *tid_rx; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - for (i=0; itid_rx[i]; - if (tid_rx->baw_head != tid_rx->baw_tail) - { - u16_t j = tid_rx->baw_tail; - while ((j != tid_rx->baw_head) && !tid_rx->frame[j].buf) { - j = (j + 1) & ZM_AGG_BAW_MASK; - } - if ((j != tid_rx->baw_head) && (time - tid_rx->frame[j].arrivalTime) > - (ZM_AGG_CLEAR_TIME - 5)) - { - zmw_leave_critical_section(dev); - zm_msg0_agg(ZM_LV_1, "queue RxFlush by RxClear"); - zfAggRxFlush(dev, 0, tid_rx); - zmw_enter_critical_section(dev); - } - } - zmw_leave_critical_section(dev); - } - - return ZM_SUCCESS; -} - -struct agg_tid_rx* zfAggRxEnabled(zdev_t* dev, zbuf_t* buf) -{ - u16_t dst0, src[3], aid; - u16_t offset = 0; - u16_t seq_no; - u16_t frameType; - u16_t frameCtrl; - u16_t frameSubtype; - //struct aggSta *agg_sta; -#if ZM_AGG_FPGA_REORDERING - struct agg_tid_rx *tid_rx; -#endif - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - seq_no = zmw_rx_buf_readh(dev, buf, 22) >> 4; - //DbgPrint("Rx seq=%d\n", seq_no); - if (wd->sta.EnableHT == 0) - { - return NULL; - } - - frameCtrl = zmw_rx_buf_readb(dev, buf, 0); - frameType = frameCtrl & 0xf; - frameSubtype = frameCtrl & 0xf0; - - - if (frameType != ZM_WLAN_DATA_FRAME) //non-Qos Data? (frameSubtype&0x80) - { - return NULL; - } -#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION - { - u32_t tcp_seq; - - tcp_seq = zmw_rx_buf_readb(dev, buf, 22+36) << 24; - tcp_seq += zmw_rx_buf_readb(dev, buf, 22+37) << 16; - tcp_seq += zmw_rx_buf_readb(dev, buf, 22+38) << 8; - tcp_seq += zmw_rx_buf_readb(dev, buf, 22+39); - ZM_SEQ_DEBUG("In %5d, %12u\n", seq_no, tcp_seq); - } -#endif - - dst0 = zmw_rx_buf_readh(dev, buf, offset+4); - - src[0] = zmw_rx_buf_readh(dev, buf, offset+10); - src[1] = zmw_rx_buf_readh(dev, buf, offset+12); - src[2] = zmw_rx_buf_readh(dev, buf, offset+14); - -#if ZM_AGG_FPGA_DEBUG - aid = 0; -#else - aid = zfApFindSta(dev, src); -#endif - - //agg_sta = &wd->aggSta[aid]; - //zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff); - //ac = zcUpToAc[up&0x7] & 0x3; - - /* - * Filter unicast frame only, aid == 0 is for debug only - */ - if ((dst0 & 0x1) == 0 && aid == 0) - { -#if ZM_AGG_FPGA_REORDERING - tid_rx = zfAggRxGetQueue(dev, buf) ; - if(!tid_rx) - return NULL; - else - { - //if (tid_rx->addBaExchangeStatusCode == ZM_AGG_ADDBA_RESPONSE) - return tid_rx; - } -#else - return NULL; -#endif - } - - return NULL; -} - -u16_t zfAggRx(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo *addInfo, struct agg_tid_rx *tid_rx) -{ - u16_t seq_no; - s16_t index; - u16_t offset = 0; - zbuf_t* pbuf; - u8_t frameSubType; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - ZM_BUFFER_TRACE(dev, buf) - - ZM_PERFORMANCE_RX_REORDER(dev); - - seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4; - - index = seq_no - tid_rx->seq_start; - /* - * for debug - */ - - /* zm_msg2_agg(ZM_LV_0, "queue seq = ", seq_no); - * DbgPrint("%s:%s%lxh %s%lxh\n", __func__, "queue seq=", seq_no, - * "; seq_start=", tid_rx->seq_start); - */ - - //DbgPrint("seq_no=%d, seq_start=%d\n", seq_no, tid_rx->seq_start); - - /* In some APs, we found that it might transmit NULL data whose sequence number - is out or order. In order to avoid this problem, we ignore these NULL data. - */ - - frameSubType = (zmw_rx_buf_readh(dev, buf, 0) & 0xF0) >> 4; - - /* If this is a NULL data instead of Qos NULL data */ - if ((frameSubType & 0x0C) == 0x04) - { - s16_t seq_diff; - - seq_diff = (seq_no > tid_rx->seq_start) ? - seq_no - tid_rx->seq_start : tid_rx->seq_start - seq_no; - - if (seq_diff > ZM_AGG_BAW_SIZE) - { - zm_debug_msg0("Free Rx NULL data in zfAggRx"); - - /* Free Rx buffer */ - zfwBufFree(dev, buf, 0); - return ZM_ERR_OUT_OF_ORDER_NULL_DATA; - } - } - - /* - * sequence number wrap at 4k - */ - if (tid_rx->seq_start > seq_no) - { - //index += 4096; - - zmw_enter_critical_section(dev); - if (tid_rx->seq_start >= 4096) { - tid_rx->seq_start = 0; - } - zmw_leave_critical_section(dev); - - } - - if (tid_rx->seq_start == seq_no) { - zmw_enter_critical_section(dev); - if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) > 0) { - //DbgPrint("head=%d, tail=%d", tid_rx->baw_head, tid_rx->baw_tail); - tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK; - } - tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1); - zmw_leave_critical_section(dev); - - ZM_PERFORMANCE_RX_SEQ(dev, buf); - - if (wd->zfcbRecv80211 != NULL) { - //seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4; - //DbgPrint("Recv indicate seq=%d\n", seq_no); - //DbgPrint("1. seq=%d\n", seq_no); - - wd->zfcbRecv80211(dev, buf, addInfo); - } - else { - zfiRecv80211(dev, buf, addInfo); - } - } - else if (!zfAggRxEnqueue(dev, buf, tid_rx, addInfo)) - { - /* - * duplicated packet - */ - return 1; - } - - while (tid_rx->baw_head != tid_rx->baw_tail) {// && tid_rx->frame[tid_rx->baw_tail].buf) - u16_t tailIndex; - - zmw_enter_critical_section(dev); - - tailIndex = tid_rx->baw_tail; - pbuf = tid_rx->frame[tailIndex].buf; - tid_rx->frame[tailIndex].buf = 0; - if (!pbuf) - { - zmw_leave_critical_section(dev); - break; - } - - tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK; - tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1); - - - //if(pbuf && tid_rx->baw_size > 0) - // tid_rx->baw_size--; - - zmw_leave_critical_section(dev); - - ZM_PERFORMANCE_RX_SEQ(dev, pbuf); - - if (wd->zfcbRecv80211 != NULL) - { - //seq_no = zmw_rx_buf_readh(dev, pbuf, offset+22) >> 4; - //DbgPrint("Recv indicate seq=%d\n", seq_no); - //DbgPrint("1. seq=%d\n", seq_no); - wd->zfcbRecv80211(dev, pbuf, addInfo); - } - else - { - //seq_no = zmw_rx_buf_readh(dev, pbuf, offset+22) >> 4; - //DbgPrint("Recv indicate seq=%d\n", seq_no); - zfiRecv80211(dev, pbuf, addInfo); - } - } - - return 1; -} - -struct agg_tid_rx *zfAggRxGetQueue(zdev_t* dev, zbuf_t* buf) -{ - u16_t src[3]; - u16_t aid, ac, i; - u16_t offset = 0; - struct agg_tid_rx *tid_rx = NULL; - - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - src[0] = zmw_rx_buf_readh(dev, buf, offset+10); - src[1] = zmw_rx_buf_readh(dev, buf, offset+12); - src[2] = zmw_rx_buf_readh(dev, buf, offset+14); - aid = zfApFindSta(dev, src); - - ac = (zmw_rx_buf_readh(dev, buf, 24) & 0xF); - - // mark by spin lock debug - //zmw_enter_critical_section(dev); - - for (i=0; itid_rx[i]->aid == aid) && (wd->tid_rx[i]->ac == ac)) - { - tid_rx = wd->tid_rx[i]; - break; - } - } - - // mark by spin lock debug - //zmw_leave_critical_section(dev); - return tid_rx; -} - - -u16_t zfAggRxEnqueue(zdev_t* dev, zbuf_t* buf, struct agg_tid_rx *tid_rx, struct zsAdditionInfo *addInfo) -{ - u16_t seq_no, offset = 0; - u16_t q_index; - s16_t index; - u8_t bdropframe = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - ZM_BUFFER_TRACE(dev, buf) - - seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4; - index = seq_no - tid_rx->seq_start; - - /* - * sequence number wrap at 4k - * -1000: check for duplicate past packet - */ - bdropframe = 0; - if (tid_rx->seq_start > seq_no) { - if ((tid_rx->seq_start > 3967) && (seq_no < 128)) { - index += 4096; - } else if (tid_rx->seq_start - seq_no > 70) { - zmw_enter_critical_section(dev); - tid_rx->sq_behind_count++; - if (tid_rx->sq_behind_count > 3) { - tid_rx->sq_behind_count = 0; - } else { - bdropframe = 1; - } - zmw_leave_critical_section(dev); - } else { - bdropframe = 1; - } - } else { - if (seq_no - tid_rx->seq_start > 70) { - zmw_enter_critical_section(dev); - tid_rx->sq_exceed_count++; - if (tid_rx->sq_exceed_count > 3) { - tid_rx->sq_exceed_count = 0; - } else { - bdropframe = 1; - } - zmw_leave_critical_section(dev); - } - } - - if (bdropframe == 1) { - /*if (wd->zfcbRecv80211 != NULL) { - wd->zfcbRecv80211(dev, buf, addInfo); - } - else { - zfiRecv80211(dev, buf, addInfo); - }*/ - - ZM_PERFORMANCE_FREE(dev, buf); - - zfwBufFree(dev, buf, 0); - /*zfAggRxFlush(dev, seq_no, tid_rx); - tid_rx->seq_start = seq_no; - index = seq_no - tid_rx->seq_start; - */ - - //DbgPrint("Free an old packet, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no); - - /* - * duplicate past packet - * happens only in simulated aggregation environment - */ - return 0; - } else { - zmw_enter_critical_section(dev); - if (tid_rx->sq_exceed_count > 0){ - tid_rx->sq_exceed_count--; - } - - if (tid_rx->sq_behind_count > 0) { - tid_rx->sq_behind_count--; - } - zmw_leave_critical_section(dev); - } - - if (index < 0) { - zfAggRxFlush(dev, seq_no, tid_rx); - tid_rx->seq_start = seq_no; - index = 0; - } - - //if (index >= (ZM_AGG_BAW_SIZE - 1)) - if (index >= (ZM_AGG_BAW_MASK)) - { - /* - * queue full - */ - //DbgPrint("index >= 64, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no); - zfAggRxFlush(dev, seq_no, tid_rx); - //tid_rx->seq_start = seq_no; - index = seq_no - tid_rx->seq_start; - if ((tid_rx->seq_start > seq_no) && (tid_rx->seq_start > 1000) && (tid_rx->seq_start - 1000) > seq_no) - { - //index = seq_no - tid_rx->seq_start; - index += 4096; - } - //index = seq_no - tid_rx->seq_start; - while (index >= (ZM_AGG_BAW_MASK)) { - //DbgPrint("index >= 64, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no); - tid_rx->seq_start = (tid_rx->seq_start + ZM_AGG_BAW_MASK) & (4096 - 1); - index = seq_no - tid_rx->seq_start; - if ((tid_rx->seq_start > seq_no) && (tid_rx->seq_start > 1000) && (tid_rx->seq_start - 1000) > seq_no) - { - index += 4096; - } - } - } - - - q_index = (tid_rx->baw_tail + index) & ZM_AGG_BAW_MASK; - if (tid_rx->frame[q_index].buf && (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) > - (((q_index) - tid_rx->baw_tail) & ZM_AGG_BAW_MASK))) - { - - ZM_PERFORMANCE_DUP(dev, tid_rx->frame[q_index].buf, buf); - zfwBufFree(dev, buf, 0); - //DbgPrint("Free a duplicate packet, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no); - //DbgPrint("head=%d, tail=%d", tid_rx->baw_head, tid_rx->baw_tail); - /* - * duplicate packet - */ - return 0; - } - - zmw_enter_critical_section(dev); - if(tid_rx->frame[q_index].buf) { - zfwBufFree(dev, tid_rx->frame[q_index].buf, 0); - tid_rx->frame[q_index].buf = 0; - } - - tid_rx->frame[q_index].buf = buf; - tid_rx->frame[q_index].arrivalTime = zm_agg_GetTime(); - zfwMemoryCopy((void*)&tid_rx->frame[q_index].addInfo, (void*)addInfo, sizeof(struct zsAdditionInfo)); - - /* - * for debug simulated aggregation only, - * should be done in rx of ADDBA Request - */ - //tid_rx->addInfo = addInfo; - - - if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) <= index) - { - //tid_rx->baw_size = index + 1; - if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) <= - //((q_index + 1) & ZM_AGG_BAW_MASK)) - (((q_index) - tid_rx->baw_tail) & ZM_AGG_BAW_MASK))//tid_rx->baw_size ) - tid_rx->baw_head = (q_index + 1) & ZM_AGG_BAW_MASK; - } - zmw_leave_critical_section(dev); - - /* - * success - */ - //DbgPrint("head=%d, tail=%d, start=%d", tid_rx->baw_head, tid_rx->baw_tail, tid_rx->seq_start); - return 1; -} - -u16_t zfAggRxFlush(zdev_t* dev, u16_t seq_no, struct agg_tid_rx *tid_rx) -{ - zbuf_t* pbuf; - u16_t seq; - struct zsAdditionInfo addInfo; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - ZM_PERFORMANCE_RX_FLUSH(dev); - - while (1) - { - zmw_enter_critical_section(dev); - if (tid_rx->baw_tail == tid_rx->baw_head) { - zmw_leave_critical_section(dev); - break; - } - - pbuf = tid_rx->frame[tid_rx->baw_tail].buf; - zfwMemoryCopy((void*)&addInfo, (void*)&tid_rx->frame[tid_rx->baw_tail].addInfo, sizeof(struct zsAdditionInfo)); - tid_rx->frame[tid_rx->baw_tail].buf = 0; - //if(pbuf && tid_rx->baw_size > 0) tid_rx->baw_size--; - tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK; - tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1); - zmw_leave_critical_section(dev); - - if (pbuf) - { - - ZM_PERFORMANCE_RX_SEQ(dev, pbuf); - - if (wd->zfcbRecv80211 != NULL) - { - seq = zmw_rx_buf_readh(dev, pbuf, 22) >> 4; - //DbgPrint("Recv indicate seq=%d\n", seq); - //DbgPrint("2. seq=%d\n", seq); - wd->zfcbRecv80211(dev, pbuf, &addInfo); - } - else - { - seq = zmw_rx_buf_readh(dev, pbuf, 22) >> 4; - //DbgPrint("Recv indicate seq=%d\n", seq); - zfiRecv80211(dev, pbuf, &addInfo); - } - } - } - - zmw_enter_critical_section(dev); - tid_rx->baw_head = tid_rx->baw_tail = 0; - zmw_leave_critical_section(dev); - return 1; -} - - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggRxFreeBuf */ -/* Frees all queued packets in buffer when the driver is down. */ -/* The zfFreeResource() will check if the buffer is all freed. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* ZM_SUCCESS */ -/* */ -/* AUTHOR */ -/* Honda Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfAggRxFreeBuf(zdev_t* dev, u16_t destroy) -{ - u16_t i; - zbuf_t* buf; - struct agg_tid_rx *tid_rx; - - TID_TX tid_tx; - //struct bufInfo *buf_info; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - for (i=0; itid_rx[i]; - - for(j=0; j <= ZM_AGG_BAW_SIZE; j++) - { - zmw_enter_critical_section(dev); - buf = tid_rx->frame[j].buf; - tid_rx->frame[j].buf = 0; - zmw_leave_critical_section(dev); - - if (buf) - { - zfwBufFree(dev, buf, 0); - } - } - - #if 0 - if ( tid_rx->baw_head != tid_rx->baw_tail ) - { - while (tid_rx->baw_head != tid_rx->baw_tail) - { - buf = tid_rx->frame[tid_rx->baw_tail].buf; - tid_rx->frame[tid_rx->baw_tail].buf = 0; - if (buf) - { - zfwBufFree(dev, buf, 0); - - zmw_enter_critical_section(dev); - tid_rx->frame[tid_rx->baw_tail].buf = 0; - zmw_leave_critical_section(dev); - } - zmw_enter_critical_section(dev); - //if (tid_rx->baw_size > 0)tid_rx->baw_size--; - tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK; - tid_rx->seq_start++; - zmw_leave_critical_section(dev); - } - } - #endif - - zmw_enter_critical_section(dev); - tid_rx->seq_start = 0; - tid_rx->baw_head = tid_rx->baw_tail = 0; - tid_rx->aid = ZM_MAX_STA_SUPPORT; - zmw_leave_critical_section(dev); - - #ifdef ZM_ENABLE_AGGREGATION - #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW - if (tid_baw->enabled) { - zm_msg1_agg(ZM_LV_0, "Device down, clear BAW queue:", i); - BAW->disable(dev, tid_baw); - } - #endif - #endif - if (1 == wd->aggQPool[i]->aggQEnabled) { - tid_tx = wd->aggQPool[i]; - buf = zfAggTxGetVtxq(dev, tid_tx); - while (buf) { - zfwBufFree(dev, buf, 0); - buf = zfAggTxGetVtxq(dev, tid_tx); - } - } - - if(destroy) { - zfwMemFree(dev, wd->aggQPool[i], sizeof(struct aggQueue)); - zfwMemFree(dev, wd->tid_rx[i], sizeof(struct agg_tid_rx)); - } - } - #ifdef ZM_ENABLE_AGGREGATION - #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW - if(destroy) zfwMemFree(dev, BAW, sizeof(struct baw_enabler)); - #endif - #endif - return ZM_SUCCESS; -} - - -void zfAggRecvBAR(zdev_t* dev, zbuf_t *buf) { - u16_t start_seq, len; - u8_t i, bitmap[8]; - len = zfwBufGetSize(dev, buf); - start_seq = zmw_rx_buf_readh(dev, buf, len-2); - DbgPrint("Received a BAR Control frame, start_seq=%d", start_seq>>4); - /* todo: set the bitmap by reordering buffer! */ - for (i=0; i<8; i++) bitmap[i]=0; - zfSendBA(dev, start_seq, bitmap); -} - -#ifdef ZM_ENABLE_AGGREGATION -#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW -void zfAggTxRetransmit(zdev_t* dev, struct bufInfo *buf_info, struct aggControl *aggControl, TID_TX tid_tx) { - u16_t removeLen; - u16_t err; - - zmw_get_wlan_dev(dev); - if (aggControl && (ZM_AGG_FIRST_MPDU == aggControl->ampduIndication) ) { - tid_tx->bar_ssn = buf_info->baw_header->header[15]; - aggControl->tid_baw->start_seq = tid_tx->bar_ssn >> 4; - zm_msg1_agg(ZM_LV_0, "start seq=", tid_tx->bar_ssn >> 4); - } - buf_info->baw_header->header[4] |= (1 << 11); - if (aggControl && aggControl->aggEnabled) { - //if (wd->enableAggregation==0 && !(buf_info->baw_header->header[6]&0x1)) - //{ - //if (((buf_info->baw_header->header[2] & 0x3) == 2)) - //{ - /* Enable aggregation */ - buf_info->baw_header->header[1] |= 0x20; - if (ZM_AGG_LAST_MPDU == aggControl->ampduIndication) { - buf_info->baw_header->header[1] |= 0x4000; - } - else { - buf_info->baw_header->header[1] &= ~0x4000; - //zm_debug_msg0("ZM_AGG_LAST_MPDU"); - } - //} - //else { - // zm_debug_msg1("no aggr, header[2]&0x3 = ",buf_info->baw_header->header[2] & 0x3) - // aggControl->aggEnabled = 0; - //} - //} - //else { - // zm_debug_msg1("no aggr, wd->enableAggregation = ", wd->enableAggregation); - // zm_debug_msg1("no aggr, !header[6]&0x1 = ",!(buf_info->baw_header->header[6]&0x1)); - // aggControl->aggEnabled = 0; - //} - } - - /*if (aggControl->tid_baw) { - struct baw_header_r header_r; - - header_r.header = buf_info->baw_header->header; - header_r.mic = buf_info->baw_header->mic; - header_r.snap = buf_info->baw_header->snap; - header_r.headerLen = buf_info->baw_header->headerLen; - header_r.micLen = buf_info->baw_header->micLen; - header_r.snapLen = buf_info->baw_header->snapLen; - header_r.removeLen = buf_info->baw_header->removeLen; - header_r.keyIdx = buf_info->baw_header->keyIdx; - - BAW->insert(dev, buf_info->buf, tid_tx->bar_ssn >> 4, aggControl->tid_baw, buf_info->baw_retransmit, &header_r); - }*/ - - err = zfHpSend(dev, - buf_info->baw_header->header, - buf_info->baw_header->headerLen, - buf_info->baw_header->snap, - buf_info->baw_header->snapLen, - buf_info->baw_header->mic, - buf_info->baw_header->micLen, - buf_info->buf, - buf_info->baw_header->removeLen, - ZM_EXTERNAL_ALLOC_BUF, - (u8_t)tid_tx->ac, - buf_info->baw_header->keyIdx); - if (err != ZM_SUCCESS) - { - goto zlError; - } - - return; - -zlError: - zfwBufFree(dev, buf_info->buf, 0); - return; - -} -#endif //disable BAW -#endif -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAggTxSendEth */ -/* Called to transmit Ethernet frame from upper elayer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer pointer */ -/* port : WLAN port, 0=>standard, 0x10-0x17=>VAP, 0x20-0x25=>WDS */ -/* */ -/* OUTPUTS */ -/* error code */ -/* */ -/* AUTHOR */ -/* Stephen, Honda Atheros Communications, Inc. 2006.12 */ -/* */ -/************************************************************************/ -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) -{ - u16_t err; - //u16_t addrTblSize; - //struct zsAddrTbl addrTbl; - u16_t removeLen; - u16_t header[(8+30+2+18)/2]; /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */ - u16_t headerLen; - u16_t mic[8/2]; - u16_t micLen; - u16_t snap[8/2]; - u16_t snapLen; - u16_t fragLen; - u16_t frameLen; - u16_t fragNum; - struct zsFrag frag; - u16_t i, id; - u16_t da[3]; - u16_t sa[3]; - u8_t up; - u8_t qosType, keyIdx = 0; - u16_t fragOff; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zm_msg1_tx(ZM_LV_2, "zfTxSendEth(), port=", port); - - /* Get IP TOS for QoS AC and IP frag offset */ - zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff); - -#ifdef ZM_ENABLE_NATIVE_WIFI - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - /* DA */ - da[0] = zmw_tx_buf_readh(dev, buf, 16); - da[1] = zmw_tx_buf_readh(dev, buf, 18); - da[2] = zmw_tx_buf_readh(dev, buf, 20); - /* SA */ - sa[0] = zmw_tx_buf_readh(dev, buf, 10); - sa[1] = zmw_tx_buf_readh(dev, buf, 12); - sa[2] = zmw_tx_buf_readh(dev, buf, 14); - } - else if ( wd->wlanMode == ZM_MODE_IBSS ) - { - /* DA */ - da[0] = zmw_tx_buf_readh(dev, buf, 4); - da[1] = zmw_tx_buf_readh(dev, buf, 6); - da[2] = zmw_tx_buf_readh(dev, buf, 8); - /* SA */ - sa[0] = zmw_tx_buf_readh(dev, buf, 10); - sa[1] = zmw_tx_buf_readh(dev, buf, 12); - sa[2] = zmw_tx_buf_readh(dev, buf, 14); - } - else if ( wd->wlanMode == ZM_MODE_AP ) - { - /* DA */ - da[0] = zmw_tx_buf_readh(dev, buf, 4); - da[1] = zmw_tx_buf_readh(dev, buf, 6); - da[2] = zmw_tx_buf_readh(dev, buf, 8); - /* SA */ - sa[0] = zmw_tx_buf_readh(dev, buf, 16); - sa[1] = zmw_tx_buf_readh(dev, buf, 18); - sa[2] = zmw_tx_buf_readh(dev, buf, 20); - } - else - { - // - } -#else - /* DA */ - da[0] = zmw_tx_buf_readh(dev, buf, 0); - da[1] = zmw_tx_buf_readh(dev, buf, 2); - da[2] = zmw_tx_buf_readh(dev, buf, 4); - /* SA */ - sa[0] = zmw_tx_buf_readh(dev, buf, 6); - sa[1] = zmw_tx_buf_readh(dev, buf, 8); - sa[2] = zmw_tx_buf_readh(dev, buf, 10); -#endif - //Decide Key Index in ATOM, No meaning in OTUS--CWYang(m) - if (wd->wlanMode == ZM_MODE_AP) - { - keyIdx = wd->ap.bcHalKeyIdx[port]; - id = zfApFindSta(dev, da); - if (id != 0xffff) - { - switch (wd->ap.staTable[id].encryMode) - { - case ZM_AES: - case ZM_TKIP: -#ifdef ZM_ENABLE_CENC - case ZM_CENC: -#endif //ZM_ENABLE_CENC - keyIdx = wd->ap.staTable[id].keyIdx; - break; - } - } - } - else - { - switch (wd->sta.encryMode) - { - case ZM_WEP64: - case ZM_WEP128: - case ZM_WEP256: - keyIdx = wd->sta.keyId; - break; - case ZM_AES: - case ZM_TKIP: - if ((da[0]& 0x1)) - keyIdx = 5; - else - keyIdx = 4; - break; -#ifdef ZM_ENABLE_CENC - case ZM_CENC: - keyIdx = wd->sta.cencKeyId; - break; -#endif //ZM_ENABLE_CENC - } - } - - /* Create SNAP */ - removeLen = zfTxGenWlanSnap(dev, buf, snap, &snapLen); - //zm_msg1_tx(ZM_LV_0, "fragOff=", fragOff); - - fragLen = wd->fragThreshold; - frameLen = zfwBufGetSize(dev, buf); - frameLen -= removeLen; - -#if 0 - /* Create MIC */ - if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&& - (wd->sta.encryMode == ZM_TKIP) ) - { - if ( frameLen > fragLen ) - { - micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic); - } - else - { - /* append MIC by HMAC */ - micLen = 8; - } - } - else - { - micLen = 0; - } -#else - if ( frameLen > fragLen ) - { - micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic); - } - else - { - /* append MIC by HMAC */ - micLen = 0; - } -#endif - - /* Access Category */ - if (wd->wlanMode == ZM_MODE_AP) - { - zfApGetStaQosType(dev, da, &qosType); - if (qosType == 0) - { - up = 0; - } - } - else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) - { - if (wd->sta.wmeConnected == 0) - { - up = 0; - } - } - else - { - /* TODO : STA QoS control field */ - up = 0; - } - - /* Assign sequence number */ - zmw_enter_critical_section(dev); - frag.seq[0] = ((wd->seq[zcUpToAc[up&0x7]]++) << 4); - if (aggControl && (ZM_AGG_FIRST_MPDU == aggControl->ampduIndication) ) { - tid_tx->bar_ssn = frag.seq[0]; - - zm_msg1_agg(ZM_LV_0, "start seq=", tid_tx->bar_ssn >> 4); - } - //tid_tx->baw_buf[tid_tx->baw_head-1].baw_seq=frag.seq[0]; - zmw_leave_critical_section(dev); - - - frag.buf[0] = buf; - frag.bufType[0] = bufType; - frag.flag[0] = flag; - fragNum = 1; - - for (i=0; i>1); i++) - { - zmw_tx_buf_writeh(dev, buf, i*2, header[i]); - } - - /* Get buffer DMA address */ - //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0) - //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0) - //{ - // goto zlError; - //} - - //zm_msg2_mm(ZM_LV_2, "offset=", offset); - //zm_msg2_mm(ZM_LV_2, "hlen=", hlen); - //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize); - //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]); - //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]); - //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data); - - #if 0 - err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0, - ZM_INTERNAL_ALLOC_BUF, 0, 0xff); - if (err != ZM_SUCCESS) - { - goto zlError; - } - #else - zfPutVmmq(dev, buf); - zfPushVtxq(dev); - #endif - - return ZM_SUCCESS; - -} - -u16_t zfAggSetAddbaFrameBody(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t ac, u16_t up) -{ - u16_t ba_parameter, start_seq; - - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - /* - * ADDBA Request frame body - */ - - /* - * Category - */ - zmw_tx_buf_writeb(dev, buf, offset++, 3); - /* - * Action details = 0 - */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_ADDBA_REQUEST_FRAME); - /* - * Dialog Token = nonzero - * TBD: define how to get dialog token? - */ - zmw_tx_buf_writeb(dev, buf, offset++, 2); - /* - * Block Ack parameter set - * BA policy = 1 for immediate BA, 0 for delayed BA - * TID(4bits) & buffer size(4bits) (TID=up & buffer size=0x80) - * TBD: how to get buffer size? - * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{ - * ¢x B0 ¢x B1 ¢x B2 B5 ¢x B6 B15 ¢x - * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t - * ¢x Reserved ¢x BA policy ¢x TID ¢x Buffer size ¢x - * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢} - */ - ba_parameter = 1 << 12; // buffer size = 0x40(64) - ba_parameter |= up << 2; // tid = up - ba_parameter |= 2; // ba policy = 1 - zmw_tx_buf_writeh(dev, buf, offset, ba_parameter); - offset+=2; - /* - * BA timeout value - */ - zmw_tx_buf_writeh(dev, buf, offset, 0); - offset+=2; - /* - * BA starting sequence number - * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{ - * ¢x B0 B3 ¢x B4 B15 ¢x - * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t - * ¢x Frag num(0) ¢x BA starting seq num ¢x - * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢} - */ - start_seq = ((wd->seq[ac]) << 4) & 0xFFF0; - zmw_tx_buf_writeh(dev, buf, offset, start_seq); - offset+=2; - - return offset; -} - -u16_t zfAggGenAddbaHeader(zdev_t* dev, u16_t* dst, - u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt) -{ - u8_t hlen = 32; // MAC ctrl + PHY ctrl + 802.11 MM header - //u8_t frameType = ZM_WLAN_FRAME_TYPE_ACTION; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - /* - * Generate control setting - */ - //bodyLen = zfwBufGetSize(dev, buf); - header[0] = 24+len+4; //Length - header[1] = 0x8; //MAC control, backoff + (ack) - -#if 0 - /* CCK 1M */ - header[2] = 0x0f00; //PHY control L - header[3] = 0x0000; //PHY control H -#else - /* OFDM 6M */ - header[2] = 0x0f01; //PHY control L - header[3] = 0x000B; //PHY control H -#endif - - /* - * Generate WLAN header - * Frame control frame type and subtype - */ - header[4+0] = ZM_WLAN_FRAME_TYPE_ACTION; - /* - * Duration - */ - header[4+1] = 0; - - if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) - { - header[4+8] = wd->sta.bssid[0]; - header[4+9] = wd->sta.bssid[1]; - header[4+10] = wd->sta.bssid[2]; - } - else if (wd->wlanMode == ZM_MODE_PSEUDO) - { - /* Address 3 = 00:00:00:00:00:00 */ - header[4+8] = 0; - header[4+9] = 0; - header[4+10] = 0; - } - else if (wd->wlanMode == ZM_MODE_IBSS) - { - header[4+8] = wd->sta.bssid[0]; - header[4+9] = wd->sta.bssid[1]; - header[4+10] = wd->sta.bssid[2]; - } - else if (wd->wlanMode == ZM_MODE_AP) - { - /* Address 3 = BSSID */ - header[4+8] = wd->macAddr[0]; - header[4+9] = wd->macAddr[1]; - header[4+10] = wd->macAddr[2] + (vap<<8); - } - - /* Address 1 = DA */ - header[4+2] = dst[0]; - header[4+3] = dst[1]; - header[4+4] = dst[2]; - - /* Address 2 = SA */ - header[4+5] = wd->macAddr[0]; - header[4+6] = wd->macAddr[1]; - if (wd->wlanMode == ZM_MODE_AP) - { - header[4+7] = wd->macAddr[2] + (vap<<8); - } - else - { - header[4+7] = wd->macAddr[2]; - } - - /* Sequence Control */ - zmw_enter_critical_section(dev); - header[4+11] = ((wd->mmseq++)<<4); - zmw_leave_critical_section(dev); - - - return hlen; -} - - -u16_t zfAggProcessAction(zdev_t* dev, zbuf_t* buf) -{ - u16_t category; - - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - category = zmw_rx_buf_readb(dev, buf, 24); - - switch (category) - { - case ZM_WLAN_BLOCK_ACK_ACTION_FRAME: - zfAggBlockAckActionFrame(dev, buf); - break; - - } - - return ZM_SUCCESS; -} - - -u16_t zfAggBlockAckActionFrame(zdev_t* dev, zbuf_t* buf) -{ - u8_t action; - - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - action = zmw_rx_buf_readb(dev, buf, 25); -#ifdef ZM_ENABLE_AGGREGATION - switch (action) - { - case ZM_WLAN_ADDBA_REQUEST_FRAME: - zm_msg0_agg(ZM_LV_0, "Received BA Action frame is ADDBA request"); - zfAggRecvAddbaRequest(dev, buf); - break; - case ZM_WLAN_ADDBA_RESPONSE_FRAME: - zm_msg0_agg(ZM_LV_0, "Received BA Action frame is ADDBA response"); - zfAggRecvAddbaResponse(dev, buf); - break; - case ZM_WLAN_DELBA_FRAME: - zfAggRecvDelba(dev, buf); - break; - } -#endif - return ZM_SUCCESS; -} - -u16_t zfAggRecvAddbaRequest(zdev_t* dev, zbuf_t* buf) -{ - //u16_t dialog; - struct aggBaFrameParameter bf; - u16_t i; - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - bf.buf = buf; - bf.dialog = zmw_rx_buf_readb(dev, buf, 26); - /* - * ba parameter set - */ - bf.ba_parameter = zmw_rx_buf_readh(dev, buf, 27); - bf.ba_policy = (bf.ba_parameter >> 1) & 1; - bf.tid = (bf.ba_parameter >> 2) & 0xF; - bf.buffer_size = (bf.ba_parameter >> 6); - /* - * BA timeout value - */ - bf.ba_timeout = zmw_rx_buf_readh(dev, buf, 29); - /* - * BA starting sequence number - */ - bf.ba_start_seq = zmw_rx_buf_readh(dev, buf, 31) >> 4; - - i=26; - while(i < 32) { - zm_debug_msg2("Recv ADDBA Req:", zmw_rx_buf_readb(dev,buf,i)); - i++; - } - - zfAggSendAddbaResponse(dev, &bf); - - zfAggAddbaSetTidRx(dev, buf, &bf); - - return ZM_SUCCESS; -} - -u16_t zfAggAddbaSetTidRx(zdev_t* dev, zbuf_t* buf, struct aggBaFrameParameter *bf) -{ - u16_t i, ac, aid, fragOff; - u16_t src[3]; - u16_t offset = 0; - u8_t up; - struct agg_tid_rx *tid_rx = NULL; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - src[0] = zmw_rx_buf_readh(dev, buf, offset+10); - src[1] = zmw_rx_buf_readh(dev, buf, offset+12); - src[2] = zmw_rx_buf_readh(dev, buf, offset+14); - aid = zfApFindSta(dev, src); - - zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff); - ac = zcUpToAc[up&0x7] & 0x3; - - ac = bf->tid; - - for (i=0; itid_rx[i]->aid == aid) && (wd->tid_rx[i]->ac == ac)) - { - tid_rx = wd->tid_rx[i]; - break; - } - } - - if (!tid_rx) - { - for (i=0; itid_rx[i]->aid == ZM_MAX_STA_SUPPORT) - { - tid_rx = wd->tid_rx[i]; - break; - } - } - if (!tid_rx) - return 0; - } - - zmw_enter_critical_section(dev); - - tid_rx->aid = aid; - tid_rx->ac = ac; - tid_rx->addBaExchangeStatusCode = ZM_AGG_ADDBA_RESPONSE; - tid_rx->seq_start = bf->ba_start_seq; - tid_rx->baw_head = tid_rx->baw_tail = 0; - tid_rx->sq_exceed_count = tid_rx->sq_behind_count = 0; - zmw_leave_critical_section(dev); - - return 0; -} - -u16_t zfAggRecvAddbaResponse(zdev_t* dev, zbuf_t* buf) -{ - u16_t i,ac, aid=0; - u16_t src[3]; - struct aggBaFrameParameter bf; - - zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - src[0] = zmw_rx_buf_readh(dev, buf, 10); - src[1] = zmw_rx_buf_readh(dev, buf, 12); - src[2] = zmw_rx_buf_readh(dev, buf, 14); - - if (wd->wlanMode == ZM_MODE_AP) - aid = zfApFindSta(dev, src); - - - bf.buf = buf; - bf.dialog = zmw_rx_buf_readb(dev, buf, 26); - bf.status_code = zmw_rx_buf_readh(dev, buf, 27); - if (!bf.status_code) - { - wd->addbaComplete=1; - } - - /* - * ba parameter set - */ - bf.ba_parameter = zmw_rx_buf_readh(dev, buf, 29); - bf.ba_policy = (bf.ba_parameter >> 1) & 1; - bf.tid = (bf.ba_parameter >> 2) & 0xF; - bf.buffer_size = (bf.ba_parameter >> 6); - /* - * BA timeout value - */ - bf.ba_timeout = zmw_rx_buf_readh(dev, buf, 31); - - i=26; - while(i < 32) { - zm_debug_msg2("Recv ADDBA Rsp:", zmw_rx_buf_readb(dev,buf,i)); - i++; - } - - ac = zcUpToAc[bf.tid&0x7] & 0x3; - - //zmw_enter_critical_section(dev); - - //wd->aggSta[aid].aggFlag[ac] = 0; - - //zmw_leave_critical_section(dev); - - return ZM_SUCCESS; -} - -u16_t zfAggRecvDelba(zdev_t* dev, zbuf_t* buf) -{ - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - return ZM_SUCCESS; -} - -u16_t zfAggSendAddbaResponse(zdev_t* dev, struct aggBaFrameParameter *bf) -{ - zbuf_t* buf; - //u16_t addrTblSize; - //struct zsAddrTbl addrTbl; - //u16_t err; - u16_t offset = 0; - u16_t hlen = 32; - u16_t header[(24+25+1)/2]; - u16_t vap = 0; - u16_t i; - u8_t encrypt = 0; - u16_t dst[3]; - - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - - /* - * TBD : Maximum size of management frame - */ - buf = zfwBufAllocate(dev, 1024); - if (buf == NULL) - { - zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!"); - return ZM_SUCCESS; - } - - /* - * Reserve room for wlan header - */ - offset = hlen; - - /* - * add addba frame body - */ - offset = zfAggSetAddbaResponseFrameBody(dev, buf, bf, offset); - - - zfwBufSetSize(dev, buf, offset); - - /* - * Copy wlan header - */ - - dst[0] = zmw_rx_buf_readh(dev, bf->buf, 10); - dst[1] = zmw_rx_buf_readh(dev, bf->buf, 12); - dst[2] = zmw_rx_buf_readh(dev, bf->buf, 14); - zfAggGenAddbaHeader(dev, dst, header, offset-hlen, buf, vap, encrypt); - for (i=0; i<(hlen>>1); i++) - { - zmw_tx_buf_writeh(dev, buf, i*2, header[i]); - } - - /* Get buffer DMA address */ - //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0) - //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0) - //{ - // goto zlError; - //} - - //zm_msg2_mm(ZM_LV_2, "offset=", offset); - //zm_msg2_mm(ZM_LV_2, "hlen=", hlen); - //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize); - //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]); - //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]); - //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data); - - #if 0 - err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0, - ZM_INTERNAL_ALLOC_BUF, 0, 0xff); - if (err != ZM_SUCCESS) - { - goto zlError; - } - #else - zfPutVmmq(dev, buf); - zfPushVtxq(dev); - #endif - - //zfAggSendAddbaRequest(dev, dst, zcUpToAc[bf->tid&0x7] & 0x3, bf->tid); - return ZM_SUCCESS; - -} - -u16_t zfAggSetAddbaResponseFrameBody(zdev_t* dev, zbuf_t* buf, - struct aggBaFrameParameter *bf, u16_t offset) -{ - - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - /* - * ADDBA Request frame body - */ - - /* - * Category - */ - zmw_tx_buf_writeb(dev, buf, offset++, 3); - /* - * Action details = 0 - */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_ADDBA_RESPONSE_FRAME); - /* - * Dialog Token = nonzero - */ - zmw_tx_buf_writeb(dev, buf, offset++, bf->dialog); - /* - * Status code - */ - zmw_tx_buf_writeh(dev, buf, offset, 0); - offset+=2; - /* - * Block Ack parameter set - * BA policy = 1 for immediate BA, 0 for delayed BA - * TID(4bits) & buffer size(4bits) (TID=0x1 & buffer size=0x80) - * TBD: how to get TID number and buffer size? - * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{ - * ¢x B0 ¢x B1 ¢x B2 B5 ¢x B6 B15 ¢x - * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t - * ¢x Reserved ¢x BA policy ¢x TID ¢x Buffer size ¢x - * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢} - */ - zmw_tx_buf_writeh(dev, buf, offset, bf->ba_parameter); - offset+=2; - /* - * BA timeout value - */ - zmw_tx_buf_writeh(dev, buf, offset, bf->ba_timeout); - offset+=2; - - return offset; -} - -void zfAggInvokeBar(zdev_t* dev, TID_TX tid_tx) -{ - struct aggBarControl aggBarControl; - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - //bar_control = aggBarControl->tid_info << 12 | aggBarControl->compressed_bitmap << 2 - // | aggBarControl->multi_tid << 1 | aggBarControl->bar_ack_policy; - aggBarControl.bar_ack_policy = 0; - aggBarControl.multi_tid = 0; - aggBarControl.compressed_bitmap = 0; - aggBarControl.tid_info = tid_tx->tid; - zfAggSendBar(dev, tid_tx, &aggBarControl); - - return; - -} -/* - * zfAggSendBar() refers zfAggSendAddbaRequest() - */ -u16_t zfAggSendBar(zdev_t* dev, TID_TX tid_tx, struct aggBarControl *aggBarControl) -{ - zbuf_t* buf; - //u16_t addrTblSize; - //struct zsAddrTbl addrTbl; - //u16_t err; - u16_t offset = 0; - u16_t hlen = 16+8; /* mac header + control headers*/ - u16_t header[(8+24+1)/2]; - u16_t vap = 0; - u16_t i; - u8_t encrypt = 0; - - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - - /* - * TBD : Maximum size of management frame - */ - buf = zfwBufAllocate(dev, 1024); - if (buf == NULL) - { - zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!"); - return ZM_SUCCESS; - } - - /* - * Reserve room for wlan header - */ - offset = hlen; - - /* - * add addba frame body - */ - offset = zfAggSetBarBody(dev, buf, offset, tid_tx, aggBarControl); - - - zfwBufSetSize(dev, buf, offset); - - /* - * Copy wlan header - */ - zfAggGenBarHeader(dev, tid_tx->dst, header, offset-hlen, buf, vap, encrypt); - for (i=0; i<(hlen>>1); i++) - { - zmw_tx_buf_writeh(dev, buf, i*2, header[i]); - } - - /* Get buffer DMA address */ - //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0) - //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0) - //{ - // goto zlError; - //} - - //zm_msg2_mm(ZM_LV_2, "offset=", offset); - //zm_msg2_mm(ZM_LV_2, "hlen=", hlen); - //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize); - //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]); - //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]); - //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data); - - #if 0 - err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0, - ZM_INTERNAL_ALLOC_BUF, 0, 0xff); - if (err != ZM_SUCCESS) - { - goto zlError; - } - #else - zfPutVmmq(dev, buf); - zfPushVtxq(dev); - #endif - - return ZM_SUCCESS; - -} - -u16_t zfAggSetBarBody(zdev_t* dev, zbuf_t* buf, u16_t offset, TID_TX tid_tx, struct aggBarControl *aggBarControl) -{ - u16_t bar_control, start_seq; - - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - /* - * BAR Control frame body - */ - - /* - * BAR Control Field - * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{ - * ¢x B0 ¢x B1 ¢x B2 ¢x B3 B11 ¢x B12 B15 ¢x - * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t - * ¢x BAR Ack ¢x Multi-TID ¢x Compressed ¢x Reserved ¢x TID_INFO ¢x - * ¢x Policy ¢x ¢x Bitmap ¢x ¢x ¢x - * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢} - */ - bar_control = aggBarControl->tid_info << 12 | aggBarControl->compressed_bitmap << 2 - | aggBarControl->multi_tid << 1 | aggBarControl->bar_ack_policy; - - zmw_tx_buf_writeh(dev, buf, offset, bar_control); - offset+=2; - if (0 == aggBarControl->multi_tid) { - /* - * BA starting sequence number - * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{ - * ¢x B0 B3 ¢x B4 B15 ¢x - * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t - * ¢x Frag num(0) ¢x BA starting seq num ¢x - * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢} - */ - start_seq = (tid_tx->bar_ssn << 4) & 0xFFF0; - zmw_tx_buf_writeh(dev, buf, offset, start_seq); - offset+=2; - } - if (1 == aggBarControl->multi_tid && 1 == aggBarControl->compressed_bitmap) { - /* multi-tid BlockAckReq variant, not implemented*/ - } - - return offset; -} - -u16_t zfAggGenBarHeader(zdev_t* dev, u16_t* dst, - u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt) -{ - u8_t hlen = 16+8; // MAC ctrl + PHY ctrl + 802.11 MM header - //u8_t frameType = ZM_WLAN_FRAME_TYPE_ACTION; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - /* - * Generate control setting - */ - //bodyLen = zfwBufGetSize(dev, buf); - header[0] = 16+len+4; //Length - header[1] = 0x8; //MAC control, backoff + (ack) - -#if 1 - /* CCK 1M */ - header[2] = 0x0f00; //PHY control L - header[3] = 0x0000; //PHY control H -#else - /* CCK 6M */ - header[2] = 0x0f01; //PHY control L - header[3] = 0x000B; //PHY control H - -#endif - /* - * Generate WLAN header - * Frame control frame type and subtype - */ - header[4+0] = ZM_WLAN_FRAME_TYPE_BAR; - /* - * Duration - */ - header[4+1] = 0; - - /* Address 1 = DA */ - header[4+2] = dst[0]; - header[4+3] = dst[1]; - header[4+4] = dst[2]; - - /* Address 2 = SA */ - header[4+5] = wd->macAddr[0]; - header[4+6] = wd->macAddr[1]; - if (wd->wlanMode == ZM_MODE_AP) - { -#ifdef ZM_VAPMODE_MULTILE_SSID - header[4+7] = wd->macAddr[2]; //Multiple SSID -#else - header[4+7] = wd->macAddr[2] + (vap<<8); //VAP -#endif - } - else - { - header[4+7] = wd->macAddr[2]; - } - - /* Sequence Control */ - zmw_enter_critical_section(dev); - header[4+11] = ((wd->mmseq++)<<4); - zmw_leave_critical_section(dev); - - - return hlen; -} diff --git a/drivers/staging/otus/80211core/cagg.h b/drivers/staging/otus/80211core/cagg.h deleted file mode 100644 index 1d87a564162b..000000000000 --- a/drivers/staging/otus/80211core/cagg.h +++ /dev/null @@ -1,435 +0,0 @@ -/* - * 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 */ - diff --git a/drivers/staging/otus/80211core/ccmd.c b/drivers/staging/otus/80211core/ccmd.c deleted file mode 100644 index ab300df02014..000000000000 --- a/drivers/staging/otus/80211core/ccmd.c +++ /dev/null @@ -1,1766 +0,0 @@ -/* - * 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 : cmd.c */ -/* */ -/* Abstract */ -/* This module contains command interface functions. */ -/* */ -/* NOTES */ -/* None */ -/* */ -/************************************************************************/ -#include "cprecomp.h" -#include "../hal/hpreg.h" - - -u16_t zfWlanReset(zdev_t *dev); -u32_t zfUpdateRxRate(zdev_t *dev); - - -extern void zfiUsbRecv(zdev_t *dev, zbuf_t *buf); -extern void zfiUsbRegIn(zdev_t *dev, u32_t *rsp, u16_t rspLen); -extern void zfiUsbOutComplete(zdev_t *dev, zbuf_t *buf, u8_t status, u8_t *hdr); -extern void zfiUsbRegOutComplete(zdev_t *dev); -extern u16_t zfHpReinit(zdev_t *dev, u32_t frequency); - -/* Get size (byte) of driver core global data structure. */ -/* This size will be used by driver wrapper to allocate */ -/* a memory space for driver core to store global variables */ -u16_t zfiGlobalDataSize(zdev_t *dev) -{ - u32_t ret; - ret = (sizeof(struct zsWlanDev)); - zm_assert((ret>>16) == 0); - return (u16_t)ret; -} - - -/* 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) -{ - /* u16_t ret; - u32_t i; - u8_t* ch; - u8_t bPassive; - */ - u32_t devSize; - struct zfCbUsbFuncTbl cbUsbFuncTbl; - zmw_get_wlan_dev(dev); - - zm_debug_msg0("start"); - - devSize = sizeof(struct zsWlanDev); - /* Zeroize zsWlanDev struct */ - zfZeroMemory((u8_t *)wd, (u16_t)devSize); - -#ifdef ZM_ENABLE_AGGREGATION - zfAggInit(dev); -#endif - - zfCwmInit(dev); - - wd->commTally.RateCtrlTxMPDU = 0; - wd->commTally.RateCtrlBAFail = 0; - wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT; - - if (cbFuncTbl == NULL) { - /* zfcbRecvEth() is mandatory */ - zm_assert(0); - } else { - if (cbFuncTbl->zfcbRecvEth == NULL) { - /* zfcbRecvEth() is mandatory */ - zm_assert(0); - } - wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify; - wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify; - wd->zfcbAsocNotify = cbFuncTbl->zfcbAsocNotify; - wd->zfcbDisAsocNotify = cbFuncTbl->zfcbDisAsocNotify; - wd->zfcbApConnectNotify = cbFuncTbl->zfcbApConnectNotify; - wd->zfcbConnectNotify = cbFuncTbl->zfcbConnectNotify; - wd->zfcbScanNotify = cbFuncTbl->zfcbScanNotify; - wd->zfcbMicFailureNotify = cbFuncTbl->zfcbMicFailureNotify; - wd->zfcbApMicFailureNotify = cbFuncTbl->zfcbApMicFailureNotify; - wd->zfcbIbssPartnerNotify = cbFuncTbl->zfcbIbssPartnerNotify; - wd->zfcbMacAddressNotify = cbFuncTbl->zfcbMacAddressNotify; - wd->zfcbSendCompleteIndication = - cbFuncTbl->zfcbSendCompleteIndication; - wd->zfcbRecvEth = cbFuncTbl->zfcbRecvEth; - wd->zfcbRestoreBufData = cbFuncTbl->zfcbRestoreBufData; - wd->zfcbRecv80211 = cbFuncTbl->zfcbRecv80211; -#ifdef ZM_ENABLE_CENC - wd->zfcbCencAsocNotify = cbFuncTbl->zfcbCencAsocNotify; -#endif /* ZM_ENABLE_CENC */ - wd->zfcbClassifyTxPacket = cbFuncTbl->zfcbClassifyTxPacket; - wd->zfcbHwWatchDogNotify = cbFuncTbl->zfcbHwWatchDogNotify; - } - - /* add by honda 0330 */ - cbUsbFuncTbl.zfcbUsbRecv = zfiUsbRecv; - cbUsbFuncTbl.zfcbUsbRegIn = zfiUsbRegIn; - cbUsbFuncTbl.zfcbUsbOutComplete = zfiUsbOutComplete; - cbUsbFuncTbl.zfcbUsbRegOutComplete = zfiUsbRegOutComplete; - zfwUsbRegisterCallBack(dev, &cbUsbFuncTbl); - /* Init OWN MAC address */ - wd->macAddr[0] = 0x8000; - wd->macAddr[1] = 0x0000; - wd->macAddr[2] = 0x0000; - - wd->regulationTable.regionCode = 0xffff; - - zfHpInit(dev, wd->frequency); - - /* init region code */ - /* wd->regulationTable.regionCode = NULL1_WORLD; //Only 2.4g RegCode */ - /* zfHpGetRegulationTablefromRegionCode(dev, NULL1_WORLD); */ - /* zfiWlanSetDot11DMode(dev , 1); //Enable 802.11d */ - /* Get the first channel */ - /* wd->frequency = zfChGetFirstChannel(dev, &bPassive); */ -#ifdef ZM_AP_DEBUG - /* wd->frequency = 2437; */ -#endif - - /* STA mode */ - wd->sta.mTxRate = 0x0; - wd->sta.uTxRate = 0x3; - wd->sta.mmTxRate = 0x0; - wd->sta.adapterState = ZM_STA_STATE_DISCONNECT; - wd->sta.capability[0] = 0x01; - wd->sta.capability[1] = 0x00; - - wd->sta.preambleTypeHT = 0; - wd->sta.htCtrlBandwidth = 0; - wd->sta.htCtrlSTBC = 0; - wd->sta.htCtrlSG = 0; - wd->sta.defaultTA = 0; - /*wd->sta.activescanTickPerChannel = - *ZM_TIME_ACTIVE_SCAN/ZM_MS_PER_TICK; - */ - { - u8_t Dur = ZM_TIME_ACTIVE_SCAN; - zfwGetActiveScanDur(dev, &Dur); - wd->sta.activescanTickPerChannel = Dur / ZM_MS_PER_TICK; - - } - wd->sta.passiveScanTickPerChannel = ZM_TIME_PASSIVE_SCAN/ZM_MS_PER_TICK; - wd->sta.bAutoReconnect = TRUE; - wd->sta.dropUnencryptedPkts = FALSE; - - /* set default to bypass all multicast packet for linux, - * window XP would set 0 by wrapper initialization - */ - wd->sta.bAllMulticast = 1; - - /* Initial the RIFS Status / RIFS-like frame count / RIFS count */ - wd->sta.rifsState = ZM_RIFS_STATE_DETECTING; - wd->sta.rifsLikeFrameCnt = 0; - wd->sta.rifsCount = 0; - - wd->sta.osRxFilter = 0; - wd->sta.bSafeMode = 0; - - /* Common */ - zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT); - wd->beaconInterval = 100; - wd->rtsThreshold = 2346; - wd->fragThreshold = 32767; - wd->wlanMode = ZM_MODE_INFRASTRUCTURE; - wd->txMCS = 0xff; /* AUTO */ - wd->dtim = 1; - /* wd->txMT = 1; *//*OFDM */ - wd->tick = 1; - wd->maxTxPower2 = 0xff; - wd->maxTxPower5 = 0xff; - wd->supportMode = 0xffffffff; - wd->ws.adhocMode = ZM_ADHOCBAND_G; - wd->ws.autoSetFrequency = 0xff; - - /* AP mode */ - /* wd->bgMode = wd->ws.bgMode; */ - wd->ap.ssidLen[0] = 6; - wd->ap.ssid[0][0] = 'Z'; - wd->ap.ssid[0][1] = 'D'; - wd->ap.ssid[0][2] = '1'; - wd->ap.ssid[0][3] = '2'; - wd->ap.ssid[0][4] = '2'; - wd->ap.ssid[0][5] = '1'; - - /* Init the country iso name as NA */ - wd->ws.countryIsoName[0] = 0; - wd->ws.countryIsoName[1] = 0; - wd->ws.countryIsoName[2] = '\0'; - - /* init fragmentation is disabled */ - /* zfiWlanSetFragThreshold(dev, 0); */ - - /* airopeek : swSniffer 1=>on 0=>off */ - wd->swSniffer = 0; - wd->XLinkMode = 0; - - /* jhlee HT 0 */ -#if 1 - /* AP Mode*/ - /* Init HT Capability Info */ - wd->ap.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY; - wd->ap.HTCap.Data.Length = 26; - /*wd->ap.HTCap.Data.SupChannelWidthSet = 0; - wd->ap.HTCap.Data.MIMOPowerSave = 3; - wd->ap.HTCap.Data.ShortGIfor40MHz = 0; - wd->ap.HTCap.Data.ShortGIfor20MHz = 0; - wd->ap.HTCap.Data.DSSSandCCKin40MHz = 0; - */ - wd->ap.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3; - wd->ap.HTCap.Data.MCSSet[0] = 0xFF; /* MCS 0 ~ 7 */ - wd->ap.HTCap.Data.MCSSet[1] = 0xFF; /* MCS 8 ~ 15 */ - - /* Init Extended HT Capability Info */ - wd->ap.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY; - wd->ap.ExtHTCap.Data.Length = 22; - wd->ap.ExtHTCap.Data.ControlChannel = 6; - /* wd->ap.ExtHTCap.Data.ExtChannelOffset = 3; */ - wd->ap.ExtHTCap.Data.ChannelInfo |= ExtHtCap_RecomTxWidthSet; - /* wd->ap.ExtHTCap.Data.RIFSMode = 1; */ - wd->ap.ExtHTCap.Data.OperatingInfo |= 1; - - /* STA Mode*/ - /* Init HT Capability Info */ - wd->sta.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY; - wd->sta.HTCap.Data.Length = 26; - - /* Test with 5G-AP : 7603 */ - /* wd->sta.HTCap.Data.SupChannelWidthSet = 1; */ - wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SMEnabled; - wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet; - wd->sta.HTCap.Data.HtCapInfo |= HTCAP_ShortGIfor40MHz; - wd->sta.HTCap.Data.HtCapInfo |= HTCAP_DSSSandCCKin40MHz; -#ifndef ZM_DISABLE_AMSDU8K_SUPPORT - wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength; -#endif - /*wd->sta.HTCap.Data.MIMOPowerSave = 0; - wd->sta.HTCap.Data.ShortGIfor40MHz = 0; - wd->sta.HTCap.Data.ShortGIfor20MHz = 0; - wd->sta.HTCap.Data.DSSSandCCKin40MHz = 0; - */ - wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3; - wd->sta.HTCap.Data.MCSSet[0] = 0xFF; /* MCS 0 ~ 7 */ - wd->sta.HTCap.Data.MCSSet[1] = 0xFF; /* MCS 8 ~ 15 */ - wd->sta.HTCap.Data.PCO |= HTCAP_TransmissionTime3; - /* wd->sta.HTCap.Data.TransmissionTime = 0; */ - /* Init Extended HT Capability Info */ - wd->sta.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY; - wd->sta.ExtHTCap.Data.Length = 22; - wd->sta.ExtHTCap.Data.ControlChannel = 6; - - /* wd->sta.ExtHTCap.Data.ExtChannelOffset |= 3; */ - wd->sta.ExtHTCap.Data.ChannelInfo |= ExtHtCap_ExtChannelOffsetBelow; - - /* wd->sta.ExtHTCap.Data.RecomTxWidthSet = 1; */ - /* wd->sta.ExtHTCap.Data.RIFSMode = 1; */ - wd->sta.ExtHTCap.Data.OperatingInfo |= 1; -#endif - -#if 0 - /* WME test code */ - wd->ap.qosMode[0] = 1; -#endif - - wd->ledStruct.ledMode[0] = 0x2221; - wd->ledStruct.ledMode[1] = 0x2221; - - zfTimerInit(dev); - - ZM_PERFORMANCE_INIT(dev); - - zfBssInfoCreate(dev); - zfScanMgrInit(dev); - zfPowerSavingMgrInit(dev); - -#if 0 - /* Test code */ - { - u32_t key[4] = {0xffffffff, 0xff, 0, 0}; - u16_t addr[3] = {0x8000, 0x01ab, 0x0000}; - /*zfSetKey(dev, 0, 0, ZM_WEP64, addr, key); - zfSetKey(dev, 0, 0, ZM_AES, addr, key); - zfSetKey(dev, 64, 0, 1, wd->macAddr, key); - */ - } -#endif - - /* WME settings */ - wd->ws.staWmeEnabled = 1; /* Enable WME by default */ -#define ZM_UAPSD_Q_SIZE 32 /* 2^N */ - wd->ap.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE); - zm_assert(wd->ap.uapsdQ != NULL); - wd->sta.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE); - zm_assert(wd->sta.uapsdQ != NULL); - - /* zfHpInit(dev, wd->frequency); */ - - /* MAC address */ - /* zfHpSetMacAddress(dev, wd->macAddr, 0); */ - zfHpGetMacAddress(dev); - - zfCoreSetFrequency(dev, wd->frequency); - -#if ZM_PCI_LOOP_BACK == 1 - zfwWriteReg(dev, ZM_REG_PCI_CONTROL, 6); -#endif /* #if ZM_PCI_LOOP_BACK == 1 */ - - /* zfiWlanSetDot11DMode(dev , 1); // Enable 802.11d */ - /* zfiWlanSetDot11HDFSMode(dev , 1); // Enable 802.11h DFS */ - wd->sta.DFSEnable = 1; - wd->sta.capability[1] |= ZM_BIT_0; - - /* zfiWlanSetFrequency(dev, 5260000, TRUE); */ - /* zfiWlanSetAniMode(dev , 1); // Enable ANI */ - - /* Trgger Rx DMA */ - zfHpStartRecv(dev); - - zm_debug_msg0("end"); - - return 0; -} - -/* WLAN hardware will be shutdown and all resource will be release */ -u16_t zfiWlanClose(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - zm_msg0_init(ZM_LV_0, "enter"); - - wd->state = ZM_WLAN_STATE_CLOSEDED; - - /* zfiWlanDisable(dev, 1); */ - zfWlanReset(dev); - - zfHpStopRecv(dev); - - /* Disable MAC */ - /* Disable PHY */ - /* Disable RF */ - - zfHpRelease(dev); - - zfQueueDestroy(dev, wd->ap.uapsdQ); - zfQueueDestroy(dev, wd->sta.uapsdQ); - - zfBssInfoDestroy(dev); - -#ifdef ZM_ENABLE_AGGREGATION - /* add by honda */ - zfAggRxFreeBuf(dev, 1); /* 1 for release structure memory */ - /* end of add by honda */ -#endif - - zm_msg0_init(ZM_LV_0, "exit"); - - return 0; -} - -void zfGetWrapperSetting(zdev_t *dev) -{ - u8_t bPassive; - u16_t vapId = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); -#if 0 - if ((wd->ws.countryIsoName[0] != 0) - || (wd->ws.countryIsoName[1] != 0) - || (wd->ws.countryIsoName[2] != '\0')) { - zfHpGetRegulationTablefromRegionCode(dev, - zfHpGetRegionCodeFromIsoName(dev, wd->ws.countryIsoName)); - } -#endif - zmw_enter_critical_section(dev); - - wd->wlanMode = wd->ws.wlanMode; - - /* set channel */ - if (wd->ws.frequency) { - wd->frequency = wd->ws.frequency; - wd->ws.frequency = 0; - } else { - wd->frequency = zfChGetFirstChannel(dev, &bPassive); - - if (wd->wlanMode == ZM_MODE_IBSS) { - if (wd->ws.adhocMode == ZM_ADHOCBAND_A) - wd->frequency = ZM_CH_A_36; - else - wd->frequency = ZM_CH_G_6; - } - } -#ifdef ZM_AP_DEBUG - /* honda add for debug, 2437 channel 6, 2452 channel 9 */ - wd->frequency = 2437; - /* end of add by honda */ -#endif - - /* set preamble type */ - switch (wd->ws.preambleType) { - case ZM_PREAMBLE_TYPE_AUTO: - case ZM_PREAMBLE_TYPE_SHORT: - case ZM_PREAMBLE_TYPE_LONG: - wd->preambleType = wd->ws.preambleType; - break; - default: - wd->preambleType = ZM_PREAMBLE_TYPE_SHORT; - break; - } - wd->ws.preambleType = 0; - - if (wd->wlanMode == ZM_MODE_AP) { - vapId = zfwGetVapId(dev); - - if (vapId == 0xffff) { - wd->ap.authAlgo[0] = wd->ws.authMode; - wd->ap.encryMode[0] = wd->ws.encryMode; - } else { - wd->ap.authAlgo[vapId + 1] = wd->ws.authMode; - wd->ap.encryMode[vapId + 1] = wd->ws.encryMode; - } - wd->ws.authMode = 0; - wd->ws.encryMode = ZM_NO_WEP; - - /* Get beaconInterval from WrapperSetting */ - if ((wd->ws.beaconInterval >= 20) && - (wd->ws.beaconInterval <= 1000)) - wd->beaconInterval = wd->ws.beaconInterval; - else - wd->beaconInterval = 100; /* 100ms */ - - if (wd->ws.dtim > 0) - wd->dtim = wd->ws.dtim; - else - wd->dtim = 1; - - - wd->ap.qosMode = wd->ws.apWmeEnabled & 0x1; - wd->ap.uapsdEnabled = (wd->ws.apWmeEnabled & 0x2) >> 1; - } else { - wd->sta.authMode = wd->ws.authMode; - wd->sta.currentAuthMode = wd->ws.authMode; - wd->sta.wepStatus = wd->ws.wepStatus; - - if (wd->ws.beaconInterval) - wd->beaconInterval = wd->ws.beaconInterval; - else - wd->beaconInterval = 0x64; - - if (wd->wlanMode == ZM_MODE_IBSS) { - /* 1. Set default channel 6 (2437MHz) */ - /* wd->frequency = 2437; */ - - /* 2. Otus support 802.11g Mode */ - if ((wd->ws.adhocMode == ZM_ADHOCBAND_G) || - (wd->ws.adhocMode == ZM_ADHOCBAND_BG) || - (wd->ws.adhocMode == ZM_ADHOCBAND_ABG)) - wd->wfc.bIbssGMode = 1; - else - wd->wfc.bIbssGMode = 0; - - /* 3. set short preamble */ - /* wd->sta.preambleType = ZM_PREAMBLE_TYPE_SHORT; */ - } - - /* set ATIM window */ - if (wd->ws.atimWindow) - wd->sta.atimWindow = wd->ws.atimWindow; - else { - /* wd->sta.atimWindow = 0x0a; */ - wd->sta.atimWindow = 0; - } - - /* wd->sta.connectingHiddenAP = 1; - wd->ws.connectingHiddenAP; - */ - wd->sta.dropUnencryptedPkts = wd->ws.dropUnencryptedPkts; - wd->sta.ibssJoinOnly = wd->ws.ibssJoinOnly; - - if (wd->ws.bDesiredBssid) { - zfMemoryCopy(wd->sta.desiredBssid, - wd->ws.desiredBssid, 6); - wd->sta.bDesiredBssid = TRUE; - wd->ws.bDesiredBssid = FALSE; - } else - wd->sta.bDesiredBssid = FALSE; - - /* check ssid */ - if (wd->ws.ssidLen != 0) { - if ((!zfMemoryIsEqual(wd->ws.ssid, wd->sta.ssid, - wd->sta.ssidLen)) || - (wd->ws.ssidLen != wd->sta.ssidLen) || - (wd->sta.authMode == ZM_AUTH_MODE_WPA) || - (wd->sta.authMode == ZM_AUTH_MODE_WPAPSK) || - (wd->ws.staWmeQosInfo != 0)) { - /* if u-APSD test(set QosInfo), clear - connectByReasso to do association - (not reassociation) - */ - wd->sta.connectByReasso = FALSE; - wd->sta.failCntOfReasso = 0; - wd->sta.pmkidInfo.bssidCount = 0; - - wd->sta.ssidLen = wd->ws.ssidLen; - zfMemoryCopy(wd->sta.ssid, wd->ws.ssid, - wd->sta.ssidLen); - - if (wd->sta.ssidLen < 32) - wd->sta.ssid[wd->sta.ssidLen] = 0; - } - } else { - /* ANY BSS */ - wd->sta.ssid[0] = 0; - wd->sta.ssidLen = 0; - } - - wd->sta.wmeEnabled = wd->ws.staWmeEnabled; - wd->sta.wmeQosInfo = wd->ws.staWmeQosInfo; - - } - - zmw_leave_critical_section(dev); -} - -u16_t zfWlanEnable(zdev_t *dev) -{ - u8_t bssid[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - u16_t i; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if (wd->wlanMode == ZM_MODE_UNKNOWN) { - zm_debug_msg0("Unknown Mode...Skip..."); - return 0; - } - - if (wd->wlanMode == ZM_MODE_AP) { - u16_t vapId; - - vapId = zfwGetVapId(dev); - - if (vapId == 0xffff) { - /* AP mode */ - zfApInitStaTbl(dev); - - /* AP default parameters */ - wd->bRate = 0xf; - wd->gRate = 0xff; - wd->bRateBasic = 0xf; - wd->gRateBasic = 0x0; - /* wd->beaconInterval = 100; */ - wd->ap.apBitmap = 1; - wd->ap.beaconCounter = 0; - /* wd->ap.vapNumber = 1; //mark by ygwei for Vap */ - - wd->ap.hideSsid[0] = 0; - wd->ap.staAgingTimeSec = 10*60; - wd->ap.staProbingTimeSec = 60; - - for (i = 0; i < ZM_MAX_AP_SUPPORT; i++) - wd->ap.bcmcHead[i] = wd->ap.bcmcTail[i] = 0; - - /* wd->ap.uniHead = wd->ap.uniTail = 0; */ - - /* load AP parameters */ - wd->bRateBasic = wd->ws.bRateBasic; - wd->gRateBasic = wd->ws.gRateBasic; - wd->bgMode = wd->ws.bgMode; - if ((wd->ws.ssidLen <= 32) && (wd->ws.ssidLen != 0)) { - wd->ap.ssidLen[0] = wd->ws.ssidLen; - for (i = 0; i < wd->ws.ssidLen; i++) - wd->ap.ssid[0][i] = wd->ws.ssid[i]; - wd->ws.ssidLen = 0; /* Reset Wrapper Variable */ - } - - if (wd->ap.encryMode[0] == 0) - wd->ap.capab[0] = 0x001; - else - wd->ap.capab[0] = 0x011; - /* set Short Slot Time bit if not 11b */ - if (wd->ap.wlanType[0] != ZM_WLAN_TYPE_PURE_B) - wd->ap.capab[0] |= 0x400; - - /* wd->ap.vapNumber = 1; //mark by ygwei for Vap Test */ - } else { -#if 0 - /* VAP Test Code */ - wd->ap.apBitmap = 0x3; - wd->ap.capab[1] = 0x401; - wd->ap.ssidLen[1] = 4; - wd->ap.ssid[1][0] = 'v'; - wd->ap.ssid[1][1] = 'a'; - wd->ap.ssid[1][2] = 'p'; - wd->ap.ssid[1][3] = '1'; - wd->ap.authAlgo[1] = wd->ws.authMode; - wd->ap.encryMode[1] = wd->ws.encryMode; - wd->ap.vapNumber = 2; -#else - /* VAP Test Code */ - wd->ap.apBitmap = 0x1 | (0x01 << (vapId+1)); - - if ((wd->ws.ssidLen <= 32) && (wd->ws.ssidLen != 0)) { - wd->ap.ssidLen[vapId+1] = wd->ws.ssidLen; - for (i = 0; i < wd->ws.ssidLen; i++) - wd->ap.ssid[vapId+1][i] = - wd->ws.ssid[i]; - wd->ws.ssidLen = 0; /* Reset Wrapper Variable */ - } - - if (wd->ap.encryMode[vapId+1] == 0) - wd->ap.capab[vapId+1] = 0x401; - else - wd->ap.capab[vapId+1] = 0x411; - - wd->ap.authAlgo[vapId+1] = wd->ws.authMode; - wd->ap.encryMode[vapId+1] = wd->ws.encryMode; - - /* Need to be modified when VAP is used */ - /* wd->ap.vapNumber = 2; */ -#endif - } - - wd->ap.vapNumber++; - - zfCoreSetFrequency(dev, wd->frequency); - - zfInitMacApMode(dev); - - /* Disable protection mode */ - zfApSetProtectionMode(dev, 0); - - zfApSendBeacon(dev); - } else { /*if (wd->wlanMode == ZM_MODE_AP) */ - - zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL); - zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_EXTERNAL); - - zmw_enter_critical_section(dev); - wd->sta.oppositeCount = 0; /* reset opposite count */ - /* wd->sta.bAutoReconnect = wd->sta.bAutoReconnectEnabled; */ - /* wd->sta.scanWithSSID = 0; */ - zfStaInitOppositeInfo(dev); - zmw_leave_critical_section(dev); - - zfStaResetStatus(dev, 0); - - if ((wd->sta.cmDisallowSsidLength != 0) && - (wd->sta.ssidLen == wd->sta.cmDisallowSsidLength) && - (zfMemoryIsEqual(wd->sta.ssid, wd->sta.cmDisallowSsid, - wd->sta.ssidLen)) && - (wd->sta.wepStatus == ZM_ENCRYPTION_TKIP)) {/*countermeasures*/ - zm_debug_msg0("countermeasures disallow association"); - } else { - switch (wd->wlanMode) { - case ZM_MODE_IBSS: - /* some registers may be set here */ - if (wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK) - zfHpSetApStaMode(dev, - ZM_HAL_80211_MODE_IBSS_WPA2PSK); - else - zfHpSetApStaMode(dev, - ZM_HAL_80211_MODE_IBSS_GENERAL); - - zm_msg0_mm(ZM_LV_0, "ZM_MODE_IBSS"); - zfIbssConnectNetwork(dev); - break; - - case ZM_MODE_INFRASTRUCTURE: - /* some registers may be set here */ - zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_STA); - - zfInfraConnectNetwork(dev); - break; - - case ZM_MODE_PSEUDO: - /* some registers may be set here */ - zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_STA); - - zfUpdateBssid(dev, bssid); - zfCoreSetFrequency(dev, wd->frequency); - break; - - default: - break; - } - } - - } - - - /* if ((wd->wlanMode != ZM_MODE_INFRASTRUCTURE) && - (wd->wlanMode != ZM_MODE_AP)) - */ - if (wd->wlanMode == ZM_MODE_PSEUDO) { - /* Reset Wlan status */ - zfWlanReset(dev); - - if (wd->zfcbConnectNotify != NULL) - wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, - wd->sta.bssid); - zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED); - } - - - if (wd->wlanMode == ZM_MODE_AP) { - if (wd->zfcbConnectNotify != NULL) - wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, - wd->sta.bssid); - /* zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED); */ - } - - /* Assign default Tx Rate */ - if (wd->sta.EnableHT) { - u32_t oneTxStreamCap; - oneTxStreamCap = (zfHpCapability(dev) & - ZM_HP_CAP_11N_ONE_TX_STREAM); - if (oneTxStreamCap) - wd->CurrentTxRateKbps = 135000; - else - wd->CurrentTxRateKbps = 270000; - wd->CurrentRxRateKbps = 270000; - } else { - wd->CurrentTxRateKbps = 54000; - wd->CurrentRxRateKbps = 54000; - } - - wd->state = ZM_WLAN_STATE_ENABLED; - - return 0; -} - -/* Enable/disable Wlan operation */ -u16_t zfiWlanEnable(zdev_t *dev) -{ - u16_t ret; - - zmw_get_wlan_dev(dev); - - zm_msg0_mm(ZM_LV_1, "Enable Wlan"); - - zfGetWrapperSetting(dev); - - zfZeroMemory((u8_t *) &wd->trafTally, sizeof(struct zsTrafTally)); - - /* Reset cmMicFailureCount to 0 for new association request */ - if (wd->sta.cmMicFailureCount == 1) { - zfTimerCancel(dev, ZM_EVENT_CM_TIMER); - wd->sta.cmMicFailureCount = 0; - } - - zfFlushVtxq(dev); - if ((wd->queueFlushed & 0x10) != 0) - zfHpUsbReset(dev); - - ret = zfWlanEnable(dev); - - return ret; -} -/* Add a flag named ResetKeyCache to show if KeyCache should be cleared. - for hostapd in AP mode, if driver receives iwconfig ioctl - after setting group key, it shouldn't clear KeyCache. -*/ -u16_t zfiWlanDisable(zdev_t *dev, u8_t ResetKeyCache) -{ - u16_t i; - u8_t isConnected; - - zmw_get_wlan_dev(dev); - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - zmw_declare_for_critical_section(); -#endif - wd->state = ZM_WLAN_STATE_DISABLED; - - zm_msg0_mm(ZM_LV_1, "Disable Wlan"); - - if (wd->wlanMode != ZM_MODE_AP) { - isConnected = zfStaIsConnected(dev); - - if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) && - (wd->sta.currentAuthMode != ZM_AUTH_MODE_WPA2)) { - /* send deauthentication frame */ - if (isConnected) { - /* zfiWlanDeauth(dev, NULL, 0); */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, - wd->sta.bssid, 3, 0, 0); - /* zmw_debug_msg0("send a Deauth frame!"); */ - } - } - - /* Remove all the connected peer stations */ - if (wd->wlanMode == ZM_MODE_IBSS) { - wd->sta.ibssBssIsCreator = 0; - zfTimerCancel(dev, ZM_EVENT_IBSS_MONITOR); - zfStaIbssMonitoring(dev, 1); - } - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - zmw_enter_critical_section(dev); - wd->sta.ibssWpa2Psk = 0; - zmw_leave_critical_section(dev); -#endif - - wd->sta.wpaState = ZM_STA_WPA_STATE_INIT; - - /* reset connect timeout counter */ - wd->sta.connectTimeoutCount = 0; - - /* reset connectState to None */ - wd->sta.connectState = ZM_STA_CONN_STATE_NONE; - - /* reset leap enable variable */ - wd->sta.leapEnabled = 0; - - /* Disable the RIFS Status/RIFS-like frame count/RIFS count */ - if (wd->sta.rifsState == ZM_RIFS_STATE_DETECTED) - zfHpDisableRifs(dev); - wd->sta.rifsState = ZM_RIFS_STATE_DETECTING; - wd->sta.rifsLikeFrameCnt = 0; - wd->sta.rifsCount = 0; - - wd->sta.osRxFilter = 0; - wd->sta.bSafeMode = 0; - - zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT); - if (ResetKeyCache) - zfHpResetKeyCache(dev); - - if (isConnected) { - if (wd->zfcbConnectNotify != NULL) - wd->zfcbConnectNotify(dev, - ZM_STATUS_MEDIA_CONNECTION_DISABLED, - wd->sta.bssid); - } else { - if (wd->zfcbConnectNotify != NULL) - wd->zfcbConnectNotify(dev, - ZM_STATUS_MEDIA_DISABLED, wd->sta.bssid); - } - } else { /* if (wd->wlanMode == ZM_MODE_AP) */ - for (i = 0; i < ZM_MAX_STA_SUPPORT; i++) { - /* send deauthentication frame */ - if (wd->ap.staTable[i].valid == 1) { - /* Reason : Sending station is leaving */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, - wd->ap.staTable[i].addr, 3, 0, 0); - } - } - - if (ResetKeyCache) - zfHpResetKeyCache(dev); - - wd->ap.vapNumber--; - } - - /* stop beacon */ - zfHpDisableBeacon(dev); - - /* Flush VTxQ and MmQ */ - zfFlushVtxq(dev); - /* Flush AP PS queues */ - zfApFlushBufferedPsFrame(dev); - /* Free buffer in defragment list*/ - zfAgingDefragList(dev, 1); - -#ifdef ZM_ENABLE_AGGREGATION - /* add by honda */ - zfAggRxFreeBuf(dev, 0); /* 1 for release structure memory */ - /* end of add by honda */ -#endif - - /* Clear the information for the peer stations - of IBSS or AP of Station mode - */ - zfZeroMemory((u8_t *)wd->sta.oppositeInfo, - sizeof(struct zsOppositeInfo) * ZM_MAX_OPPOSITE_COUNT); - - /* Turn off Software WEP/TKIP */ - if (wd->sta.SWEncryptEnable != 0) { - zm_debug_msg0("Disable software encryption"); - zfStaDisableSWEncryption(dev); - } - - /* Improve WEP/TKIP performance with HT AP, - detail information please look bug#32495 */ - /* zfHpSetTTSIFSTime(dev, 0x8); */ - - return 0; -} - -u16_t zfiWlanSuspend(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - /* Change the HAL state to init so that any packet - can't be transmitted between resume & HAL reinit. - This would cause the chip hang issue in OTUS. - */ - zmw_enter_critical_section(dev); - wd->halState = ZM_HAL_STATE_INIT; - zmw_leave_critical_section(dev); - - return 0; -} - -u16_t zfiWlanResume(zdev_t *dev, u8_t doReconn) -{ - u16_t ret; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - /* Redownload firmware, Reinit MAC,PHY,RF */ - zfHpReinit(dev, wd->frequency); - - /* Set channel according to AP's configuration */ - zfCoreSetFrequencyExV2(dev, wd->frequency, wd->BandWidth40, - wd->ExtOffset, NULL, 1); - - zfHpSetMacAddress(dev, wd->macAddr, 0); - - /* Start Rx */ - zfHpStartRecv(dev); - - zfFlushVtxq(dev); - - if (wd->wlanMode != ZM_MODE_INFRASTRUCTURE && - wd->wlanMode != ZM_MODE_IBSS) - return 1; - - zm_msg0_mm(ZM_LV_1, "Resume Wlan"); - if ((zfStaIsConnected(dev)) || (zfStaIsConnecting(dev))) { - if (doReconn == 1) { - zm_msg0_mm(ZM_LV_1, "Re-connect..."); - zmw_enter_critical_section(dev); - wd->sta.connectByReasso = FALSE; - zmw_leave_critical_section(dev); - - zfWlanEnable(dev); - } else if (doReconn == 0) - zfHpSetRollCallTable(dev); - } - - ret = 0; - - return ret; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiWlanFlushAllQueuedBuffers */ -/* Flush Virtual TxQ, MmQ, PS frames and defragment list */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2007.1 */ -/* */ -/************************************************************************/ -void zfiWlanFlushAllQueuedBuffers(zdev_t *dev) -{ - /* Flush VTxQ and MmQ */ - zfFlushVtxq(dev); - /* Flush AP PS queues */ - zfApFlushBufferedPsFrame(dev); - /* Free buffer in defragment list*/ - zfAgingDefragList(dev, 1); -} - -/* Do WLAN site survey */ -u16_t zfiWlanScan(zdev_t *dev) -{ - u16_t ret = 1; - zmw_get_wlan_dev(dev); - - zm_debug_msg0(""); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - if (wd->wlanMode == ZM_MODE_AP) { - wd->heartBeatNotification |= ZM_BSSID_LIST_SCAN; - wd->sta.scanFrequency = 0; - /* wd->sta.pUpdateBssList->bssCount = 0; */ - ret = 0; - } else { -#if 0 - if (!zfStaBlockWlanScan(dev)) { - zm_debug_msg0("scan request"); - /*zfTimerSchedule(dev, ZM_EVENT_SCAN, ZM_TICK_ZERO);*/ - ret = 0; - goto start_scan; - } -#else - goto start_scan; -#endif - } - - zmw_leave_critical_section(dev); - - return ret; - -start_scan: - zmw_leave_critical_section(dev); - - if (wd->ledStruct.LEDCtrlFlagFromReg & ZM_LED_CTRL_FLAG_ALPHA) { - /* flag for Alpha */ - wd->ledStruct.LEDCtrlFlag |= ZM_LED_CTRL_FLAG_ALPHA; - } - - ret = zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_EXTERNAL); - - zm_debug_msg1("ret = ", ret); - - return ret; -} - - -/* rate */ -/* 0 : AUTO */ -/* 1 : CCK 1M */ -/* 2 : CCK 2M */ -/* 3 : CCK 5.5M */ -/* 4 : CCK 11M */ -/* 5 : OFDM 6M */ -/* 6 : OFDM 9M */ -/* 7 : OFDM 12M */ -/* 8 : OFDM 18M */ -/* 9 : OFDM 24M */ -/* 10 : OFDM 36M */ -/* 11 : OFDM 48M */ -/* 12 : OFDM 54M */ -/* 13 : MCS 0 */ -/* 28 : MCS 15 */ -u16_t zcRateToMCS[] = - {0xff, 0, 1, 2, 3, 0xb, 0xf, 0xa, 0xe, 0x9, 0xd, 0x8, 0xc}; -u16_t zcRateToMT[] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}; - -u16_t zfiWlanSetTxRate(zdev_t *dev, u16_t rate) -{ - /* jhlee HT 0 */ - zmw_get_wlan_dev(dev); - - if (rate <= 12) { - wd->txMCS = zcRateToMCS[rate]; - wd->txMT = zcRateToMT[rate]; - return ZM_SUCCESS; - } else if ((rate <= 28) || (rate == 13 + 32)) { - wd->txMCS = rate - 12 - 1; - wd->txMT = 2; - return ZM_SUCCESS; - } - - return ZM_ERR_INVALID_TX_RATE; -} - -const u32_t zcRateIdToKbps40M[] = -{ - 1000, 2000, 5500, 11000, /* 1M, 2M, 5M, 11M , 0 1 2 3 */ - 6000, 9000, 12000, 18000, /* 6M 9M 12M 18M , 4 5 6 7 */ - 24000, 36000, 48000, 54000, /* 24M 36M 48M 54M , 8 9 10 11 */ - 13500, 27000, 40500, 54000, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15 */ - 81000, 108000, 121500, 135000, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19 */ - 27000, 54000, 81000, 108000, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23 */ - 162000, 216000, 243000, 270000, /*MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/ - 270000, 300000, 150000 /* MCS14SG, MCS15SG, MCS7SG , 28 29 30 */ -}; - -const u32_t zcRateIdToKbps20M[] = -{ - 1000, 2000, 5500, 11000, /* 1M, 2M, 5M, 11M , 0 1 2 3 */ - 6000, 9000, 12000, 18000, /* 6M 9M 12M 18M , 4 5 6 7 */ - 24000, 36000, 48000, 54000, /* 24M 36M 48M 54M , 8 9 10 11 */ - 6500, 13000, 19500, 26000, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15 */ - 39000, 52000, 58500, 65000, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19 */ - 13000, 26000, 39000, 52000, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23 */ - 78000, 104000, 117000, 130000, /* MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/ - 130000, 144400, 72200 /* MCS14SG, MCS15SG, MSG7SG , 28 29 30 */ -}; - -u32_t zfiWlanQueryTxRate(zdev_t *dev) -{ - u8_t rateId = 0xff; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - /* If Tx rate had not been trained, return maximum Tx rate instead */ - if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) && - (zfStaIsConnected(dev))) { - zmw_enter_critical_section(dev); - /* Not in fixed rate mode */ - if (wd->txMCS == 0xff) { - if ((wd->sta.oppositeInfo[0].rcCell.flag & - ZM_RC_TRAINED_BIT) == 0) - rateId = wd->sta.oppositeInfo[0].rcCell. \ - operationRateSet[wd->sta.oppositeInfo[0]. \ - rcCell.operationRateCount-1]; - else - rateId = wd->sta.oppositeInfo[0].rcCell. \ - operationRateSet[wd->sta.oppositeInfo[0]. \ - rcCell.currentRateIndex]; - } - zmw_leave_critical_section(dev); - } - - if (rateId != 0xff) { - if (wd->sta.htCtrlBandwidth) - return zcRateIdToKbps40M[rateId]; - else - return zcRateIdToKbps20M[rateId]; - } else - return wd->CurrentTxRateKbps; -} - -void zfWlanUpdateRxRate(zdev_t *dev, struct zsAdditionInfo *addInfo) -{ - u32_t rxRateKbps; - zmw_get_wlan_dev(dev); - /* zm_msg1_mm(ZM_LV_0, "addInfo->Tail.Data.RxMacStatus =", - * addInfo->Tail.Data.RxMacStatus & 0x03); - */ - - /* b5~b4: MPDU indication. */ - /* 00: Single MPDU. */ - /* 10: First MPDU of A-MPDU. */ - /* 11: Middle MPDU of A-MPDU. */ - /* 01: Last MPDU of A-MPDU. */ - /* Only First MPDU and Single MPDU have PLCP header */ - /* First MPDU : (mpduInd & 0x30) == 0x00 */ - /* Single MPDU : (mpduInd & 0x30) == 0x20 */ - if ((addInfo->Tail.Data.RxMacStatus & 0x10) == 0) { - /* Modulation type */ - wd->modulationType = addInfo->Tail.Data.RxMacStatus & 0x03; - switch (wd->modulationType) { - /* CCK mode */ - case 0x0: - wd->rateField = addInfo->PlcpHeader[0] & 0xff; - wd->rxInfo = 0; - break; - /* Legacy-OFDM mode */ - case 0x1: - wd->rateField = addInfo->PlcpHeader[0] & 0x0f; - wd->rxInfo = 0; - break; - /* HT-OFDM mode */ - case 0x2: - wd->rateField = addInfo->PlcpHeader[3]; - wd->rxInfo = addInfo->PlcpHeader[6]; - break; - default: - break; - } - - rxRateKbps = zfUpdateRxRate(dev); - if (wd->CurrentRxRateUpdated == 1) { - if (rxRateKbps > wd->CurrentRxRateKbps) - wd->CurrentRxRateKbps = rxRateKbps; - } else { - wd->CurrentRxRateKbps = rxRateKbps; - wd->CurrentRxRateUpdated = 1; - } - } -} - -#if 0 -u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000, - 24000, 12000, 6000, 54000, 36000, 18000, 9000}; -u32_t zcIndextoRateN20L[16] = {6500, 13000, 19500, 26000, 39000, 52000, 58500, - 65000, 13000, 26000, 39000, 52000, 78000, 104000, - 117000, 130000}; -u32_t zcIndextoRateN20S[16] = {7200, 14400, 21700, 28900, 43300, 57800, 65000, - 72200, 14400, 28900, 43300, 57800, 86700, 115600, - 130000, 144400}; -u32_t zcIndextoRateN40L[16] = {13500, 27000, 40500, 54000, 81000, 108000, - 121500, 135000, 27000, 54000, 81000, 108000, - 162000, 216000, 243000, 270000}; -u32_t zcIndextoRateN40S[16] = {15000, 30000, 45000, 60000, 90000, 120000, - 135000, 150000, 30000, 60000, 90000, 120000, - 180000, 240000, 270000, 300000}; -#endif - -extern u16_t zcIndextoRateBG[16]; -extern u32_t zcIndextoRateN20L[16]; -extern u32_t zcIndextoRateN20S[16]; -extern u32_t zcIndextoRateN40L[16]; -extern u32_t zcIndextoRateN40S[16]; - -u32_t zfiWlanQueryRxRate(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - wd->CurrentRxRateUpdated = 0; - return wd->CurrentRxRateKbps; -} - -u32_t zfUpdateRxRate(zdev_t *dev) -{ - u8_t mcs, bandwidth; - u32_t rxRateKbps = 130000; - zmw_get_wlan_dev(dev); - - switch (wd->modulationType) { - /* CCK mode */ - case 0x0: - switch (wd->rateField) { - case 0x0a: - rxRateKbps = 1000; - break; - case 0x14: - rxRateKbps = 2000; - - case 0x37: - rxRateKbps = 5500; - break; - case 0x6e: - rxRateKbps = 11000; - break; - default: - break; - } - break; - /* Legacy-OFDM mode */ - case 0x1: - if (wd->rateField <= 15) - rxRateKbps = zcIndextoRateBG[wd->rateField]; - break; - /* HT-OFDM mode */ - case 0x2: - mcs = wd->rateField & 0x7F; - bandwidth = wd->rateField & 0x80; - if (mcs <= 15) { - if (bandwidth != 0) { - if ((wd->rxInfo & 0x80) != 0) { - /* Short GI 40 MHz MIMO Rate */ - rxRateKbps = zcIndextoRateN40S[mcs]; - } else { - /* Long GI 40 MHz MIMO Rate */ - rxRateKbps = zcIndextoRateN40L[mcs]; - } - } else { - if ((wd->rxInfo & 0x80) != 0) { - /* Short GI 20 MHz MIMO Rate */ - rxRateKbps = zcIndextoRateN20S[mcs]; - } else { - /* Long GI 20 MHz MIMO Rate */ - rxRateKbps = zcIndextoRateN20L[mcs]; - } - } - } - break; - default: - break; - } - /* zm_msg1_mm(ZM_LV_0, "wd->CurrentRxRateKbps=", - wd->CurrentRxRateKbps); - */ - - /* ToDo: use bandwith field to define 40MB */ - return rxRateKbps; -} - -/* Get WLAN stastics */ -u16_t zfiWlanGetStatistics(zdev_t *dev) -{ - /* Return link statistics */ - return 0; -} - -u16_t zfiWlanReset(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - wd->state = ZM_WLAN_STATE_DISABLED; - - return zfWlanReset(dev); -} - -/* Reset WLAN */ -u16_t zfWlanReset(zdev_t *dev) -{ - u8_t isConnected; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zm_debug_msg0("zfWlanReset"); - - isConnected = zfStaIsConnected(dev); - - /* if ( wd->wlanMode != ZM_MODE_AP ) */ - { - if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) && - (wd->sta.currentAuthMode != ZM_AUTH_MODE_WPA2)) { - /* send deauthentication frame */ - if (isConnected) { - /* zfiWlanDeauth(dev, NULL, 0); */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, - wd->sta.bssid, 3, 0, 0); - /* zmw_debug_msg0("send a Deauth frame!"); */ - } - } - } - - zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT); - zfHpResetKeyCache(dev); - - if (isConnected) { - /* zfiWlanDisable(dev); */ - if (wd->zfcbConnectNotify != NULL) - wd->zfcbConnectNotify(dev, - ZM_STATUS_MEDIA_CONNECTION_RESET, wd->sta.bssid); - } else { - if (wd->zfcbConnectNotify != NULL) - wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_RESET, - wd->sta.bssid); - } - - /* stop beacon */ - zfHpDisableBeacon(dev); - - /* Free buffer in defragment list*/ - zfAgingDefragList(dev, 1); - - /* Flush VTxQ and MmQ */ - zfFlushVtxq(dev); - -#ifdef ZM_ENABLE_AGGREGATION - /* add by honda */ - zfAggRxFreeBuf(dev, 0); /* 1 for release structure memory */ - /* end of add by honda */ -#endif - - zfStaRefreshBlockList(dev, 1); - - zmw_enter_critical_section(dev); - - zfTimerCancel(dev, ZM_EVENT_IBSS_MONITOR); - zfTimerCancel(dev, ZM_EVENT_CM_BLOCK_TIMER); - zfTimerCancel(dev, ZM_EVENT_CM_DISCONNECT); - - wd->sta.connectState = ZM_STA_CONN_STATE_NONE; - wd->sta.connectByReasso = FALSE; - wd->sta.cmDisallowSsidLength = 0; - wd->sta.bAutoReconnect = 0; - wd->sta.InternalScanReq = 0; - wd->sta.encryMode = ZM_NO_WEP; - wd->sta.wepStatus = ZM_ENCRYPTION_WEP_DISABLED; - wd->sta.wpaState = ZM_STA_WPA_STATE_INIT; - wd->sta.cmMicFailureCount = 0; - wd->sta.ibssBssIsCreator = 0; -#ifdef ZM_ENABLE_IBSS_WPA2PSK - wd->sta.ibssWpa2Psk = 0; -#endif - /* reset connect timeout counter */ - wd->sta.connectTimeoutCount = 0; - - /* reset leap enable variable */ - wd->sta.leapEnabled = 0; - - /* Reset the RIFS Status / RIFS-like frame count / RIFS count */ - if (wd->sta.rifsState == ZM_RIFS_STATE_DETECTED) - zfHpDisableRifs(dev); - wd->sta.rifsState = ZM_RIFS_STATE_DETECTING; - wd->sta.rifsLikeFrameCnt = 0; - wd->sta.rifsCount = 0; - - wd->sta.osRxFilter = 0; - wd->sta.bSafeMode = 0; - - /* Clear the information for the peer - stations of IBSS or AP of Station mode - */ - zfZeroMemory((u8_t *)wd->sta.oppositeInfo, - sizeof(struct zsOppositeInfo) * ZM_MAX_OPPOSITE_COUNT); - - zmw_leave_critical_section(dev); - - zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL); - zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_EXTERNAL); - - /* Turn off Software WEP/TKIP */ - if (wd->sta.SWEncryptEnable != 0) { - zm_debug_msg0("Disable software encryption"); - zfStaDisableSWEncryption(dev); - } - - /* Improve WEP/TKIP performance with HT AP, - detail information please look bug#32495 - */ - /* zfHpSetTTSIFSTime(dev, 0x8); */ - - /* Keep Pseudo mode */ - if (wd->wlanMode != ZM_MODE_PSEUDO) - wd->wlanMode = ZM_MODE_INFRASTRUCTURE; - - return 0; -} - -/* Deauthenticate a STA */ -u16_t zfiWlanDeauth(zdev_t *dev, u16_t *macAddr, u16_t reason) -{ - zmw_get_wlan_dev(dev); - - if (wd->wlanMode == ZM_MODE_AP) { - /* u16_t id; */ - - /* - * we will reset all key in zfHpResetKeyCache() when call - * zfiWlanDisable(), if we want to reset PairwiseKey for each - * sta, need to use a nullAddr to let keyindex not match. - * otherwise hardware will still find PairwiseKey when AP change - * encryption mode from WPA to WEP - */ - - /* - id = zfApFindSta(dev, macAddr); - if (id != 0xffff) - { - u32_t key[8]; - u16_t nullAddr[3] = { 0x0, 0x0, 0x0 }; - - if (wd->ap.staTable[i].encryMode != ZM_NO_WEP) - { - zfHpSetApPairwiseKey(dev, nullAddr, - ZM_NO_WEP, &key[0], &key[4], i+1); - } - //zfHpSetApPairwiseKey(dev, (u16_t *)macAddr, - // ZM_NO_WEP, &key[0], &key[4], id+1); - wd->ap.staTable[id].encryMode = ZM_NO_WEP; - wd->ap.staTable[id].keyIdx = 0xff; - } - */ - - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, macAddr, - reason, 0, 0); - } else - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, - wd->sta.bssid, 3, 0, 0); - - /* Issue DEAUTH command to FW */ - return 0; -} - - -/* XP packet filter feature : */ -/* 1=>enable: All multicast address packets, not just the ones */ -/* enumerated in the multicast address list. */ -/* 0=>disable */ -void zfiWlanSetAllMulticast(zdev_t *dev, u32_t setting) -{ - zmw_get_wlan_dev(dev); - zm_msg1_mm(ZM_LV_0, "sta.bAllMulticast = ", setting); - wd->sta.bAllMulticast = (u8_t)setting; -} - - -/* HT configure API */ -void zfiWlanSetHTCtrl(zdev_t *dev, u32_t *setting, u32_t forceTxTPC) -{ - zmw_get_wlan_dev(dev); - - wd->preambleType = (u8_t)setting[0]; - wd->sta.preambleTypeHT = (u8_t)setting[1]; - wd->sta.htCtrlBandwidth = (u8_t)setting[2]; - wd->sta.htCtrlSTBC = (u8_t)setting[3]; - wd->sta.htCtrlSG = (u8_t)setting[4]; - wd->sta.defaultTA = (u8_t)setting[5]; - wd->enableAggregation = (u8_t)setting[6]; - wd->enableWDS = (u8_t)setting[7]; - - wd->forceTxTPC = forceTxTPC; -} - -/* FB50 in OS XP, RD private test code */ -void zfiWlanQueryHTCtrl(zdev_t *dev, u32_t *setting, u32_t *forceTxTPC) -{ - zmw_get_wlan_dev(dev); - - setting[0] = wd->preambleType; - setting[1] = wd->sta.preambleTypeHT; - setting[2] = wd->sta.htCtrlBandwidth; - setting[3] = wd->sta.htCtrlSTBC; - setting[4] = wd->sta.htCtrlSG; - setting[5] = wd->sta.defaultTA; - setting[6] = wd->enableAggregation; - setting[7] = wd->enableWDS; - - *forceTxTPC = wd->forceTxTPC; -} - -void zfiWlanDbg(zdev_t *dev, u8_t setting) -{ - zmw_get_wlan_dev(dev); - - wd->enableHALDbgInfo = setting; -} - -/* FB50 in OS XP, RD private test code */ -void zfiWlanSetRxPacketDump(zdev_t *dev, u32_t setting) -{ - zmw_get_wlan_dev(dev); - if (setting) - wd->rxPacketDump = 1; /* enable */ - else - wd->rxPacketDump = 0; /* disable */ -} - - -/* FB50 in OS XP, RD private test code */ -/* Tally */ -void zfiWlanResetTally(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - wd->commTally.txUnicastFrm = 0; /* txUnicastFrames */ - wd->commTally.txMulticastFrm = 0; /* txMulticastFrames */ - wd->commTally.txUnicastOctets = 0; /* txUniOctets byte size */ - wd->commTally.txMulticastOctets = 0; /* txMultiOctets byte size */ - wd->commTally.txFrmUpperNDIS = 0; - wd->commTally.txFrmDrvMgt = 0; - wd->commTally.RetryFailCnt = 0; - wd->commTally.Hw_TotalTxFrm = 0; /* Hardware total Tx Frame */ - wd->commTally.Hw_RetryCnt = 0; /* txMultipleRetriesFrames */ - wd->commTally.Hw_UnderrunCnt = 0; - wd->commTally.DriverRxFrmCnt = 0; - wd->commTally.rxUnicastFrm = 0; /* rxUnicastFrames */ - wd->commTally.rxMulticastFrm = 0; /* rxMulticastFrames */ - wd->commTally.NotifyNDISRxFrmCnt = 0; - wd->commTally.rxUnicastOctets = 0; /* rxUniOctets byte size */ - wd->commTally.rxMulticastOctets = 0; /* rxMultiOctets byte size */ - wd->commTally.DriverDiscardedFrm = 0; /* Discard by ValidateFrame */ - wd->commTally.LessThanDataMinLen = 0; - wd->commTally.GreaterThanMaxLen = 0; - wd->commTally.DriverDiscardedFrmCauseByMulticastList = 0; - wd->commTally.DriverDiscardedFrmCauseByFrmCtrl = 0; - wd->commTally.rxNeedFrgFrm = 0; /* need more frg frm */ - wd->commTally.DriverRxMgtFrmCnt = 0; - wd->commTally.rxBroadcastFrm = 0;/* Receive broadcast frame count */ - wd->commTally.rxBroadcastOctets = 0;/*Receive broadcast framebyte size*/ - wd->commTally.Hw_TotalRxFrm = 0; - wd->commTally.Hw_CRC16Cnt = 0; /* rxPLCPCRCErrCnt */ - wd->commTally.Hw_CRC32Cnt = 0; /* rxCRC32ErrCnt */ - wd->commTally.Hw_DecrypErr_UNI = 0; - wd->commTally.Hw_DecrypErr_Mul = 0; - wd->commTally.Hw_RxFIFOOverrun = 0; - wd->commTally.Hw_RxTimeOut = 0; - wd->commTally.LossAP = 0; - - wd->commTally.Tx_MPDU = 0; - wd->commTally.BA_Fail = 0; - wd->commTally.Hw_Tx_AMPDU = 0; - wd->commTally.Hw_Tx_MPDU = 0; - - wd->commTally.txQosDropCount[0] = 0; - wd->commTally.txQosDropCount[1] = 0; - wd->commTally.txQosDropCount[2] = 0; - wd->commTally.txQosDropCount[3] = 0; - wd->commTally.txQosDropCount[4] = 0; - - wd->commTally.Hw_RxMPDU = 0; - wd->commTally.Hw_RxDropMPDU = 0; - wd->commTally.Hw_RxDelMPDU = 0; - - wd->commTally.Hw_RxPhyMiscError = 0; - wd->commTally.Hw_RxPhyXRError = 0; - wd->commTally.Hw_RxPhyOFDMError = 0; - wd->commTally.Hw_RxPhyCCKError = 0; - wd->commTally.Hw_RxPhyHTError = 0; - wd->commTally.Hw_RxPhyTotalCount = 0; - -#if (defined(GCCK) && defined(OFDM)) - wd->commTally.rx11bDataFrame = 0; - wd->commTally.rxOFDMDataFrame = 0; -#endif - - zmw_leave_critical_section(dev); -} - -/* FB50 in OS XP, RD private test code */ -void zfiWlanQueryTally(zdev_t *dev, struct zsCommTally *tally) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - zfMemoryCopy((u8_t *)tally, (u8_t *)&wd->commTally, - sizeof(struct zsCommTally)); - zmw_leave_critical_section(dev); -} - -void zfiWlanQueryTrafTally(zdev_t *dev, struct zsTrafTally *tally) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - zfMemoryCopy((u8_t *)tally, (u8_t *)&wd->trafTally, - sizeof(struct zsTrafTally)); - zmw_leave_critical_section(dev); -} - -void zfiWlanQueryMonHalRxInfo(zdev_t *dev, struct zsMonHalRxInfo *monHalRxInfo) -{ - zfHpQueryMonHalRxInfo(dev, (u8_t *)monHalRxInfo); -} - -/* parse the modeMDKEnable to DrvCore */ -void zfiDKEnable(zdev_t *dev, u32_t enable) -{ - zmw_get_wlan_dev(dev); - - wd->modeMDKEnable = enable; - zm_debug_msg1("modeMDKEnable = ", wd->modeMDKEnable); -} - -/* airoPeek */ -u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - return wd->swSniffer; -} - -/* airoPeek */ -void zfiWlanSetPacketTypePromiscuous(zdev_t *dev, u32_t setValue) -{ - zmw_get_wlan_dev(dev); - - wd->swSniffer = setValue; - zm_msg1_mm(ZM_LV_0, "wd->swSniffer ", wd->swSniffer); - if (setValue) { - /* write register for sniffer mode */ - zfHpSetSnifferMode(dev, 1); - zm_msg0_mm(ZM_LV_1, "enable sniffer mode"); - } else { - zfHpSetSnifferMode(dev, 0); - zm_msg0_mm(ZM_LV_0, "disalbe sniffer mode"); - } -} - -void zfiWlanSetXLinkMode(zdev_t *dev, u32_t setValue) -{ - zmw_get_wlan_dev(dev); - - wd->XLinkMode = setValue; - if (setValue) { - /* write register for sniffer mode */ - zfHpSetSnifferMode(dev, 1); - } else - zfHpSetSnifferMode(dev, 0); -} - -extern void zfStaChannelManagement(zdev_t *dev, u8_t scan); - -void zfiSetChannelManagement(zdev_t *dev, u32_t setting) -{ - zmw_get_wlan_dev(dev); - - switch (setting) { - case 1: - wd->sta.EnableHT = 1; - wd->BandWidth40 = 1; - wd->ExtOffset = 1; - break; - case 3: - wd->sta.EnableHT = 1; - wd->BandWidth40 = 1; - wd->ExtOffset = 3; - break; - case 0: - wd->sta.EnableHT = 1; - wd->BandWidth40 = 0; - wd->ExtOffset = 0; - break; - default: - wd->BandWidth40 = 0; - wd->ExtOffset = 0; - break; - } - - zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40, - wd->ExtOffset, NULL); -} - -void zfiSetRifs(zdev_t *dev, u16_t setting) -{ - zmw_get_wlan_dev(dev); - - wd->sta.ie.HtInfo.ChannelInfo |= ExtHtCap_RIFSMode; - wd->sta.EnableHT = 1; - - switch (setting) { - case 0: - wd->sta.HT2040 = 0; - /* zfHpSetRifs(dev, 1, 0, - * (wd->sta.currentFrequency < 3000)? 1:0); - */ - break; - case 1: - wd->sta.HT2040 = 1; - /* zfHpSetRifs(dev, 1, 1, - * (wd->sta.currentFrequency < 3000)? 1:0); - */ - break; - default: - wd->sta.HT2040 = 0; - /* zfHpSetRifs(dev, 1, 0, - * (wd->sta.currentFrequency < 3000)? 1:0); - */ - break; - } -} - -void zfiCheckRifs(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - if (wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode) - ; - /* zfHpSetRifs(dev, wd->sta.EnableHT, wd->sta.HT2040, - * (wd->sta.currentFrequency < 3000)? 1:0); - */ -} - -void zfiSetReorder(zdev_t *dev, u16_t value) -{ - zmw_get_wlan_dev(dev); - - wd->reorder = value; -} - -void zfiSetSeqDebug(zdev_t *dev, u16_t value) -{ - zmw_get_wlan_dev(dev); - - wd->seq_debug = value; -} diff --git a/drivers/staging/otus/80211core/cfunc.c b/drivers/staging/otus/80211core/cfunc.c deleted file mode 100644 index 3b9341b13c02..000000000000 --- a/drivers/staging/otus/80211core/cfunc.c +++ /dev/null @@ -1,1226 +0,0 @@ -/* - * 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" - -u8_t zfQueryOppositeRate(zdev_t* dev, u8_t dst_mac[6], u8_t frameType) -{ - zmw_get_wlan_dev(dev); - - /* For AP's rate adaption */ - if ( wd->wlanMode == ZM_MODE_AP ) - { - return 0; - } - - /* For STA's rate adaption */ - if ( (frameType & 0x0c) == ZM_WLAN_DATA_FRAME ) - { - if ( ZM_IS_MULTICAST(dst_mac) ) - { - return wd->sta.mTxRate; - } - else - { - return wd->sta.uTxRate; - } - } - - return wd->sta.mmTxRate; -} - -void zfCopyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src, - u16_t offset, u16_t length) -{ - u16_t i; - - for(i=0; icommTally.Hw_UnderrunCnt += (0xFFFF & rsp[1]); - wd->commTally.Hw_TotalRxFrm += rsp[2]; - wd->commTally.Hw_CRC32Cnt += rsp[3]; - wd->commTally.Hw_CRC16Cnt += rsp[4]; - #ifdef ZM_ENABLE_NATIVE_WIFI - /* These code are here to satisfy Vista DTM */ - wd->commTally.Hw_DecrypErr_UNI += ((rsp[5]>50) && (rsp[5]<60))?50:rsp[5]; - #else - wd->commTally.Hw_DecrypErr_UNI += rsp[5]; - #endif - wd->commTally.Hw_RxFIFOOverrun += rsp[6]; - wd->commTally.Hw_DecrypErr_Mul += rsp[7]; - wd->commTally.Hw_RetryCnt += rsp[8]; - wd->commTally.Hw_TotalTxFrm += rsp[9]; - wd->commTally.Hw_RxTimeOut +=rsp[10]; - - wd->commTally.Tx_MPDU += rsp[11]; - wd->commTally.BA_Fail += rsp[12]; - wd->commTally.Hw_Tx_AMPDU += rsp[13]; - wd->commTally.Hw_Tx_MPDU += rsp[14]; - wd->commTally.RateCtrlTxMPDU += rsp[11]; - wd->commTally.RateCtrlBAFail += rsp[12]; - } - else - { - wd->commTally.Hw_RxMPDU += rsp[1]; - wd->commTally.Hw_RxDropMPDU += rsp[2]; - wd->commTally.Hw_RxDelMPDU += rsp[3]; - - wd->commTally.Hw_RxPhyMiscError += rsp[4]; - wd->commTally.Hw_RxPhyXRError += rsp[5]; - wd->commTally.Hw_RxPhyOFDMError += rsp[6]; - wd->commTally.Hw_RxPhyCCKError += rsp[7]; - wd->commTally.Hw_RxPhyHTError += rsp[8]; - wd->commTally.Hw_RxPhyTotalCount += rsp[9]; - } - - zmw_leave_critical_section(dev); - - if (id == 0) - { - zm_msg1_mm(ZM_LV_1, "rsplen =", rsp[0]); - zm_msg1_mm(ZM_LV_1, "Hw_UnderrunCnt = ", (0xFFFF & rsp[1])); - zm_msg1_mm(ZM_LV_1, "Hw_TotalRxFrm = ", rsp[2]); - zm_msg1_mm(ZM_LV_1, "Hw_CRC32Cnt = ", rsp[3]); - zm_msg1_mm(ZM_LV_1, "Hw_CRC16Cnt = ", rsp[4]); - zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI = ", rsp[5]); - zm_msg1_mm(ZM_LV_1, "Hw_RxFIFOOverrun = ", rsp[6]); - zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul = ", rsp[7]); - zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt = ", rsp[8]); - zm_msg1_mm(ZM_LV_1, "Hw_TotalTxFrm = ", rsp[9]); - zm_msg1_mm(ZM_LV_1, "Hw_RxTimeOut = ", rsp[10]); - zm_msg1_mm(ZM_LV_1, "Tx_MPDU = ", rsp[11]); - zm_msg1_mm(ZM_LV_1, "BA_Fail = ", rsp[12]); - zm_msg1_mm(ZM_LV_1, "Hw_Tx_AMPDU = ", rsp[13]); - zm_msg1_mm(ZM_LV_1, "Hw_Tx_MPDU = ", rsp[14]); - } - else - { - zm_msg1_mm(ZM_LV_1, "rsplen = ", rsp[0]); - zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU = ", (0xFFFF & rsp[1])); - zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU = ", rsp[2]); - zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU = ", rsp[3]); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError = ", rsp[4]); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError = ", rsp[5]); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError = ", rsp[6]); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError = ", rsp[7]); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError = ", rsp[8]); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", rsp[9]); - } - -} - -/* Timer related functions */ -void zfTimerInit(zdev_t* dev) -{ - u8_t i; - - zmw_get_wlan_dev(dev); - - zm_debug_msg0(""); - - wd->timerList.freeCount = ZM_MAX_TIMER_COUNT; - wd->timerList.head = &(wd->timerList.list[0]); - wd->timerList.tail = &(wd->timerList.list[ZM_MAX_TIMER_COUNT-1]); - wd->timerList.head->pre = NULL; - wd->timerList.head->next = &(wd->timerList.list[1]); - wd->timerList.tail->pre = &(wd->timerList.list[ZM_MAX_TIMER_COUNT-2]); - wd->timerList.tail->next = NULL; - - for( i=1; i<(ZM_MAX_TIMER_COUNT-1); i++ ) - { - wd->timerList.list[i].pre = &(wd->timerList.list[i-1]); - wd->timerList.list[i].next = &(wd->timerList.list[i+1]); - } - - wd->bTimerReady = TRUE; -} - - -u16_t zfTimerSchedule(zdev_t* dev, u16_t event, u32_t tick) -{ - struct zsTimerEntry *pFreeEntry; - struct zsTimerEntry *pEntry; - u8_t i, count; - - zmw_get_wlan_dev(dev); - - if ( wd->timerList.freeCount == 0 ) - { - zm_debug_msg0("no more timer"); - return 1; - } - - //zm_debug_msg2("event = ", event); - //zm_debug_msg1("target tick = ", wd->tick + tick); - - count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount; - - if ( count == 0 ) - { - wd->timerList.freeCount--; - wd->timerList.head->event = event; - wd->timerList.head->timer = wd->tick + tick; - //zm_debug_msg1("free timer count = ", wd->timerList.freeCount); - - return 0; - } - - pFreeEntry = wd->timerList.tail; - pFreeEntry->timer = wd->tick + tick; - pFreeEntry->event = event; - wd->timerList.tail = pFreeEntry->pre; - pEntry = wd->timerList.head; - - for( i=0; itimer > pFreeEntry->timer )&& - ((pEntry->timer - pFreeEntry->timer) < 1000000000) ) - { - if ( i != 0 ) - { - pFreeEntry->pre = pEntry->pre; - pFreeEntry->pre->next = pFreeEntry; - } - else - { - pFreeEntry->pre = NULL; - } - - pEntry->pre = pFreeEntry; - pFreeEntry->next = pEntry; - break; - } - - pEntry = pEntry->next; - } - - if ( i == 0 ) - { - wd->timerList.head = pFreeEntry; - } - - if ( i == count ) - { - pFreeEntry->pre = pEntry->pre; - pFreeEntry->pre->next = pFreeEntry; - pEntry->pre = pFreeEntry; - pFreeEntry->next = pEntry; - } - - wd->timerList.freeCount--; - //zm_debug_msg1("free timer count = ", wd->timerList.freeCount); - - return 0; -} - -u16_t zfTimerCancel(zdev_t* dev, u16_t event) -{ - struct zsTimerEntry *pEntry; - u8_t i, count; - - zmw_get_wlan_dev(dev); - - //zm_debug_msg2("event = ", event); - //zm_debug_msg1("free timer count(b) = ", wd->timerList.freeCount); - - pEntry = wd->timerList.head; - count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount; - - for( i=0; ievent == event ) - { - if ( pEntry == wd->timerList.head ) - { /* remove head entry */ - wd->timerList.head = pEntry->next; - wd->timerList.tail->next = pEntry; - pEntry->pre = wd->timerList.tail; - wd->timerList.tail = pEntry; - pEntry = wd->timerList.head; - } - else - { /* remove non-head entry */ - pEntry->pre->next = pEntry->next; - pEntry->next->pre = pEntry->pre; - wd->timerList.tail->next = pEntry; - pEntry->pre = wd->timerList.tail; - wd->timerList.tail = pEntry; - pEntry = pEntry->next; - } - - wd->timerList.freeCount++; - } - else - { - pEntry = pEntry->next; - } - } - - //zm_debug_msg1("free timer count(a) = ", wd->timerList.freeCount); - - return 0; -} - -void zfTimerClear(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - wd->timerList.freeCount = ZM_MAX_TIMER_COUNT; -} - -u16_t zfTimerCheckAndHandle(zdev_t* dev) -{ - struct zsTimerEntry *pEntry; - struct zsTimerEntry *pTheLastEntry = NULL; - u16_t event[ZM_MAX_TIMER_COUNT]; - u8_t i, j=0, count; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if ( !wd->bTimerReady ) - { - return 0; - } - - zmw_enter_critical_section(dev); - - pEntry = wd->timerList.head; - count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount; - - for( i=0; itimer > wd->tick )&& - ((pEntry->timer - wd->tick) < 1000000000) ) - { - break; - } - - event[j++] = pEntry->event; - pTheLastEntry = pEntry; - pEntry = pEntry->next; - } - - if ( j > 0 ) - { - wd->timerList.tail->next = wd->timerList.head; - wd->timerList.head->pre = wd->timerList.tail; - wd->timerList.head = pEntry; - wd->timerList.tail = pTheLastEntry; - wd->timerList.freeCount += j; - //zm_debug_msg1("free timer count = ", wd->timerList.freeCount); - } - - zmw_leave_critical_section(dev); - - zfProcessEvent(dev, event, j); - - return 0; -} - -u32_t zfCoreSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type, - u16_t* mac, u32_t* key) -{ - u32_t ret; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->sta.flagKeyChanging++; - zm_debug_msg1(" zfCoreSetKey++++ ", wd->sta.flagKeyChanging); - zmw_leave_critical_section(dev); - - ret = zfHpSetKey(dev, user, keyId, type, mac, key); - return ret; -} - -void zfCoreSetKeyComplete(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - -#if 0 - wd->sta.flagKeyChanging = 0; -#else - if(wd->sta.flagKeyChanging) - { - zmw_enter_critical_section(dev); - wd->sta.flagKeyChanging--; - zmw_leave_critical_section(dev); - } -#endif - zm_debug_msg1(" zfCoreSetKeyComplete--- ", wd->sta.flagKeyChanging); - - zfPushVtxq(dev); -} - -void zfCoreHalInitComplete(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->halState = ZM_HAL_STATE_RUNNING; - zmw_leave_critical_section(dev); - - zfPushVtxq(dev); -} - -void zfCoreMacAddressNotify(zdev_t* dev, u8_t* addr) -{ - zmw_get_wlan_dev(dev); - - wd->macAddr[0] = addr[0] | ((u16_t)addr[1]<<8); - wd->macAddr[1] = addr[2] | ((u16_t)addr[3]<<8); - wd->macAddr[2] = addr[4] | ((u16_t)addr[5]<<8); - - - //zfHpSetMacAddress(dev, wd->macAddr, 0); - if (wd->zfcbMacAddressNotify != NULL) - { - wd->zfcbMacAddressNotify(dev, addr); - } -} - -void zfCoreSetIsoName(zdev_t* dev, u8_t* isoName) -{ - zmw_get_wlan_dev(dev); - - wd->ws.countryIsoName[0] = isoName[0]; - wd->ws.countryIsoName[1] = isoName[1]; - wd->ws.countryIsoName[2] = '\0'; - } - - -extern void zfScanMgrScanEventStart(zdev_t* dev); -extern u8_t zfScanMgrScanEventTimeout(zdev_t* dev); -extern void zfScanMgrScanEventRetry(zdev_t* dev); - -void zfProcessEvent(zdev_t* dev, u16_t* eventArray, u8_t eventCount) -{ - u8_t i, j, bypass = FALSE; - u16_t eventBypass[32]; - u8_t eventBypassCount = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zfZeroMemory((u8_t*) eventBypass, 64); - - for( i=0; ista.cmMicFailureCount = 0; - } - break; - - case ZM_EVENT_CM_DISCONNECT: - { - zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_DISCONNECT"); - - zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT); - - zmw_enter_critical_section(dev); - //zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER, - // ZM_TICK_CM_BLOCK_TIMEOUT); - - /* Timer Resolution on WinXP is 15/16 ms */ - /* Decrease Time offset for Counter Measure */ - zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER, - ZM_TICK_CM_BLOCK_TIMEOUT - ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET); - - zmw_leave_critical_section(dev); - wd->sta.cmMicFailureCount = 0; - //zfiWlanDisable(dev); - zfHpResetKeyCache(dev); - if (wd->zfcbConnectNotify != NULL) - { - wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL, - wd->sta.bssid); - } - } - break; - - case ZM_EVENT_CM_BLOCK_TIMER: - { - zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER"); - - //zmw_enter_critical_section(dev); - wd->sta.cmDisallowSsidLength = 0; - if ( wd->sta.bAutoReconnect ) - { - zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER:bAutoReconnect!=0"); - zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL); - zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL); - } - //zmw_leave_critical_section(dev); - } - break; - - case ZM_EVENT_TIMEOUT_ADDBA: - { - if (!wd->addbaComplete && (wd->addbaCount < 5)) - { - zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0); - wd->addbaCount++; - zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100); - } - else - { - zfTimerCancel(dev, ZM_EVENT_TIMEOUT_ADDBA); - } - } - break; - - #ifdef ZM_ENABLE_PERFORMANCE_EVALUATION - case ZM_EVENT_TIMEOUT_PERFORMANCE: - { - zfiPerformanceRefresh(dev); - } - break; - #endif - case ZM_EVENT_SKIP_COUNTERMEASURE: - //enable the Countermeasure - { - zm_debug_msg0("Countermeasure : Enable MIC Check "); - wd->TKIP_Group_KeyChanging = 0x0; - } - break; - - default: - break; - } - } -} - -void zfBssInfoCreate(zdev_t* dev) -{ - u8_t i; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - wd->sta.bssList.bssCount = 0; - wd->sta.bssList.head = NULL; - wd->sta.bssList.tail = NULL; - wd->sta.bssInfoArrayHead = 0; - wd->sta.bssInfoArrayTail = 0; - wd->sta.bssInfoFreeCount = ZM_MAX_BSS; - - for( i=0; i< ZM_MAX_BSS; i++ ) - { - //wd->sta.bssInfoArray[i] = &(wd->sta.bssInfoPool[i]); - wd->sta.bssInfoArray[i] = zfwMemAllocate(dev, sizeof(struct zsBssInfo)); - - } - - zmw_leave_critical_section(dev); -} - -void zfBssInfoDestroy(zdev_t* dev) -{ - u8_t i; - zmw_get_wlan_dev(dev); - - zfBssInfoRefresh(dev, 1); - - for( i=0; i< ZM_MAX_BSS; i++ ) - { - if (wd->sta.bssInfoArray[i] != NULL) - { - zfwMemFree(dev, wd->sta.bssInfoArray[i], sizeof(struct zsBssInfo)); - } - else - { - zm_assert(0); - } - } - return; -} - -struct zsBssInfo* zfBssInfoAllocate(zdev_t* dev) -{ - struct zsBssInfo* pBssInfo; - - zmw_get_wlan_dev(dev); - - if (wd->sta.bssInfoFreeCount == 0) - return NULL; - - pBssInfo = wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead]; - wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead] = NULL; - wd->sta.bssInfoArrayHead = (wd->sta.bssInfoArrayHead + 1) & (ZM_MAX_BSS - 1); - wd->sta.bssInfoFreeCount--; - - zfZeroMemory((u8_t*)pBssInfo, sizeof(struct zsBssInfo)); - - return pBssInfo; -} - -void zfBssInfoFree(zdev_t* dev, struct zsBssInfo* pBssInfo) -{ - zmw_get_wlan_dev(dev); - - zm_assert(wd->sta.bssInfoArray[wd->sta.bssInfoArrayTail] == NULL); - - pBssInfo->signalStrength = pBssInfo->signalQuality = 0; - pBssInfo->sortValue = 0; - - wd->sta.bssInfoArray[wd->sta.bssInfoArrayTail] = pBssInfo; - wd->sta.bssInfoArrayTail = (wd->sta.bssInfoArrayTail + 1) & (ZM_MAX_BSS - 1); - wd->sta.bssInfoFreeCount++; -} - -void zfBssInfoReorderList(zdev_t* dev) -{ - struct zsBssInfo* pBssInfo = NULL; - struct zsBssInfo* pInsBssInfo = NULL; - struct zsBssInfo* pNextBssInfo = NULL; - struct zsBssInfo* pPreBssInfo = NULL; - u8_t i = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - if (wd->sta.bssList.bssCount > 1) - { - pInsBssInfo = wd->sta.bssList.head; - wd->sta.bssList.tail = pInsBssInfo; - pBssInfo = pInsBssInfo->next; - pInsBssInfo->next = NULL; - while (pBssInfo != NULL) - { - i = 0; - while (1) - { -// if (pBssInfo->signalStrength >= pInsBssInfo->signalStrength) - if( pBssInfo->sortValue >= pInsBssInfo->sortValue) - { - if (i==0) - { - //Insert BssInfo to head - wd->sta.bssList.head = pBssInfo; - pNextBssInfo = pBssInfo->next; - pBssInfo->next = pInsBssInfo; - break; - } - else - { - //Insert BssInfo to neither head nor tail - pPreBssInfo->next = pBssInfo; - pNextBssInfo = pBssInfo->next; - pBssInfo->next = pInsBssInfo; - break; - } - } - else - { - if (pInsBssInfo->next != NULL) - { - //Signal strength smaller than current BssInfo, check next - pPreBssInfo = pInsBssInfo; - pInsBssInfo = pInsBssInfo->next; - } - else - { - //Insert BssInfo to tail - pInsBssInfo->next = pBssInfo; - pNextBssInfo = pBssInfo->next; - wd->sta.bssList.tail = pBssInfo; - pBssInfo->next = NULL; - break; - } - } - i++; - } - pBssInfo = pNextBssInfo; - pInsBssInfo = wd->sta.bssList.head; - } - } //if (wd->sta.bssList.bssCount > 1) - - zmw_leave_critical_section(dev); -} - -void zfBssInfoInsertToList(zdev_t* dev, struct zsBssInfo* pBssInfo) -{ - zmw_get_wlan_dev(dev); - - zm_assert(pBssInfo); - - //zm_debug_msg2("pBssInfo = ", pBssInfo); - - if ( wd->sta.bssList.bssCount == 0 ) - { - wd->sta.bssList.head = pBssInfo; - wd->sta.bssList.tail = pBssInfo; - } - else - { - wd->sta.bssList.tail->next = pBssInfo; - wd->sta.bssList.tail = pBssInfo; - } - - pBssInfo->next = NULL; - wd->sta.bssList.bssCount++; - - //zm_debug_msg2("bss count = ", wd->sta.bssList.bssCount); -} - -void zfBssInfoRemoveFromList(zdev_t* dev, struct zsBssInfo* pBssInfo) -{ - struct zsBssInfo* pNowBssInfo; - struct zsBssInfo* pPreBssInfo = NULL; - u8_t i; - - zmw_get_wlan_dev(dev); - - zm_assert(pBssInfo); - zm_assert(wd->sta.bssList.bssCount); - - //zm_debug_msg2("pBssInfo = ", pBssInfo); - - pNowBssInfo = wd->sta.bssList.head; - - for( i=0; ista.bssList.bssCount; i++ ) - { - if ( pNowBssInfo == pBssInfo ) - { - if ( i == 0 ) - { /* remove head */ - wd->sta.bssList.head = pBssInfo->next; - } - else - { - pPreBssInfo->next = pBssInfo->next; - } - - if ( i == (wd->sta.bssList.bssCount - 1) ) - { /* remove tail */ - wd->sta.bssList.tail = pPreBssInfo; - } - - break; - } - - pPreBssInfo = pNowBssInfo; - pNowBssInfo = pNowBssInfo->next; - } - - zm_assert(i != wd->sta.bssList.bssCount); - wd->sta.bssList.bssCount--; - - //zm_debug_msg2("bss count = ", wd->sta.bssList.bssCount); -} - -void zfBssInfoRefresh(zdev_t* dev, u16_t mode) -{ - struct zsBssInfo* pBssInfo; - struct zsBssInfo* pNextBssInfo; - u8_t i, bssCount; - - zmw_get_wlan_dev(dev); - - pBssInfo = wd->sta.bssList.head; - bssCount = wd->sta.bssList.bssCount; - - for( i=0; inext; - zfBssInfoRemoveFromList(dev, pBssInfo); - zfBssInfoFree(dev, pBssInfo); - pBssInfo = pNextBssInfo; - } - else - { - if ( pBssInfo->flag & ZM_BSS_INFO_VALID_BIT ) - { /* this one must be kept */ - pBssInfo->flag &= ~ZM_BSS_INFO_VALID_BIT; - pBssInfo = pBssInfo->next; - } - else - { - #define ZM_BSS_CACHE_TIME_IN_MS 20000 - if ((wd->tick - pBssInfo->tick) > (ZM_BSS_CACHE_TIME_IN_MS/ZM_MS_PER_TICK)) - { - pNextBssInfo = pBssInfo->next; - zfBssInfoRemoveFromList(dev, pBssInfo); - zfBssInfoFree(dev, pBssInfo); - pBssInfo = pNextBssInfo; - } - else - { - pBssInfo = pBssInfo->next; - } - } - } - } //for( i=0; i 49 ) - { - tmpLength = 49; - } - - zfMemoryCopy(buf, value, tmpLength); - buf[tmpLength] = '\0'; - //printk("SSID: %s\n", buf); - //zm_debug_msg_s("ssid = ", value); -} - -void zfCoreReinit(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - wd->sta.flagKeyChanging = 0; - wd->sta.flagFreqChanging = 0; -} - -void zfGenerateRandomBSSID(zdev_t* dev, u8_t *MACAddr, u8_t *BSSID) -{ - //ULONGLONG time; - u32_t time; - - zmw_get_wlan_dev(dev); - - time = wd->tick; - - // - // Initialize the random BSSID to be the same as MAC address. - // - - // RtlCopyMemory(BSSID, MACAddr, sizeof(DOT11_MAC_ADDRESS)); - zfMemoryCopy(BSSID, MACAddr, 6); - - // - // Get the system time in 10 millisecond. - // - - // NdisGetCurrentSystemTime((PLARGE_INTEGER)&time); - // time /= 100000; - - // - // Randomize the first 4 bytes of BSSID. - // - - BSSID[0] ^= (u8_t)(time & 0xff); - BSSID[0] &= ~0x01; // Turn off multicast bit - BSSID[0] |= 0x02; // Turn on local bit - - time >>= 8; - BSSID[1] ^= (u8_t)(time & 0xff); - - time >>= 8; - BSSID[2] ^= (u8_t)(time & 0xff); - - time >>= 8; - BSSID[3] ^= (u8_t)(time & 0xff); -} - -u8_t zfiWlanGetDestAddrFromBuf(zdev_t *dev, zbuf_t *buf, u16_t *macAddr) -{ -#ifdef ZM_ENABLE_NATIVE_WIFI - zmw_get_wlan_dev(dev); - - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - /* DA */ - macAddr[0] = zmw_tx_buf_readh(dev, buf, 16); - macAddr[1] = zmw_tx_buf_readh(dev, buf, 18); - macAddr[2] = zmw_tx_buf_readh(dev, buf, 20); - } - else if ( wd->wlanMode == ZM_MODE_IBSS ) - { - /* DA */ - macAddr[0] = zmw_tx_buf_readh(dev, buf, 4); - macAddr[1] = zmw_tx_buf_readh(dev, buf, 6); - macAddr[2] = zmw_tx_buf_readh(dev, buf, 8); - } - else if ( wd->wlanMode == ZM_MODE_AP ) - { - /* DA */ - macAddr[0] = zmw_tx_buf_readh(dev, buf, 4); - macAddr[1] = zmw_tx_buf_readh(dev, buf, 6); - macAddr[2] = zmw_tx_buf_readh(dev, buf, 8); - } - else - { - return 1; - } -#else - /* DA */ - macAddr[0] = zmw_tx_buf_readh(dev, buf, 0); - macAddr[1] = zmw_tx_buf_readh(dev, buf, 2); - macAddr[2] = zmw_tx_buf_readh(dev, buf, 4); -#endif - - return 0; -} - -/* Leave an empty line below to remove warning message on some compiler */ - -u16_t zfFindCleanFrequency(zdev_t* dev, u32_t adhocMode) -{ - u8_t i, j; - u16_t returnChannel; - u16_t count_24G = 0, min24GIndex = 0; - u16_t count_5G = 0, min5GIndex = 0; - u16_t CombinationBssNumberIn24G[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - u16_t BssNumberIn24G[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - u16_t Array_24G[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - u16_t BssNumberIn5G[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - u16_t Array_5G[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - struct zsBssInfo* pBssInfo; - - zmw_get_wlan_dev(dev); - - pBssInfo = wd->sta.bssList.head; - if (pBssInfo == NULL) - { - if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G || - adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG ) - { - returnChannel = zfChGetFirst2GhzChannel(dev); - } - else - { - returnChannel = zfChGetFirst5GhzChannel(dev); - } - - return returnChannel; - } - - /* #1 Get Allowed Channel following Country Code ! */ - zmw_declare_for_critical_section(); - zmw_enter_critical_section(dev); - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) - { - if (wd->regulationTable.allowChannel[i].channel < 3000) - { // 2.4GHz - Array_24G[count_24G] = wd->regulationTable.allowChannel[i].channel; - count_24G++; - } - else - { // 5GHz - count_5G++; - Array_5G[i] = wd->regulationTable.allowChannel[i].channel; - } - } - zmw_leave_critical_section(dev); - - while( pBssInfo != NULL ) - { - /* #2_1 Count BSS number in some specificed frequency in 2.4GHz band ! */ - if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G || - adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG ) - { - for( i=0; i<=(count_24G+3); i++ ) - { - if( pBssInfo->frequency == Array_24G[i] ) - { // Array_24G[0] correspond to BssNumberIn24G[2] - BssNumberIn24G[pBssInfo->channel+1]++; - } - } - } - - /* #2_2 Count BSS number in some specificed frequency in 5GHz band ! */ - if( adhocMode == ZM_ADHOCBAND_A || adhocMode == ZM_ADHOCBAND_ABG ) - { - for( i=0; ifrequency == Array_5G[i] ) - { // Array_5G[0] correspond to BssNumberIn5G[0] - BssNumberIn5G[i]++; - } - } - } - - pBssInfo = pBssInfo->next; - } - -#if 0 - for(i=0; i<=(count_24G+3); i++) - { - printk("2.4GHz Before combin, %d BSS network : %d", i, BssNumberIn24G[i]); - } - - for(i=0; ista.bssid, 6) ) - { - return 1; - } - else - { - return 0; - } -} diff --git a/drivers/staging/otus/80211core/cfunc.h b/drivers/staging/otus/80211core/cfunc.h deleted file mode 100644 index fc7548c39d1b..000000000000 --- a/drivers/staging/otus/80211core/cfunc.h +++ /dev/null @@ -1,449 +0,0 @@ -/* - * 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 */ diff --git a/drivers/staging/otus/80211core/chb.c b/drivers/staging/otus/80211core/chb.c deleted file mode 100644 index 7fac15011256..000000000000 --- a/drivers/staging/otus/80211core/chb.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * 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; ista.bssList.bssCount; i++ ) - { - if ( i ) - { - zm_debug_msg0("---------------------------"); - } - - zm_debug_msg1("BSS #", i); - for(j=0; jssid[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; jsupportedRates[1]; j++ ) - { - zm_debug_msg2("supported rates = ", pBssInfo->supportedRates[2+j]); - } - } - - for( j=0; jextSupportedRates[1]; j++ ) - { - zm_debug_msg2("ext supported rates = ", pBssInfo->extSupportedRates[2+j]); - } - - pBssInfo = pBssInfo->next; - } - zmw_leave_critical_section(dev); - - zm_debug_msg0("***************************"); -} - diff --git a/drivers/staging/otus/80211core/cic.c b/drivers/staging/otus/80211core/cic.c deleted file mode 100644 index 53c09a0935fc..000000000000 --- a/drivers/staging/otus/80211core/cic.c +++ /dev/null @@ -1,499 +0,0 @@ -/* - * 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; ibRate |= 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; ista.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); - i = zfApFindSta(dev, (u16_t*)rsp); - if (i != 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); - i = zfApFindSta(dev, (u16_t*)rsp); - if (i != 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); - i = zfApFindSta(dev, (u16_t*)rsp); - if (i != 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 -} diff --git a/drivers/staging/otus/80211core/cinit.c b/drivers/staging/otus/80211core/cinit.c deleted file mode 100644 index 11823311e9ce..000000000000 --- a/drivers/staging/otus/80211core/cinit.c +++ /dev/null @@ -1,1912 +0,0 @@ -/* - * 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 : init.c */ -/* */ -/* Abstract */ -/* This module contains init functions. */ -/* */ -/* NOTES */ -/* None */ -/* */ -/************************************************************************/ -#include "cprecomp.h" -#include "../hal/hpreg.h" - -extern const u8_t zcUpToAc[8]; - -u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000, - 24000, 12000, 6000, 54000, 36000, 18000, 9000}; -u32_t zcIndextoRateN20L[16] = {6500, 13000, 19500, 26000, 39000, 52000, 58500, - 65000, 13000, 26000, 39000, 52000, 78000, 104000, - 117000, 130000}; -u32_t zcIndextoRateN20S[16] = {7200, 14400, 21700, 28900, 43300, 57800, 65000, - 72200, 14400, 28900, 43300, 57800, 86700, 115600, - 130000, 144400}; -u32_t zcIndextoRateN40L[16] = {13500, 27000, 40500, 54000, 81000, 108000, 121500, - 135000, 27000, 54000, 81000, 108000, 162000, 216000, - 243000, 270000}; -u32_t zcIndextoRateN40S[16] = {15000, 30000, 45000, 60000, 90000, 120000, 135000, - 150000, 30000, 60000, 90000, 120000, 180000, 240000, - 270000, 300000}; - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfTxGenWlanHeader */ -/* Generate WLAN MAC header and LLC header. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer pointer */ -/* id : Index of TxD */ -/* port : WLAN port */ -/* */ -/* OUTPUTS */ -/* length of removed Ethernet header */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2005.5 */ -/* */ -/************************************************************************/ -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 len; - u16_t macCtrl; - u32_t phyCtrl; - u16_t hlen = 16; - u16_t icvLen = 0; - u16_t wdsPortId; - u16_t vap = 0; - u16_t mcs = 0; - u16_t mt = 0; - u8_t qosType; - u8_t b1, b2; - u16_t wdsPort; - u8_t encExemptionActionType; - u16_t rateProbingFlag = 0; - u8_t tkipFrameOffset = 0; - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - u8_t res, peerIdx; - u8_t userIdx=0; - u16_t *iv16; - u32_t *iv32; -#endif - - zmw_get_wlan_dev(dev); - - /* Generate WLAN header */ - /* Frame control */ - header[4] = 0x0008 | (flag<<8); - /* Duration */ - header[5] = 0x0000; - - if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) - { - /* ToDS bit */ - header[4] |= 0x0100; - - /*Sometimes we wake up to tx/rx but AP still think we are sleeping, so still need to set this bit*/ - if ( zfPowerSavingMgrIsSleeping(dev) || wd->sta.psMgr.tempWakeUp == 1 ) - { - header[4] |= 0x1000; - } - - /* Address 1 = BSSID */ - header[6] = wd->sta.bssid[0]; - header[7] = wd->sta.bssid[1]; - header[8] = wd->sta.bssid[2]; - /* Address 3 = DA */ - header[12] = da[0]; - header[13] = da[1]; - header[14] = da[2]; - } - else if (wd->wlanMode == ZM_MODE_PSEUDO) - { - /* Address 1 = DA */ - header[6] = da[0]; - header[7] = da[1]; - header[8] = da[2]; - /* Address 3 = 00:00:00:00:00:00 */ - header[12] = 0; - header[13] = 0; - header[14] = 0; - - /* PSEUDO test : WDS */ - if (wd->enableWDS) - { - /* ToDS and FromDS bit */ - header[4] |= 0x0300; - - /* Address 4 = SA */ - header[16] = 0; - header[17] = 0; - header[18] = 0; - - hlen = 19; - } - } - else if (wd->wlanMode == ZM_MODE_IBSS) - { - /* Address 1 = DA */ - header[6] = da[0]; - header[7] = da[1]; - header[8] = da[2]; - /* Address 3 = BSSID */ - header[12] = wd->sta.bssid[0]; - header[13] = wd->sta.bssid[1]; - header[14] = wd->sta.bssid[2]; - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - zmw_enter_critical_section(dev); - res = zfStaFindOppositeByMACAddr(dev, da, &peerIdx); - if(res == 0) // Find opposite in our OppositeInfo Structure ! - { - userIdx = peerIdx; - } - zmw_leave_critical_section(dev); -#endif - } - else if (wd->wlanMode == ZM_MODE_AP) - { - if (port < 0x20) - /* AP mode */ - { - /* FromDS bit */ - header[4] |= 0x0200; - - /* Address 1 = DA */ - header[6] = da[0]; - header[7] = da[1]; - header[8] = da[2]; - /* Address 3 = SA */ - header[12] = sa[0]; - header[13] = sa[1]; - header[14] = sa[2]; - - if (port < ZM_MAX_AP_SUPPORT) - { - vap = port; - header[14] += (vap<<8); - } - } - else - /* WDS port */ - { - /* ToDS and FromDS bit */ - header[4] |= 0x0300; - - wdsPortId = port - 0x20; - - /* Address 1 = RA */ - header[6] = wd->ap.wds.macAddr[wdsPortId][0]; - header[7] = wd->ap.wds.macAddr[wdsPortId][1]; - header[8] = wd->ap.wds.macAddr[wdsPortId][2]; - /* Address 3 = DA */ - header[12] = da[0]; - header[13] = da[1]; - header[14] = da[2]; - /* Address 4 = SA */ - header[16] = sa[0]; - header[17] = sa[1]; - header[18] = sa[2]; - - hlen = 19; - } - } /* else if (wd->wlanMode == ZM_MODE_AP) */ - - /* Address 2 = TA */ - header[9] = wd->macAddr[0]; - header[10] = wd->macAddr[1]; -#ifdef ZM_VAPMODE_MULTILE_SSID - header[11] = wd->macAddr[2]; //Multiple SSID -#else - header[11] = wd->macAddr[2] + (vap<<8); //VAP -#endif - - if ( (wd->wlanMode == ZM_MODE_IBSS) && (wd->XLinkMode) ) - { - header[9] = sa[0]; - header[10] = sa[1]; - header[11] = sa[2]; - } - - /* Sequence Control */ - header[15] = seq; - - - if (wd->wlanMode == ZM_MODE_AP) - { - zfApGetStaTxRateAndQosType(dev, da, &phyCtrl, &qosType, &rateProbingFlag); - mt = (u16_t)(phyCtrl & 0x3); - mcs = (u16_t)((phyCtrl >> 16) & 0x3f); -#if 1 - //zfApGetStaQosType(dev, da, &qosType); - - /* if DA == WME STA */ - if (qosType == 1) - { - /* QoS data */ - header[4] |= 0x0080; - - /* QoS Control */ - header[hlen] = up; - hlen += 1; - } -#endif - } - -#if 0 - //AGG Test Code - if (header[6] == 0x8000) - { - /* QoS data */ - header[4] |= 0x0080; - - /* QoS Control */ - header[hlen] = 0; - hlen += 1; - } -#endif - - if (wd->wlanMode == ZM_MODE_AP) { - /* Todo: rate control here for qos field */ - } - else { - /* Rate control */ - zfStaGetTxRate(dev, da, &phyCtrl, &rateProbingFlag); - mt = (u16_t)(phyCtrl & 0x3); - mcs = (u16_t)((phyCtrl >> 16) & 0x3f); - } - - if (wd->txMCS != 0xff) - { - /* fixed rate */ - phyCtrl = ((u32_t)wd->txMCS<<16) + wd->txMT; - mcs = wd->txMCS; - mt = wd->txMT; - } - - if (wd->enableAggregation) - { - /* force enable aggregation */ - if (wd->enableAggregation==2 && !(header[6]&0x1)) - { - /* QoS data */ - header[4] |= 0x0080; - - /* QoS Control */ - header[hlen] = 0; - hlen += 1; - } - /* if wd->enableAggregation=1 => force disable */ - /* if wd->enableAggregation=0 => auto */ - } - -#ifdef ZM_ENABLE_AGGREGATION - /* - * aggregation control - */ - - /* - * QoS data - */ - if (wd->wlanMode == ZM_MODE_AP) { - if (aggControl && mt == 2) { - if (wd->enableAggregation==0 && !(header[6]&0x1)) - { - header[4] |= 0x0080; - - /* - * QoS Control - */ - header[hlen] = 0; - hlen += 1; - } - } - } -#endif - - // MSDU Length - len = zfwBufGetSize(dev, buf); - - /* Generate control setting */ - /* Backoff, Non-Burst and hardware duration */ - macCtrl = 0x208; - - /* ACK */ - if ((header[6] & 0x1) == 0x1) - { - /* multicast frame : Set NO-ACK bit */ - macCtrl |= 0x4; - } - else - { - /* unicast frame */ - #if 0 - // Enable RTS according to MPDU Lengths ( not MSDU Lengths ) - if (len >= wd->rtsThreshold) - { - /* Enable RTS */ - macCtrl |= 1; - } - #endif - } - /* VAP test code */ - //macCtrl |= 0x4; - - if (wd->wlanMode == ZM_MODE_AP) - { - u8_t encryType; - u16_t iv16; - u32_t iv32; - - /* Check whether this is a multicast frame */ - if ((header[6] & 0x1) == 0x1) - { - /* multicast frame */ - if (wd->ap.encryMode[vap] == ZM_TKIP) - { - wd->ap.iv16[vap]++; - - if(wd->ap.iv16[vap] == 0) - { - wd->ap.iv32[vap]++; - } - - b1 = (u8_t) (wd->ap.iv16[vap] >> 8); - b2 = (b1 | 0x20) & 0x7f; - header[hlen] = ((u16_t)b2 << 8) + b1; - b1 = (u8_t) wd->ap.iv16[vap]; - b2 = 0x20 | (wd->ap.bcKeyIndex[vap] << 6); - header[hlen+1] = ((u16_t)b2 << 8) + b1; - header[hlen+2] = (u16_t) wd->ap.iv32[vap]; - header[hlen+3] = (u16_t) (wd->ap.iv32[vap] >> 16); - - //macCtrl |= 0x80; - macCtrl |= 0x40; - icvLen = 4; - - /* set hardware MIC */ - if ( (!(seq & 0xf))&&(!(flag & 0x4)) ) - { - macCtrl |= 0x100; - plusLen += 8; - *micLen = 8; - } - - header[4] |= 0x4000; - hlen += 4; - } - else if (wd->ap.encryMode[vap] == ZM_AES) - { - wd->ap.iv16[vap]++; - - if(wd->ap.iv16[vap] == 0) - { - wd->ap.iv32[vap]++; - } - - b1 = (u8_t) wd->ap.iv16[vap]; - b2 = (u8_t) (wd->ap.iv16[vap] >> 8); - header[hlen] = ((u16_t)b2 << 8) + b1; - header[hlen+1] = 0x2000 | (wd->ap.bcKeyIndex[vap] << 14); - header[hlen+2] = (u16_t) (wd->ap.iv32[vap]); - header[hlen+3] = (u16_t) (wd->ap.iv32[vap] >> 16); - - macCtrl |= 0xc0; - icvLen = 8; /* MIC */ - - header[4] |= 0x4000; - hlen += 4; - } - #ifdef ZM_ENABLE_CENC - else if (wd->ap.encryMode[vap] == ZM_CENC) - { - //u32_t txiv[4]; - - wd->ap.txiv[vap][0]++; - - if (wd->ap.txiv[vap][0] == 0) - { - wd->ap.txiv[vap][1]++; - } - - if (wd->ap.txiv[vap][1] == 0) - { - wd->ap.txiv[vap][2]++; - } - - if (wd->ap.txiv[vap][2] == 0) - { - wd->ap.txiv[vap][3]++; - } - - if (wd->ap.txiv[vap][3] == 0) - { - wd->ap.txiv[vap][0] = 0; - wd->ap.txiv[vap][1] = 0; - wd->ap.txiv[vap][2] = 0; - } - - header[hlen] = (wd->ap.bcKeyIndex[vap] & 0x0001); /* For Key Id and reserved field */ - header[hlen+1] = (u16_t)wd->ap.txiv[vap][0]; - header[hlen+2] = (u16_t)(wd->ap.txiv[vap][0] >> 16); - header[hlen+3] = (u16_t)wd->ap.txiv[vap][1]; - header[hlen+4] = (u16_t)(wd->ap.txiv[vap][1] >> 16); - header[hlen+5] = (u16_t)wd->ap.txiv[vap][2]; - header[hlen+6] = (u16_t)(wd->ap.txiv[vap][2] >> 16); - header[hlen+7] = (u16_t)wd->ap.txiv[vap][3]; - header[hlen+8] = (u16_t)(wd->ap.txiv[vap][3] >> 16); - - macCtrl |= 0x80; - icvLen = 16; /* MIC */ - - header[4] |= 0x4000; - hlen += 9; - } - #endif //ZM_ENABLE_CENC - } - else - { - /* Get STA's encryption type */ - zfApGetStaEncryType(dev, da, &encryType); - - if (encryType == ZM_TKIP) - { - /* Get iv16 and iv32 */ - zfApGetStaWpaIv(dev, da, &iv16, &iv32); - - iv16++; - if (iv16 == 0) - { - iv32++; - } - - b1 = (u8_t) (iv16 >> 8); - b2 = (b1 | 0x20) & 0x7f; - header[hlen] = ((u16_t)b2 << 8) + b1; - b1 = (u8_t) iv16; - b2 = 0x20; - header[hlen+1] = ((u16_t)b2 << 8) + b1; - header[hlen+2] = (u16_t) iv32; - header[hlen+3] = (u16_t) (iv32 >> 16); - - //macCtrl |= 0x80; - macCtrl |= 0x40; - icvLen = 4; - - /* set hardware MIC */ - if ( (!(seq & 0xf))&&(!(flag & 0x4)) ) - { - macCtrl |= 0x100; - plusLen += 8; - *micLen = 8; - } - - header[4] |= 0x4000; - hlen += 4; - - /* Set iv16 and iv32 */ - zfApSetStaWpaIv(dev, da, iv16, iv32); - } - else if (encryType == ZM_AES) - { - /* Get iv16 and iv32 */ - zfApGetStaWpaIv(dev, da, &iv16, &iv32); - - iv16++; - if (iv16 == 0) - { - iv32++; - } - - b1 = (u8_t) iv16; - b2 = (u8_t) (iv16 >> 8); - header[hlen] = ((u16_t)b2 << 8) + b1; - header[hlen+1] = 0x2000; - header[hlen+2] = (u16_t) (iv32); - header[hlen+3] = (u16_t) (iv32 >> 16); - - macCtrl |= 0xc0; - icvLen = 8; /* MIC */ - - header[4] |= 0x4000; - hlen += 4; - - /* Set iv16 and iv32 */ - zfApSetStaWpaIv(dev, da, iv16, iv32); - } - #ifdef ZM_ENABLE_CENC - else if (encryType == ZM_CENC) - { - u32_t txiv[4]; - u8_t keyIdx; - - /* Get CENC TxIV */ - zfApGetStaCencIvAndKeyIdx(dev, da, txiv, &keyIdx); - - txiv[0] += 2; - - if (txiv[0] == 0 || txiv[0] == 1) - { - txiv[1]++; - } - - if (txiv[1] == 0) - { - txiv[2]++; - } - - if (txiv[2] == 0) - { - txiv[3]++; - } - - if (txiv[3] == 0) - { - txiv[0] = 0; - txiv[1] = 0; - txiv[2] = 0; - } - - header[hlen] = (keyIdx & 0x0001); /* For Key Id and reserved field */ - header[hlen+1] = (u16_t)txiv[0]; - header[hlen+2] = (u16_t)(txiv[0] >> 16); - header[hlen+3] = (u16_t)txiv[1]; - header[hlen+4] = (u16_t)(txiv[1] >> 16); - header[hlen+5] = (u16_t)txiv[2]; - header[hlen+6] = (u16_t)(txiv[2] >> 16); - header[hlen+7] = (u16_t)txiv[3]; - header[hlen+8] = (u16_t)(txiv[3] >> 16); - - macCtrl |= 0x80; - icvLen = 16; /* MIC */ - - header[4] |= 0x4000; - hlen += 9; - - /* Set CENC IV */ - zfApSetStaCencIv(dev, da, txiv); - } - #endif //ZM_ENABLE_CENC - } - - /* protection mode */ - if (wd->ap.protectionMode == 1) - { - /* Enable Self-CTS */ - macCtrl &= 0xFFFC; - macCtrl |= 2; - } - - /* Rate Control */ - if (port < 0x20) - { - /* AP */ - /* IV */ - if ((wd->ap.encryMode[vap] == ZM_WEP64) || - (wd->ap.encryMode[vap] == ZM_WEP128) || - (wd->ap.encryMode[vap] == ZM_WEP256)) - { - header[4] |= 0x4000; - header[hlen] = 0x0; //IV - header[hlen+1] = wd->ap.bcKeyIndex[vap] << 14; //IV with Keyid--CWYang(m) - hlen += 2; - icvLen = 4; - macCtrl |= 0x40; - } - } - else - { - /* WDS */ - - /* TODO : Fixed rate to 54M */ - phyCtrl = 0xc0001; //PHY control L - - /* WDS port checking */ - wdsPort = port - 0x20; - if (wdsPort >= ZM_MAX_WDS_SUPPORT) - { - wdsPort = 0; - } - - #if 1 - /* IV */ - switch (wd->ap.wds.encryMode[wdsPort]) - { - case ZM_WEP64: - case ZM_WEP128: - case ZM_WEP256: - header[4] |= 0x4000; - header[hlen] = 0x0; //IV - header[hlen+1] = wd->ap.bcKeyIndex[vap] << 14; //IV with Keyid - hlen += 2; - icvLen = 4; - macCtrl |= 0x40; - break; - - case ZM_TKIP: - wd->sta.iv16++; - - if ( wd->sta.iv16 == 0 ) - { - wd->sta.iv32++; - } - - b1 = (u8_t) (wd->sta.iv16 >> 8); - b2 = (b1 | 0x20) & 0x7f; - header[hlen] = ((u16_t)b2 << 8) + b1; - b1 = (u8_t) wd->sta.iv16; - b2 = 0x20; - header[hlen+1] = ((u16_t)b2 << 8) + b1; - header[hlen+2] = (u16_t) wd->sta.iv32; - header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16); - - //macCtrl |= 0x80; - macCtrl |= 0x40; - icvLen = 4; - - /* set hardware MIC */ - if ( (!(seq & 0xf))&&(!(flag & 0x4)) ) - { - macCtrl |= 0x100; - plusLen += 8; - *micLen = 8; - } - - header[4] |= 0x4000; - hlen += 4; - break; - - case ZM_AES: - wd->sta.iv16++; - if ( wd->sta.iv16 == 0 ) - { - wd->sta.iv32++; - } - - b1 = (u8_t) wd->sta.iv16; - b2 = (u8_t) (wd->sta.iv16 >> 8); - header[hlen] = ((u16_t)b2 << 8) + b1; - header[hlen+1] = 0x2000; - header[hlen+2] = (u16_t) (wd->sta.iv32); - header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16); - - macCtrl |= 0xc0; /* Set to AES in control setting */ - icvLen = 8; /* MIC */ - - header[4] |= 0x4000; /* Set WEP bit in wlan header */ - hlen += 4; /* plus IV length */ - break; - }/* end of switch */ - #endif - } - } - else /* wd->wlanMode != ZM_MODE_AP */ - { - encExemptionActionType = zfwGetPktEncExemptionActionType(dev, buf); - - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - #if 1 - /* if WME AP */ - if (wd->sta.wmeConnected != 0) - { - /* QoS data */ - header[4] |= 0x0080; - - /* QoS Control */ - header[hlen] = up; - hlen += 1; - } - #endif - - if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION ) - { - if ( wd->sta.authMode < ZM_AUTH_MODE_WPA ) - { /* non-WPA */ - if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED ) - { - if ( (wd->sta.encryMode == ZM_WEP64)|| - (wd->sta.encryMode == ZM_WEP128)|| - (wd->sta.encryMode == ZM_WEP256) ) - { - header[4] |= 0x4000; - header[hlen] = 0x0; //IV - header[hlen+1] = 0x0; //IV - header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14); - hlen += 2; - icvLen = 4; - - /* For Software WEP */ - if ((wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) != 0) - { - u8_t keyLen = 5; - u8_t iv[3]; - - iv[0] = 0x0; - iv[1] = 0x0; - iv[2] = 0x0; - - if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP64) - { - keyLen = 5; - } - else if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP128) - { - keyLen = 13; - } - else if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP256) - { - keyLen = 29; - } - - zfWEPEncrypt(dev, buf, (u8_t*) snap, snapLen, minusLen, keyLen, - wd->sta.wepKey[wd->sta.keyId], iv); - } - else - { - macCtrl |= 0x40; - } - } - } - } - else - { /* WPA */ - if ( wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK ) - { - wd->sta.iv16++; - if ( wd->sta.iv16 == 0 ) - { - wd->sta.iv32++; - } - - /* set encryption mode */ - if ( wd->sta.encryMode == ZM_TKIP ) - { - b1 = (u8_t) (wd->sta.iv16 >> 8); - b2 = (b1 | 0x20) & 0x7f; - header[hlen] = ((u16_t)b2 << 8) + b1; - b1 = (u8_t) wd->sta.iv16; - b2 = 0x20; - - // header[hlen+1] = (((u16_t) wd->sta.keyId) << 14) | (((u16_t)b2 << 8) + b1); - // STA in infrastructure mode should use keyId = 0 to transmit unicast ! - header[hlen+1] = (((u16_t)b2 << 8) + b1); - header[hlen+2] = (u16_t) wd->sta.iv32; - header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16); - - /* If software encryption enable */ - if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0) - { - //macCtrl |= 0x80; - /* TKIP same to WEP */ - macCtrl |= 0x40; - icvLen = 4; - - /* set hardware MIC */ - if ( (!(seq & 0xf))&&(!(flag & 0x4)) ) - { - macCtrl |= 0x100; - plusLen += 8; - *micLen = 8; - } - } - else - { - u8_t mic[8]; - u16_t offset; - u32_t icv; - u8_t RC4Key[16]; - - /* TODO: Remove the criticial section here. */ - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - /* Calculate MIC */ - zfCalTxMic(dev, buf, (u8_t *)snap, snapLen, minusLen, da, sa, up, mic); - - offset = zfwBufGetSize(dev, buf); - - /* Append MIC to the buffer */ - zfCopyToIntTxBuffer(dev, buf, mic, offset, 8); - zfwBufSetSize(dev, buf, offset+8); - zmw_leave_critical_section(dev); - - /* TKIP Key Mixing */ - zfTkipPhase1KeyMix(wd->sta.iv32, &wd->sta.txSeed); - zfTkipPhase2KeyMix(wd->sta.iv16, &wd->sta.txSeed); - zfTkipGetseeds(wd->sta.iv16, RC4Key, &wd->sta.txSeed); - - /* Encrypt Data */ - zfTKIPEncrypt(dev, buf, (u8_t *)snap, snapLen, minusLen, 16, RC4Key, &icv); - - icvLen = 4; - len += 8; - } - - header[4] |= 0x4000; - hlen += 4; - } - else if ( wd->sta.encryMode == ZM_AES ) - { - b1 = (u8_t) wd->sta.iv16; - b2 = (u8_t) (wd->sta.iv16 >> 8); - header[hlen] = ((u16_t)b2 << 8) + b1; - // header[hlen+1] = (((u16_t) wd->sta.keyId) << 14) | (0x2000); - // STA in infrastructure mode should use keyId = 0 to transmit unicast ! - header[hlen+1] = 0x2000; - header[hlen+2] = (u16_t) (wd->sta.iv32); - header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16); - - macCtrl |= 0xc0; - icvLen = 8; /* MIC */ - - header[4] |= 0x4000; - hlen += 4; - } - #ifdef ZM_ENABLE_CENC - else if ( wd->sta.encryMode == ZM_CENC ) - { - /* Accumlate the PN sequence */ - wd->sta.txiv[0] += 2; - - if (wd->sta.txiv[0] == 0 || wd->sta.txiv[0] == 1) - { - wd->sta.txiv[1]++; - } - - if (wd->sta.txiv[1] == 0) - { - wd->sta.txiv[2]++; - } - - if (wd->sta.txiv[2] == 0) - { - wd->sta.txiv[3]++; - } - - if (wd->sta.txiv[3] == 0) - { - wd->sta.txiv[0] = 0; - wd->sta.txiv[1] = 0; - wd->sta.txiv[2] = 0; - } - - header[hlen] = (wd->sta.cencKeyId & 0x0001); /* For Key Id and reserved field */ - header[hlen+1] = (u16_t) wd->sta.txiv[0]; - header[hlen+2] = (u16_t) (wd->sta.txiv[0] >> 16); - header[hlen+3] = (u16_t) wd->sta.txiv[1]; - header[hlen+4] = (u16_t) (wd->sta.txiv[1] >> 16); - header[hlen+5] = (u16_t) wd->sta.txiv[2]; - header[hlen+6] = (u16_t) (wd->sta.txiv[2] >> 16); - header[hlen+7] = (u16_t) wd->sta.txiv[3]; - header[hlen+8] = (u16_t) (wd->sta.txiv[3] >> 16); - - macCtrl |= 0x80; - icvLen = 16; /* MIC */ - - header[4] |= 0x4000; - hlen += 9; - } - #endif //ZM_ENABLE_CENC - } - } - } // if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION ) - } /* if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE ) */ - - if ( wd->wlanMode == ZM_MODE_IBSS ) - { - if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION ) - { -#ifdef ZM_ENABLE_IBSS_WPA2PSK - if( wd->sta.oppositeInfo[userIdx].wpaState >= ZM_STA_WPA_STATE_PK_OK || wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK) - { - int isUnicast = 1 ; - - if((da[0]& 0x1)) - { - isUnicast = 0 ; // Not unicast , is broadcast - } - - if( wd->sta.ibssWpa2Psk == 1 ) - { /* The IV order is not the same between unicast and broadcast ! */ - if ( isUnicast ) - { - iv16 = &wd->sta.oppositeInfo[userIdx].iv16; - iv32 = &wd->sta.oppositeInfo[userIdx].iv32; - } - else - { - iv16 = &wd->sta.iv16; - iv32 = &wd->sta.iv32; - } - } - else - { - iv16 = &wd->sta.iv16; - iv32 = &wd->sta.iv32; - } - - (*iv16)++; - if ( *iv16 == 0 ) - { - *iv32++; - } - - if ( wd->sta.oppositeInfo[userIdx].encryMode == ZM_AES || wd->sta.encryMode == ZM_AES) - { - //printk("Station encryption mode is AES-CCMP\n") ; - b1 = (u8_t) (*iv16); - b2 = (u8_t) ((*iv16) >> 8); - header[hlen] = ((u16_t)b2 << 8) + b1; - - if ( isUnicast ) - { - header[hlen+1] = 0x2000; - } - else - { - header[hlen+1] = 0x2000 | (((u16_t) wd->sta.keyId) << 14); - } - - header[hlen+2] = (u16_t) (*iv32); - header[hlen+3] = (u16_t) ((*iv32) >> 16); - macCtrl |= 0xc0; - icvLen = 8; /* MIC */ - } - - header[4] |= 0x4000; - hlen += 4; - } - else if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED) - { - if ( (wd->sta.encryMode == ZM_WEP64)|| - (wd->sta.encryMode == ZM_WEP128)|| - (wd->sta.encryMode == ZM_WEP256) ) - { - header[4] |= 0x4000; - header[hlen] = 0x0; //IV - header[hlen+1] = 0x0; //IV - header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14); - hlen += 2; - icvLen = 4; - macCtrl |= 0x40; - } - } -#else - /* ----- 20070405 add by Mxzeng ----- */ - if( wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK ) - { - int isUnicast = 1 ; - - if((da[0]& 0x1)) - { - isUnicast = 0 ; // Not unicast , is broadcast - } - - wd->sta.iv16++; - if ( wd->sta.iv16 == 0 ) - { - wd->sta.iv32++; - } - - if ( wd->sta.encryMode == ZM_AES ) - { - //printk("Station encryption mode is AES-CCMP\n") ; - b1 = (u8_t) wd->sta.iv16; - b2 = (u8_t) (wd->sta.iv16 >> 8); - header[hlen] = ((u16_t)b2 << 8) + b1; - - if ( isUnicast ) - { - header[hlen+1] = 0x2000; - } - else - { - header[hlen+1] = 0x2000 | (((u16_t) wd->sta.keyId) << 14); - } - - header[hlen+2] = (u16_t) (wd->sta.iv32); - header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16); - macCtrl |= 0xc0; - icvLen = 8; /* MIC */ - } - - header[4] |= 0x4000; - hlen += 4; - } - else if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED) - { - if ( (wd->sta.encryMode == ZM_WEP64)|| - (wd->sta.encryMode == ZM_WEP128)|| - (wd->sta.encryMode == ZM_WEP256) ) - { - header[4] |= 0x4000; - header[hlen] = 0x0; //IV - header[hlen+1] = 0x0; //IV - header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14); - hlen += 2; - icvLen = 4; - macCtrl |= 0x40; - } - } -#endif - } // End if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION ) - } // End if ( wd->wlanMode == ZM_MODE_IBSS ) - else if ( wd->wlanMode == ZM_MODE_PSEUDO ) - { - switch (wd->sta.encryMode) - { - case ZM_WEP64: - case ZM_WEP128: - case ZM_WEP256: - header[4] |= 0x4000; - header[hlen] = 0x0; //IV - header[hlen+1] = 0x0; //IV - hlen += 2; - icvLen = 4; - macCtrl |= 0x40; - break; - - case ZM_TKIP: - { - wd->sta.iv16++; - if ( wd->sta.iv16 == 0 ) - { - wd->sta.iv32++; - } - - b1 = (u8_t) (wd->sta.iv16 >> 8); - b2 = (b1 | 0x20) & 0x7f; - header[hlen] = ((u16_t)b2 << 8) + b1; - b1 = (u8_t) wd->sta.iv16; - b2 = 0x20; - header[hlen+1] = ((u16_t)b2 << 8) + b1; - header[hlen+2] = (u16_t) wd->sta.iv32; - header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16); - - //macCtrl |= 0x80; - macCtrl |= 0x40; - icvLen = 4; - - /* set hardware MIC */ - if ( (!(seq & 0xf))&&(!(flag & 0x4)) ) - { - macCtrl |= 0x100; - plusLen += 8; - *micLen = 8; - } - - header[4] |= 0x4000; - hlen += 4; - }/* end of PSEUDO TKIP */ - break; - - case ZM_AES: - { - wd->sta.iv16++; - if ( wd->sta.iv16 == 0 ) - { - wd->sta.iv32++; - } - - b1 = (u8_t) wd->sta.iv16; - b2 = (u8_t) (wd->sta.iv16 >> 8); - header[hlen] = ((u16_t)b2 << 8) + b1; - header[hlen+1] = 0x2000; - header[hlen+2] = (u16_t) (wd->sta.iv32); - header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16); - macCtrl |= 0xc0; - icvLen = 8; /* MIC */ - header[4] |= 0x4000; - hlen += 4; - }/* end of PSEUDO AES */ - break; - - #ifdef ZM_ENABLE_CENC - case ZM_CENC: - /* Accumlate the PN sequence */ - wd->sta.txiv[0] += 2; - - if (wd->sta.txiv[0] == 0 || wd->sta.txiv[0] == 1) - { - wd->sta.txiv[1]++; - } - - if (wd->sta.txiv[1] == 0) - { - wd->sta.txiv[2]++; - } - - if (wd->sta.txiv[2] == 0) - { - wd->sta.txiv[3]++; - } - - if (wd->sta.txiv[3] == 0) - { - wd->sta.txiv[0] = 0; - wd->sta.txiv[1] = 0; - wd->sta.txiv[2] = 0; - } - - header[hlen] = 0; - header[hlen+1] = (u16_t) wd->sta.txiv[0]; - header[hlen+2] = (u16_t) (wd->sta.txiv[0] >> 16); - header[hlen+3] = (u16_t) wd->sta.txiv[1]; - header[hlen+4] = (u16_t) (wd->sta.txiv[1] >> 16); - header[hlen+5] = (u16_t) wd->sta.txiv[2]; - header[hlen+6] = (u16_t) (wd->sta.txiv[2] >> 16); - header[hlen+7] = (u16_t) wd->sta.txiv[3]; - header[hlen+8] = (u16_t) (wd->sta.txiv[3] >> 16); - - macCtrl |= 0x80; - icvLen = 16; /* MIC */ - - header[4] |= 0x4000; - hlen += 9; - break; - #endif //ZM_ENABLE_CENC - }/* end of switch */ - } - - /* Generate control setting */ - - /* protection mode */ - if (wd->enableProtectionMode) - { - if (wd->enableProtectionMode==2) - { - /* Force enable protection: self cts */ - macCtrl &= 0xFFFC; - macCtrl |= 2; - } - /* if wd->enableProtectionMode=1 => force disable */ - /* if wd->enableProtectionMode=0 => auto */ - } - else - { - - /* protection mode */ - if (wd->sta.bProtectionMode == TRUE) - { - /* Enable Self-CTS */ - macCtrl &= 0xFFFC; - macCtrl |= 2; - } - } - - } - - if (wd->txMCS != 0xff) - { - /* fixed rate */ - phyCtrl = ((u32_t)wd->txMCS<<16) + wd->txMT; - mcs = wd->txMCS; - mt = wd->txMT; - } - - if (mt == 2) - { -#if 0 - /* HT PT: 0 Mixed mode 1 Green field */ - if (wd->sta.preambleTypeHT == ZM_PREAMBLE_TYPE_GREEN_FIELD) - { - phyCtrl |= 0x4; /* Bit 2 */ - } -#endif - /* Bandwidth */ - if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) - { - phyCtrl |= (0x80<<16); /* BIT 23 */ - } -#if 0 - /* STBC */ - if (wd->sta.htCtrlSTBC<=0x3) - { - phyCtrl |= (wd->sta.htCtrlSTBC<<28); /* BIT 23 */ - } -#endif - /* Short GI */ - if(wd->sta.htCtrlSG) - { - phyCtrl |= (0x8000<<16); /* BIT 31 */ - } - - /* TA */ - if ( ((mcs >=0x8) && (mcs<=0xf)) || (wd->sta.htCtrlSTBC) ) - { - phyCtrl |= 0x1800; /* BIT 11 12 */ - } - } - else if(mt == 1) - { - #if 0 - //bug that cause OFDM rate become duplicate legacy rate - /* Bandwidth */ - if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) - { - phyCtrl |= (0x80<<16); /* BIT 23 */ - mt = 3; /* duplicate legacy */ - phyCtrl |= mt; - } - #endif - } - else if(mt == 0) - { - /* CCK PT: Legcy Preamble: 1 long preamble 2 short preamble */ - if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_SHORT) - { - //phyCtrl |= 0x4; /* BIT 2 */ - } - } - - /* TA */ - if (wd->sta.defaultTA) - { - phyCtrl |= 0x1000; - } - else - { - phyCtrl |= 0x0800; - } - - //Get CurrentTxRate -- CWYang(+) - if ((mt == 0) || (mt == 1)) //B,G Rate - { - if (mcs < 16) - { - wd->CurrentTxRateKbps = zcIndextoRateBG[mcs]; - } - } - else if (mt == 2) - { - if (mcs < 16) - { - if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) - { - if((phyCtrl & 0x80000000) != 0) - { - /* Short GI 40 MHz MIMO Rate */ - wd->CurrentTxRateKbps = zcIndextoRateN40S[mcs]; - } - else - { - /* Long GI 40 MHz MIMO Rate */ - wd->CurrentTxRateKbps = zcIndextoRateN40L[mcs]; - } - } - else - { - if((phyCtrl & 0x80000000) != 0) - { - /* Short GI 20 MHz MIMO Rate */ - wd->CurrentTxRateKbps = zcIndextoRateN20S[mcs]; - } - else - { - /* Long GI 20 MHz MIMO Rate */ - wd->CurrentTxRateKbps = zcIndextoRateN20L[mcs]; - } - } - } - } - - //802.11 header(include IV) = (hlen<<1)-8 - //ethernet frame = len - //snap + mic = plusLen - //ethernet header = minusLen - //icv = icvLen - //crc32 = 4 - //length=802.11 header+snap+(ethernet frame-ethernet header)+mic+icv+crc32 - header[0] = ((hlen<<1)-8)+plusLen+(len-minusLen)+icvLen+4; //Length - - // header[0] : MPDU Lengths - if ((header[6] & 0x1) != 0x1) // Unicast Frame - { - if (header[0] >= wd->rtsThreshold) - { - /* Enable RTS */ - macCtrl |= 1; - } - } - - if ( wd->sta.encryMode == ZM_TKIP ) - tkipFrameOffset = 8; - - if( wd->sta.EnableHT != 1 ) - { // Aggregation should not be fragmented ! - if ( header[0] > ( wd->fragThreshold + tkipFrameOffset ) ) - { - return 0; // Need to be fragmented ! ! - } - } - - //if ( wd->sta.encryMode == ZM_TKIP ) - //{ - // zm_debug_msg1("ctrl length = ", header[0]); - //} - - //MAC control - if (rateProbingFlag != 0) - { - macCtrl |= 0x8000; - } - header[1] = macCtrl; - //PHY control L - header[2] = (u16_t) ((phyCtrl&0xffff) | 0x700 | (zcUpToAc[up&0x7]<<13)); - //PHY control H - header[3] = (u16_t) ((phyCtrl>>16) | 0x700); - - if (wd->enableAggregation) - { - /* force enable aggregation */ - if (wd->enableAggregation==2 && !(header[6]&0x1)) - { - if (((header[2] & 0x3) == 2)) - { - /* Enable aggregation */ - header[1] |= 0x20; - } - } - /* if wd->enableAggregation=1 => force disable */ - /* if wd->enableAggregation=0 => auto */ - } - -#ifdef ZM_ENABLE_AGGREGATION - if (wd->addbaComplete) { - #ifdef ZM_BYPASS_AGGR_SCHEDULING - if (!(header[6]&0x1) && !rateProbingFlag && (wd->enableAggregation != 1)) - { - if (((header[2] & 0x3) == 2)) - { - /* Unicast frame with HT rate => Enable aggregation */ - /* We only support software encryption in single packet mode */ - if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0 && - (wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) == 0) - { - /* Set aggregation group bits per AC */ - header[1] |= (0x20 | (zcUpToAc[up&0x7]<<10)); - - //if (wd->sta.currentFrequency < 3000) - { - /* issue: -PB42 Enable RTS/CTS to prevent OWL Tx hang up */ - /* If this is Owl Ap, enable RTS/CTS protect */ - if ( (wd->sta.athOwlAp == 1) || (wd->sta.RTSInAGGMode == TRUE) ) - { - header[1] &= 0xfffc; - header[1] |= 0x1; - } - - /* Enable RIFS : workaround 854T RTS/CTS */ - /* Bit13 : TI enable RIFS */ - //header[1] |= 0x2000; - } - } - } - } - #else - /* - * aggregation ampduIndication control - */ - if (aggControl && aggControl->aggEnabled) { - if (wd->enableAggregation==0 && !(header[6]&0x1)) - { - if (((header[2] & 0x3) == 2)) - { - /* Enable aggregation */ - header[1] |= 0x20; - if (ZM_AGG_LAST_MPDU == aggControl->ampduIndication) - header[1] |= 0x4000; - } - else { - zm_debug_msg1("no aggr, header[2]&0x3 = ",header[2] & 0x3) - aggControl->aggEnabled = 0; - } - } - else { - zm_debug_msg1("no aggr, wd->enableAggregation = ", wd->enableAggregation); - zm_debug_msg1("no aggr, !header[6]&0x1 = ",!(header[6]&0x1)); - aggControl->aggEnabled = 0; - } - } - #endif - - #ifdef ZM_AGGR_BIT_ON - if (!(header[6]&0x1) && !rateProbingFlag) - { - if (((header[2] & 0x3) == 2)) - { - /* Unicast frame with HT rate => Enable aggregation */ - /* Set aggregation group bits per AC */ - header[1] |= (0x20 | (zcUpToAc[up&0x7]<<10)); - - //if (wd->sta.currentFrequency < 3000) - { - /* Enable RTS/CTS to prevent OWL Tx hang up */ - header[1] &= 0xfffc; - header[1] |= 0x1; - } - } - } - #endif - } -#endif - - return (hlen<<1); -} - - -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) -{ - //u16_t bodyLen; - u8_t hlen = 32; // MAC ctrl + PHY ctrl + 802.11 MM header - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - /* Generate control setting */ - //bodyLen = zfwBufGetSize(dev, buf); - header[0] = 24+len+4; //Length - if ((dst[0] & 0x1) != 0) //Broadcast, multicast frames - { - header[1] = 0xc; //MAC control, backoff + noack - } - else - { - header[1] = 0x8; //MAC control, backoff + (ack) - } - /* Dualband Management frame tx Rate */ - if (wd->wlanMode == ZM_MODE_AP) - { - if (wd->frequency < 3000) - { - /* CCK 1M */ - header[2] = 0x0f00; //PHY control L - header[3] = 0x0000; //PHY control H - } - else - { - /* CCK 6M */ - header[2] = 0x0f01; //PHY control L - header[3] = 0x000B; //PHY control H - } - } - else - { - if (wd->sta.currentFrequency < 3000) - { - /* CCK 2M */ - header[2] = 0x0f00; //PHY control L - header[3] = 0x0001; //PHY control H - } - else - { - /* CCK 6M */ - header[2] = 0x0f01; //PHY control L - header[3] = 0x000B; //PHY control H - } - } - /* Generate WLAN header */ - /* Frame control */ - header[4+0] = frameType; - /* Duration */ - header[4+1] = 0; - - if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) - { - if ( frameType == ZM_WLAN_FRAME_TYPE_PROBEREQ ) - { - header[4+8] = 0xFFFF; - header[4+9] = 0xFFFF; - header[4+10] = 0xFFFF; - } - else if ( frameType == ZM_WLAN_FRAME_TYPE_BA ) { - /* do nothing */ - } - else - { - header[4+8] = wd->sta.bssid[0]; - header[4+9] = wd->sta.bssid[1]; - header[4+10] = wd->sta.bssid[2]; - } - } - else if (wd->wlanMode == ZM_MODE_PSEUDO) - { - /* Address 3 = 00:00:00:00:00:00 */ - header[4+8] = 0; - header[4+9] = 0; - header[4+10] = 0; - } - else if (wd->wlanMode == ZM_MODE_IBSS) - { - header[4+8] = wd->sta.bssid[0]; - header[4+9] = wd->sta.bssid[1]; - header[4+10] = wd->sta.bssid[2]; - - if ( frameType == ZM_WLAN_FRAME_TYPE_ATIM ) - { - /* put ATIM to queue 5th */ - //header[2] |= (ZM_BIT_13|ZM_BIT_14); - header[2] |= ZM_BIT_15; - } - } - else if (wd->wlanMode == ZM_MODE_AP) - { - /* Address 3 = BSSID */ - header[4+8] = wd->macAddr[0]; - header[4+9] = wd->macAddr[1]; -#ifdef ZM_VAPMODE_MULTILE_SSID - header[4+10] = wd->macAddr[2]; //Multiple SSID -#else - header[4+10] = wd->macAddr[2] + (vap<<8); //VAP -#endif - //if in scan, must set address 3 to broadcast because of some ap would care this - //if ((wd->heartBeatNotification & ZM_BSSID_LIST_SCAN) - // == ZM_BSSID_LIST_SCAN) - //if FrameType is Probe Request, Address3 should be boradcast - if (frameType == ZM_WLAN_FRAME_TYPE_PROBEREQ) - { - header[4+8] = 0xFFFF; - header[4+9] = 0xFFFF; - header[4+10] = 0xFFFF; - } - } - - /* Address 1 = DA */ - header[4+2] = dst[0]; - header[4+3] = dst[1]; - header[4+4] = dst[2]; - - /* Address 2 = SA */ - header[4+5] = wd->macAddr[0]; - header[4+6] = wd->macAddr[1]; - if (wd->wlanMode == ZM_MODE_AP) - { -#ifdef ZM_VAPMODE_MULTILE_SSID - header[4+7] = wd->macAddr[2]; //Multiple SSID -#else - header[4+7] = wd->macAddr[2] + (vap<<8); //VAP -#endif - } - else - { - header[4+7] = wd->macAddr[2]; - } - - /* Sequence Control */ - zmw_enter_critical_section(dev); - header[4+11] = ((wd->mmseq++)<<4); - zmw_leave_critical_section(dev); - - if( frameType == ZM_WLAN_FRAME_TYPE_QOS_NULL ) - { - /*Qos Control*/ - header[4+12] = 0x0; - hlen+=2; - header[0]+=2; - } - - if ( encrypt ) - { - if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED ) - { - if ( (wd->sta.encryMode == ZM_WEP64)|| - (wd->sta.encryMode == ZM_WEP128)|| - (wd->sta.encryMode == ZM_WEP256) ) - { - header[4] |= 0x4000; - header[16] = 0x0; //IV - header[17] = 0x0; //IV - header[17] |= (((u16_t) wd->sta.keyId) << 14); - hlen += 4; - - header[0] += 8; // icvLen = 4; - header[1] |= 0x40; // enable encryption on macCtrl - } - } - } - - // Enable HW duration - if ( frameType != ZM_WLAN_FRAME_TYPE_PSPOLL ) - { - header[1] |= 0x200; - } - - return hlen; -} - -void zfInitMacApMode(zdev_t* dev) -{ - u16_t i; - - zmw_get_wlan_dev(dev); - - zfHpEnableBeacon(dev, ZM_MODE_AP, (wd->beaconInterval/wd->ap.vapNumber), 1, 0); - - /* AP mode */ - zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_AP); - - /* VAP test code */ - /* AP + VAP mode */ - if (wd->ap.vapNumber >= 2) - { - for (i=1; iap.apBitmap >> i) & 0x1) != 0) - { - u16_t mac[3]; - mac[0] = wd->macAddr[0]; - mac[1] = wd->macAddr[1]; -#ifdef ZM_VAPMODE_MULTILE_SSID - mac[2] = wd->macAddr[2]; //Multiple SSID -#else - mac[2] = wd->macAddr[2] + (i<<8); //VAP -#endif - zfHpSetMacAddress(dev, mac, i); - - } - } - } - - /* basic rate setting */ - zfHpSetBasicRateSet(dev, wd->bRateBasic, wd->gRateBasic); - - /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME AP default. */ - zfUpdateDefaultQosParameter(dev, 1); - - return; -} - -u16_t zfChGetNextChannel(zdev_t* dev, u16_t frequency, u8_t* pbPassive) -{ - u8_t i; - u8_t bPassive; - - zmw_get_wlan_dev(dev); - - /* Avoid NULL value */ - if ( pbPassive == NULL ) - { - pbPassive = &bPassive; - } - - for( i=0; iregulationTable.allowChannelCnt; i++ ) - { - if ( wd->regulationTable.allowChannel[i].channel == frequency ) - { - if ( i == (wd->regulationTable.allowChannelCnt-1) ) - { - i = 0; - } - else - { - i++; - } - - if ( wd->regulationTable.allowChannel[i].channelFlags - & ZM_REG_FLAG_CHANNEL_PASSIVE ) - { - *pbPassive = TRUE; - } - else - { - *pbPassive = FALSE; - } - - return wd->regulationTable.allowChannel[i].channel; - } - } - - return 0xffff; -} - -u16_t zfChGetFirstChannel(zdev_t* dev, u8_t* pbPassive) -{ - u8_t bPassive; - - zmw_get_wlan_dev(dev); - - /* Avoid NULL value */ - if ( pbPassive == NULL ) - { - pbPassive = &bPassive; - } - - if ( wd->regulationTable.allowChannel[0].channelFlags & ZM_REG_FLAG_CHANNEL_PASSIVE ) - { - *pbPassive = TRUE; - } - else - { - *pbPassive = FALSE; - } - - return wd->regulationTable.allowChannel[0].channel; -} - -u16_t zfChGetFirst2GhzChannel(zdev_t* dev) -{ - u8_t i; - - zmw_get_wlan_dev(dev); - - for( i=0; iregulationTable.allowChannelCnt; i++ ) - { - if ( wd->regulationTable.allowChannel[i].channel < 3000 ) - { - /* find the first 2Ghz channel */ - return wd->regulationTable.allowChannel[i].channel; - } - } - - /* Can not find any 2Ghz channel */ - return 0; -} - -u16_t zfChGetFirst5GhzChannel(zdev_t* dev) -{ - u8_t i; - - zmw_get_wlan_dev(dev); - - for( i=0; iregulationTable.allowChannelCnt; i++ ) - { - if ( wd->regulationTable.allowChannel[i].channel > 3000 ) - { - /* find the first 5Ghz channel */ - return wd->regulationTable.allowChannel[i].channel; - } - } - - /* Can not find any 5Ghz channel */ - return 0; -} - -u16_t zfChGetLastChannel(zdev_t* dev, u8_t* pbPassive) -{ - u8_t bPassive; - u8_t ChannelIndex; - - zmw_get_wlan_dev(dev); - - ChannelIndex = wd->regulationTable.allowChannelCnt-1; - - /* Avoid NULL value */ - if ( pbPassive == NULL ) - { - pbPassive = &bPassive; - } - - if ( wd->regulationTable.allowChannel[ChannelIndex].channelFlags - & ZM_REG_FLAG_CHANNEL_PASSIVE ) - { - *pbPassive = TRUE; - } - else - { - *pbPassive = FALSE; - } - - return wd->regulationTable.allowChannel[ChannelIndex].channel; -} - -u16_t zfChGetLast5GhzChannel(zdev_t* dev) -{ - u8_t i; - u16_t last5Ghzfrequency; - - zmw_get_wlan_dev(dev); - - last5Ghzfrequency = 0; - for( i=0; iregulationTable.allowChannelCnt; i++ ) - { - if ( wd->regulationTable.allowChannel[i].channel > 3000 ) - { - last5Ghzfrequency = wd->regulationTable.allowChannel[i].channel; - } - } - - return last5Ghzfrequency; -} - -/* freqBand = 0 => auto check */ -/* = 1 => 2.4 GHz band */ -/* = 2 => 5 GHz band */ -u16_t zfChNumToFreq(zdev_t* dev, u8_t ch, u8_t freqBand) -{ - u16_t freq = 0xffff; - - if ( freqBand == 0 ) - { - if (ch > 14) - { /* adapter is at 5 GHz band */ - freqBand = 2; - } - else - { - freqBand = 1; - } - } - - if ( freqBand == 2 ) - { /* the channel belongs to 5 GHz band */ - if ( (ch >= 184)&&(ch <= 196) ) - { - freq = 4000 + ch*5; - } - else - { - freq = 5000 + ch*5; - } - } - else - { /* the channel belongs to 2.4 GHz band */ - if ( ch == 14 ) - { - freq = ZM_CH_G_14; - } - else - { - freq = ZM_CH_G_1 + (ch-1)*5; - } - } - - return freq; -} - -u8_t zfChFreqToNum(u16_t freq, u8_t* pbIs5GBand) -{ - u8_t ch; - u8_t Is5GBand; - - /* to avoid NULL value */ - if ( pbIs5GBand == NULL ) - { - pbIs5GBand = &Is5GBand; - } - - *pbIs5GBand = FALSE; - - if ( freq == ZM_CH_G_14 ) - { - ch = 14; - } - else if ( freq < 4000 ) - { - ch = (freq - ZM_CH_G_1) / 5 + 1; - } - else if ( freq < 5000 ) - { - ch = (freq - 4000) / 5; - *pbIs5GBand = TRUE; - } - else - { - ch = (freq - 5000) / 5; - *pbIs5GBand = TRUE; - } - - return ch; -} diff --git a/drivers/staging/otus/80211core/cmm.c b/drivers/staging/otus/80211core/cmm.c deleted file mode 100644 index 007ef3b606a5..000000000000 --- a/drivers/staging/otus/80211core/cmm.c +++ /dev/null @@ -1,2183 +0,0 @@ -/* - * 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 : mm.c */ -/* */ -/* Abstract */ -/* This module contains common functions for handle management */ -/* frame. */ -/* */ -/* NOTES */ -/* None */ -/* */ -/************************************************************************/ -#include "cprecomp.h" -#include "../hal/hpreg.h" - -/* TODO : put all constant tables to a file */ -const u8_t zg11bRateTbl[4] = {2, 4, 11, 22}; -const u8_t zg11gRateTbl[8] = {12, 18, 24, 36, 48, 72, 96, 108}; - -/* 0xff => element does not exist */ -const u8_t zgElementOffsetTable[] = -{ - 4, /* 0 : asoc req */ - 6, /* 1 : asoc rsp */ - 10, /* 2 : reasoc req*/ - 6, /* 3 : reasoc rsp */ - 0, /* 4 : probe req */ - 12, /* 5 : probe rsp */ - 0xff, /* 6 : reserved */ - 0xff, /* 7 : reserved */ - 12, /* 8 : beacon */ - 4, /* 9 : ATIM */ - 0xff, /* 10 : disasoc */ - 6, /* 11 : auth */ - 0xff, /* 12 : deauth */ - 4, /* 13 : action */ - 0xff, /* 14 : reserved */ - 0xff, /* 15 : reserved */ -}; - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfFindElement */ -/* Find a specific element in management frame */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : management frame buffer */ -/* eid : target element id */ -/* */ -/* OUTPUTS */ -/* byte offset of target element */ -/* or 0xffff if not found */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfFindElement(zdev_t* dev, zbuf_t* buf, u8_t eid) -{ - u8_t subType; - u16_t offset; - u16_t bufLen; - u16_t elen; - u8_t id, HTEid=0; - u8_t oui[4] = {0x00, 0x50, 0xf2, 0x01}; - u8_t oui11n[3] = {0x00,0x90,0x4C}; - u8_t HTType = 0; - - /* Get offset of first element */ - subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4); - offset = zgElementOffsetTable[subType]; - if (offset == 0xff) - { - zm_assert(0); - } - - /* Plus wlan header */ - offset += 24; - - // jhlee HT 0 - - if ((eid == ZM_WLAN_EID_HT_CAPABILITY) || - (eid == ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) - { - HTEid = eid; - eid = ZM_WLAN_EID_WPA_IE; - HTType = 1; - } - - - bufLen = zfwBufGetSize(dev, buf); - /* Search loop */ - while ((offset+2) bufLen - offset) - { - /* Element length error */ - return 0xffff; - } - - if ( elen == 0 && eid != ZM_WLAN_EID_SSID) - { - /* Element length error */ - return 0xffff; - } - - if ( eid == ZM_WLAN_EID_WPA_IE ) - { - /* avoid sta to be thought use 11n when find a WPA_IE */ - if ( (HTType == 0) && zfRxBufferEqualToStr(dev, buf, oui, offset+2, 4) ) - { - return offset; - } - - // jhlee HT 0 - // CWYang(+) - - if ((HTType == 1) && ( zfRxBufferEqualToStr(dev, buf, oui11n, offset+2, 3) )) - { - if ( zmw_rx_buf_readb(dev, buf, offset+5) == HTEid ) - { - return offset + 5; - } - } - - } - else - { - return offset; - } - } - /* Advance to next element */ - #if 1 - elen = zmw_rx_buf_readb(dev, buf, offset+1); - #else - elen = zmw_rx_buf_readb(dev, buf, offset+1); - if (elen == 0) - { - return 0xffff; - } - #endif - - offset += (elen+2); - } - return 0xffff; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfFindWifiElement */ -/* Find a specific Wifi element in management frame */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : management frame buffer */ -/* type : OUI type */ -/* subType : OUI subtype */ -/* */ -/* OUTPUTS */ -/* byte offset of target element */ -/* or 0xffff if not found */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.1 */ -/* */ -/************************************************************************/ -u16_t zfFindWifiElement(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype) -{ - u8_t subType; - u16_t offset; - u16_t bufLen; - u16_t elen; - u8_t id; - u8_t tmp; - - /* Get offset of first element */ - subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4); - - offset = zgElementOffsetTable[subType]; - if (offset == 0xff) - { - zm_assert(0); - } - - /* Plus wlan header */ - offset += 24; - - bufLen = zfwBufGetSize(dev, buf); - /* Search loop */ - while ((offset+2) bufLen - offset) - { - /* Element length error */ - return 0xffff; - } - - if ( elen == 0 ) - { - return 0xffff; - } - - if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00) - && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50) - && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0xF2) - && ((tmp = zmw_rx_buf_readb(dev, buf, offset+5)) == type)) - - { - if ( subtype != 0xff ) - { - tmp = zmw_rx_buf_readb(dev, buf, offset+6); - if (tmp == subtype) - { - return offset; - } - } - else - { - return offset; - } - } - } - /* Advance to next element */ - elen = zmw_rx_buf_readb(dev, buf, offset+1); - if (elen == 0) - { - return 0xffff; - } - offset += (elen+2); - } - return 0xffff; -} - -u16_t zfRemoveElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t eid) -{ - u16_t offset = 0; - u16_t elen; - u8_t HTEid = 0; - u8_t oui[4] = {0x00, 0x50, 0xf2, 0x01}; - u8_t oui11n[3] = {0x00,0x90,0x4C}; - u8_t HTType = 0; - - if ((eid == ZM_WLAN_EID_HT_CAPABILITY) || - (eid == ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) - { - HTEid = eid; - eid = ZM_WLAN_EID_WPA_IE; - HTType = 1; - } - - while (offset < size) - { - elen = *(buf+offset+1); - - if (*(buf+offset) == eid) - { - if ( eid == ZM_WLAN_EID_WPA_IE ) - { - if ( (HTType == 0) - && (*(buf+offset+2) == oui[0]) - && (*(buf+offset+3) == oui[1]) - && (*(buf+offset+4) == oui[2]) - && (*(buf+offset+5) == oui[3]) ) - { - zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2); - return (size-elen-2); - } - - if ( (HTType == 1) - && (*(buf+offset+2) == oui11n[0]) - && (*(buf+offset+3) == oui11n[1]) - && (*(buf+offset+4) == oui11n[2]) - && (*(buf+offset+5) == HTEid) ) - { - zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2); - return (size-elen-2); - } - } - else - { - zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2); - return (size-elen-2); - } - } - - offset += (elen+2); - } - - return size; -} - -u16_t zfUpdateElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t* updateeid) -{ - u16_t offset = 0; - u16_t elen; - - while (offset < size) { - elen = *(buf+offset+1); - - if (*(buf+offset) == updateeid[0]) { - if (updateeid[1] <= elen) { - zfMemoryMove(buf+offset, updateeid, updateeid[1]+2); - zfMemoryMove(buf+offset+updateeid[1]+2, buf+offset+elen+2, size-offset-elen-2); - - return size-(elen-updateeid[1]); - } else { - zfMemoryMove(buf+offset+updateeid[1]+2, buf+offset+elen+2, size-offset-elen-2); - zfMemoryMove(buf+offset, updateeid, updateeid[1]+2); - - return size+(updateeid[1]-elen); - } - } - - offset += (elen+2); - } - - return size; -} - -u16_t zfFindSuperGElement(zdev_t* dev, zbuf_t* buf, u8_t type) -{ - u8_t subType; - u16_t offset; - u16_t bufLen; - u16_t elen; - u8_t id; - u8_t super_feature; - u8_t ouiSuperG[6] = {0x00,0x03,0x7f,0x01, 0x01, 0x00}; - - /* Get offset of first element */ - subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4); - offset = zgElementOffsetTable[subType]; - if (offset == 0xff) - { - zm_assert(0); - } - - /* Plus wlan header */ - offset += 24; - - bufLen = zfwBufGetSize(dev, buf); - /* Search loop */ - while ((offset+2) bufLen - offset) - { - /* Element length error */ - return 0xffff; - } - - if ( elen == 0 ) - { - return 0xffff; - } - - if (zfRxBufferEqualToStr(dev, buf, ouiSuperG, offset+2, 6) && ( zmw_rx_buf_readb(dev, buf, offset+1) >= 6)) - { - /* super_feature 0:useFastFrame, 1:useCompression, 2:useTurboPrime */ - super_feature= zmw_rx_buf_readb(dev, buf, offset+8); - if ((super_feature & 0x01) || (super_feature & 0x02) || (super_feature & 0x04)) - { - return offset; - } - } - } - /* Advance to next element */ - #if 1 - elen = zmw_rx_buf_readb(dev, buf, offset+1); - #else - elen = zmw_rx_buf_readb(dev, buf, offset+1); - if (elen == 0) - { - return 0xffff; - } - #endif - - offset += (elen+2); - } - return 0xffff; -} - -u16_t zfFindXRElement(zdev_t* dev, zbuf_t* buf, u8_t type) -{ - u8_t subType; - u16_t offset; - u16_t bufLen; - u16_t elen; - u8_t id; - u8_t ouixr[6] = {0x00,0x03,0x7f,0x03, 0x01, 0x00}; - - /* Get offset of first element */ - subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4); - offset = zgElementOffsetTable[subType]; - if (offset == 0xff) - { - zm_assert(0); - } - - /* Plus wlan header */ - offset += 24; - - bufLen = zfwBufGetSize(dev, buf); - /* Search loop */ - while ((offset+2) bufLen - offset) - { - /* Element length error */ - return 0xffff; - } - - if ( elen == 0 ) - { - return 0xffff; - } - - if (zfRxBufferEqualToStr(dev, buf, ouixr, offset+2, 6) && ( zmw_rx_buf_readb(dev, buf, offset+1) >= 6)) - { - return offset; - } - } - /* Advance to next element */ - #if 1 - elen = zmw_rx_buf_readb(dev, buf, offset+1); - #else - elen = zmw_rx_buf_readb(dev, buf, offset+1); - if (elen == 0) - { - return 0xffff; - } - #endif - - offset += (elen+2); - } - return 0xffff; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfMmAddIeSupportRate */ -/* Add information element Support Rate to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* eid : element ID */ -/* rateSet : CCK or OFDM */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfMmAddIeSupportRate(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t eid, u8_t rateSet) -{ - u8_t len = 0; - u16_t i; - - zmw_get_wlan_dev(dev); - - //if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) ) - //{ - // return offset; - //} - - /* Information : Support Rate */ - if ( rateSet == ZM_RATE_SET_CCK ) - { - for (i=0; i<4; i++) - { - if ((wd->bRate & (0x1<bRateBasic & (0x1<gRate & (0x1<gRateBasic & (0x1< 0) - { - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset, eid); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset+1, len); - - /* Return value */ - offset += (2+len); - } - - return offset; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfMmAddIeDs */ -/* Add information element DS to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfMmAddIeDs(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - zmw_get_wlan_dev(dev); - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_DS); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, 1); - - /* Information : DS */ - zmw_tx_buf_writeb(dev, buf, offset++, - zfChFreqToNum(wd->frequency, NULL)); - - return offset; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfMmAddIeErp */ -/* Add information element ERP to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfMmAddIeErp(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - zmw_get_wlan_dev(dev); - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_ERP); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, 1); - - /* Information : ERP */ - zmw_tx_buf_writeb(dev, buf, offset++, wd->erpElement); - - return offset; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfMmAddIeWpa */ -/* Add information element WPA to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Yuan-Gu Wei ZyDAS Technology Corporation 2006.2 */ -/* */ -/************************************************************************/ -u16_t zfMmAddIeWpa(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t apId) -{ - //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); - int i; - - zmw_get_wlan_dev(dev); - - /* Element ID */ - //zmw_inttx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE); - - /* Element Length */ - //zmw_inttx_buf_writeb(dev, buf, offset++, wd->ap.wpaLen); - for(i = 0; i < wd->ap.wpaLen[apId]; i++) - { - /* Information : WPA */ - zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.wpaIe[apId][i]); - } - - return offset; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfMmAddHTCapability */ -/* Add HT Capability Infomation to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Chao-Wen Yang ZyDAS Technology Corporation 2006.06 */ -/* */ -/************************************************************************/ -u16_t zfMmAddHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - u8_t OUI[3] = {0x0,0x90,0x4C}; - u16_t i; - - zmw_get_wlan_dev(dev); - - /* Prob ID */ - zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE); - - if ( wd->wlanMode == ZM_MODE_AP ) - { - /* Element Length */ - zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.Length + 4); - - /* OUI Data */ - for (i = 0; i < 3; i++) - { - zmw_buf_writeb(dev, buf, offset++, OUI[i]); - } - - /* Element Type ID */ - zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.ElementID); - - /* HT Capability Data */ - for (i = 0; i < 26; i++) - { - zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Byte[i+2]); - } - } - else - { - /* Element Length */ - zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.Length + 4); - - /* OUI Data */ - for (i = 0; i < 3; i++) - { - zmw_buf_writeb(dev, buf, offset++, OUI[i]); - } - - /* Element Type ID */ - zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.ElementID); - - /* HT Capability Data */ - for (i = 0; i < 26; i++) - { - zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Byte[i+2]); - } - } - - return offset; -} - - -u16_t zfMmAddPreNHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - //u8_t OUI[3] = {0x0,0x90,0x4C}; - u16_t i; - - zmw_get_wlan_dev(dev); - - /* Prob ID */ - zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_PREN2_EID_HTCAPABILITY); - - if ( wd->wlanMode == ZM_MODE_AP ) - { - /* Element Length */ - zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.Length); - - /* HT Capability Data */ - for (i = 0; i < 26; i++) - { - zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Byte[i+2]); - } - } - else - { - /* Element Length */ - zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.Length); - - /* HT Capability Data */ - for (i = 0; i < 26; i++) - { - zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Byte[i+2]); - } - } - - return offset; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfMmAddExtendedHTCapability */ -/* Add Extended HT Capability Infomation to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Chao-Wen Yang ZyDAS Technology Corporation 2006.06 */ -/* */ -/************************************************************************/ -u16_t zfMmAddExtendedHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - u8_t OUI[3] = {0x0,0x90,0x4C}; - u16_t i; - - zmw_get_wlan_dev(dev); - - /* Prob ID */ - zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE); - - if ( wd->wlanMode == ZM_MODE_AP ) - { - /* Element Length */ - zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Data.Length + 4); - - /* OUI Data */ - for (i = 0; i < 3; i++) - { - zmw_buf_writeb(dev, buf, offset++, OUI[i]); - } - - /* Element Type ID */ - zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Data.ElementID); - - /* HT Capability Data */ - for (i = 0; i < 22; i++) - { - zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Byte[i+2]); - } - } - else - { - /* Element Length */ - zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Data.Length + 4); - - /* OUI Data */ - for (i = 0; i < 3; i++) - { - zmw_buf_writeb(dev, buf, offset++, OUI[i]); - } - - /* Element Type ID */ - zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Data.ElementID); - - /* HT Capability Data */ - for (i = 0; i < 22; i++) - { - zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Byte[i+2]); - } - } - - return offset; -} - - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfSendMmFrame */ -/* Send management frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* frameType : management frame type */ -/* dst : destination MAC address */ -/* p1 : parameter 1 */ -/* p2 : parameter 2 */ -/* p3 : parameter 3 */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -/* probe req : p1=> bWithSSID, p2=>R, p3=>R */ -/* probe rsp : p1=>R, p2=>R, p3=>VAP ID(AP) */ -/* deauth : p1=>Reason Code, p2=>R, p3=>VAP ID(AP) */ -/* Disasoc : p1=>Reason Code, p2=>R, p3=>VAP ID(AP) */ -/* ATIM : p1=>R, p2=>R, p3=>R */ -/* (re)asoc rsp : p1=>Status Code, p2=>AID, p3=>VAP ID(AP) */ -/* asoc req : p1=>R, p2=>R, p3=>R */ -/* reasoc req : p1=>AP MAC[0], p2=>AP MAC[1], p3=>AP MAC[2] */ -/* auth : p1=>low=Algorithm, high=Transaction, p2=>Status, p3=>VAP ID */ -void zfSendMmFrame(zdev_t* dev, u8_t frameType, u16_t* dst, - u32_t p1, u32_t p2, u32_t p3) -{ - zbuf_t* buf; - //u16_t addrTblSize; - //struct zsAddrTbl addrTbl; - u16_t offset = 0; - u16_t hlen = 32; - u16_t header[(24+25+1)/2]; - u16_t vap = 0; - u16_t i; - u8_t encrypt = 0; - u16_t aid; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zm_msg2_mm(ZM_LV_2, "Send mm frame, type=", frameType); - /* TBD : Maximum size of management frame */ - buf = zfwBufAllocate(dev, 1024); - if (buf == NULL) - { - zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!"); - return; - } - - //Reserve room for wlan header - offset = hlen; - - switch (frameType) - { - case ZM_WLAN_FRAME_TYPE_PROBEREQ : - offset = zfSendProbeReq(dev, buf, offset, (u8_t) p1); - break; - - case ZM_WLAN_FRAME_TYPE_PROBERSP : - zm_msg0_mm(ZM_LV_3, "probe rsp"); - /* 24-31 Time Stamp : hardware WON'T fill this field */ - zmw_tx_buf_writeh(dev, buf, offset, 0); - zmw_tx_buf_writeh(dev, buf, offset+2, 0); - zmw_tx_buf_writeh(dev, buf, offset+4, 0); - zmw_tx_buf_writeh(dev, buf, offset+6, 0); - offset+=8; - - /* Beacon Interval */ - zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval); - offset+=2; - - if (wd->wlanMode == ZM_MODE_AP) - { - vap = (u16_t) p3; - /* Capability */ - zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]); - offset+=2; - /* SSID */ - offset = zfApAddIeSsid(dev, buf, offset, vap); - } - else - { - /* Capability */ - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]); - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]); - /* SSID */ - offset = zfStaAddIeSsid(dev, buf, offset); - } - - /* Support Rate */ - if ( wd->frequency < 3000 ) - { - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK); - } - else - { - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM); - } - - /* DS parameter set */ - offset = zfMmAddIeDs(dev, buf, offset); - - /* TODO ¡G IBSS */ - if ( wd->wlanMode == ZM_MODE_IBSS ) - { - offset = zfStaAddIeIbss(dev, buf, offset); - - if (wd->frequency < 3000) - { - if( wd->wfc.bIbssGMode - && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode . - { - /* ERP Information */ - wd->erpElement = 0; - offset = zfMmAddIeErp(dev, buf, offset); - - /* Enable G Mode */ - /* Extended Supported Rates */ - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM); - } - } - } - - - if ((wd->wlanMode == ZM_MODE_AP) - && (wd->ap.wlanType[vap] != ZM_WLAN_TYPE_PURE_B)) - { - /* ERP Information */ - offset = zfMmAddIeErp(dev, buf, offset); - - /* Extended Supported Rates */ - if ( wd->frequency < 3000 ) - { - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM); - } - } - - /* ERP Information */ - //offset = zfMmAddIeErp(dev, buf, offset); - - /* Extended Supported Rates */ - //offset = zfMmAddIeSupportRate(dev, buf, offset, - // ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM); - - /* TODO : RSN */ - if (wd->wlanMode == ZM_MODE_AP && wd->ap.wpaSupport[vap] == 1) - { - offset = zfMmAddIeWpa(dev, buf, offset, vap); - } - else if ( wd->wlanMode == ZM_MODE_IBSS && wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK) - { - offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH); - } - - /* WME Parameters */ - if (wd->wlanMode == ZM_MODE_AP) - { - if (wd->ap.qosMode == 1) - { - offset = zfApAddIeWmePara(dev, buf, offset, vap); - } - } - - if ( wd->wlanMode != ZM_MODE_IBSS ) - { - // jhlee HT 0 - //CWYang(+) - /* TODO : Need to check if it is ok */ - /* HT Capabilities Info */ - offset = zfMmAddHTCapability(dev, buf, offset); - //CWYang(+) - /* Extended HT Capabilities Info */ - offset = zfMmAddExtendedHTCapability(dev, buf, offset); - } - - if ( wd->sta.ibssAdditionalIESize ) - offset = zfStaAddIbssAdditionalIE(dev, buf, offset); - break; - - case ZM_WLAN_FRAME_TYPE_AUTH : - if (p1 == 0x30001) - { - hlen += 4; - offset += 4; // for reserving wep header - encrypt = 1; - } - - /* Algotrithm Number */ - zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p1&0xffff)); - offset+=2; - - /* Transaction Number */ - zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p1>>16)); - offset+=2; - - /* Status Code */ - zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p2); - offset+=2; - - if (wd->wlanMode == ZM_MODE_AP) - { - vap = (u16_t) p3; - } - - /* Challenge Text => share-2 or share-3 */ - if (p1 == 0x20001) - { - if (p2 == 0) //Status == success - { - zmw_buf_writeh(dev, buf, offset, 0x8010); - offset+=2; - /* share-2 : AP generate challenge text */ - for (i=0; i<128; i++) - { - wd->ap.challengeText[i] = (u8_t)zfGetRandomNumber(dev, 0); - } - zfCopyToIntTxBuffer(dev, buf, wd->ap.challengeText, offset, 128); - offset += 128; - } - } - else if (p1 == 0x30001) - { - /* share-3 : STA return challenge Text */ - zfCopyToIntTxBuffer(dev, buf, wd->sta.challengeText, offset, wd->sta.challengeText[1]+2); - offset += (wd->sta.challengeText[1]+2); - } - - break; - - case ZM_WLAN_FRAME_TYPE_ASOCREQ : - case ZM_WLAN_FRAME_TYPE_REASOCREQ : - /* Capability */ - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]); - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]); - - /* Listen Interval */ - zmw_tx_buf_writeh(dev, buf, offset, 0x0005); - offset+=2; - - /* Reassocaited Request : Current AP address */ - if (frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ) - { - zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[0]); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[1]); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[2]); - offset+=2; - } - - /* SSID */ - offset = zfStaAddIeSsid(dev, buf, offset); - - - if ( wd->sta.currentFrequency < 3000 ) - { - /* Support Rate */ - offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK); - } - else - { - /* Support Rate */ - offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM); - } - - if ((wd->sta.capability[1] & ZM_BIT_0) == 1) - { //spectrum management flag enable - offset = zfStaAddIePowerCap(dev, buf, offset); - offset = zfStaAddIeSupportCh(dev, buf, offset); - } - - if (wd->sta.currentFrequency < 3000) - { - /* Extended Supported Rates */ - if (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) - { - offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM); - } - } - - - //offset = zfStaAddIeWpaRsn(dev, buf, offset, frameType); - //Move to wrapper function, for OS difference--CWYang(m) - //for windows wrapper, zfwStaAddIeWpaRsn() should be below: - //u16_t zfwStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType) - //{ - // return zfStaAddIeWpaRsn(dev, buf, offset, frameType); - //} - offset = zfwStaAddIeWpaRsn(dev, buf, offset, frameType); - -#ifdef ZM_ENABLE_CENC - /* CENC */ - //if (wd->sta.encryMode == ZM_CENC) - offset = zfStaAddIeCenc(dev, buf, offset); -#endif //ZM_ENABLE_CENC - if (((wd->sta.wmeEnabled & ZM_STA_WME_ENABLE_BIT) != 0) //WME enabled - && ((wd->sta.apWmeCapability & 0x1) != 0)) //WME AP - { - if (((wd->sta.apWmeCapability & 0x80) != 0) //UAPSD AP - && ((wd->sta.wmeEnabled & ZM_STA_UAPSD_ENABLE_BIT) != 0)) //UAPSD enabled - { - offset = zfStaAddIeWmeInfo(dev, buf, offset, wd->sta.wmeQosInfo); - } - else - { - offset = zfStaAddIeWmeInfo(dev, buf, offset, 0); - } - } - // jhlee HT 0 - //CWYang(+) - if (wd->sta.EnableHT != 0) - { - #ifndef ZM_DISABLE_AMSDU8K_SUPPORT - //Support 8K A-MSDU - if (wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED) - { - wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength; - } - else - { - wd->sta.HTCap.Data.HtCapInfo &= (~HTCAP_MaxAMSDULength); - } - #else - //Support 4K A-MSDU - wd->sta.HTCap.Data.HtCapInfo &= (~HTCAP_MaxAMSDULength); - #endif - - /* HT Capabilities Info */ - if (wd->BandWidth40 == 1) { - wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet; - } - else { - wd->sta.HTCap.Data.HtCapInfo &= ~HTCAP_SupChannelWidthSet; - //wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet; - } - - wd->sta.HTCap.Data.AMPDUParam &= ~HTCAP_MaxRxAMPDU3; - wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3; - wd->sta.HTCap.Data.MCSSet[1] = 0xFF; // MCS 8 ~ 15 - offset = zfMmAddHTCapability(dev, buf, offset); - offset = zfMmAddPreNHTCapability(dev, buf, offset); - //CWYang(+) - /* Extended HT Capabilities Info */ - //offset = zfMmAddExtendedHTCapability(dev, buf, offset); - } - - - //Store asoc request frame body, for VISTA only - wd->sta.asocReqFrameBodySize = ((offset - hlen) > - ZM_CACHED_FRAMEBODY_SIZE)? - ZM_CACHED_FRAMEBODY_SIZE:(offset - hlen); - for (i=0; ista.asocReqFrameBodySize; i++) - { - wd->sta.asocReqFrameBody[i] = zmw_tx_buf_readb(dev, buf, i + hlen); - } - break; - - case ZM_WLAN_FRAME_TYPE_ASOCRSP : - case ZM_WLAN_FRAME_TYPE_REASOCRSP : - vap = (u16_t) p3; - - /* Capability */ - zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]); - offset+=2; - - /* Status Code */ - zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p1); - offset+=2; - - /* AID */ - zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p2|0xc000)); - offset+=2; - - - if ( wd->frequency < 3000 ) - { - /* Support Rate */ - offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK); - - /* Extended Supported Rates */ - offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM); - } - else - { - /* Support Rate */ - offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM); - } - - - - /* WME Parameters */ - if (wd->wlanMode == ZM_MODE_AP) - { - /* TODO : if WME STA then send WME parameter element */ - if (wd->ap.qosMode == 1) - { - offset = zfApAddIeWmePara(dev, buf, offset, vap); - } - } - // jhlee HT 0 - //CWYang(+) - /* HT Capabilities Info */ - offset = zfMmAddHTCapability(dev, buf, offset); - //CWYang(+) - /* Extended HT Capabilities Info */ - offset = zfMmAddExtendedHTCapability(dev, buf, offset); - break; - - case ZM_WLAN_FRAME_TYPE_ATIM : - /* NULL frame */ - /* TODO : add two dumb bytes temporarily */ - offset += 2; - break; - - case ZM_WLAN_FRAME_TYPE_QOS_NULL : - zmw_buf_writeh(dev, buf, offset, 0x0010); - offset += 2; - break; - - case ZM_WLAN_DATA_FRAME : - break; - - case ZM_WLAN_FRAME_TYPE_DISASOC : - case ZM_WLAN_FRAME_TYPE_DEAUTH : - if (wd->wlanMode == ZM_MODE_AP) - { - vap = (u16_t) p3; - - aid = zfApFindSta(dev, dst); - if (aid != 0xffff) - { - zmw_enter_critical_section(dev); - /* Clear STA table */ - wd->ap.staTable[aid].valid = 0; - - zmw_leave_critical_section(dev); - - if (wd->zfcbDisAsocNotify != NULL) - { - wd->zfcbDisAsocNotify(dev, (u8_t*)dst, vap); - } - } - } - /* Reason Code */ - zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p1); - offset+=2; - break; - } - - zfwBufSetSize(dev, buf, offset); - - zm_msg2_mm(ZM_LV_2, "management frame body size=", offset-hlen); - - //Copy wlan header - zfTxGenMmHeader(dev, frameType, dst, header, offset-hlen, buf, vap, encrypt); - for (i=0; i<(hlen>>1); i++) - { - zmw_tx_buf_writeh(dev, buf, i*2, header[i]); - } - - /* Get buffer DMA address */ - //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0) - //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0) - //{ - // goto zlError; - //} - - zm_msg2_mm(ZM_LV_2, "offset=", offset); - zm_msg2_mm(ZM_LV_2, "hlen=", hlen); - //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize); - //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]); - //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]); - //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data); - - #if 0 - err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0, - ZM_INTERNAL_ALLOC_BUF, 0, 0xff); - if (err != ZM_SUCCESS) - { - goto zlError; - } - #else - zfPutVmmq(dev, buf); - zfPushVtxq(dev); - #endif - - return; -#if 0 -zlError: - - zfwBufFree(dev, buf, 0); - return; -#endif -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfProcessManagement */ -/* Process received management frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : received management frame buffer */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -void zfProcessManagement(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) //CWYang(m) -{ - u8_t frameType; - u16_t ta[3]; - u16_t ra[3]; - u16_t vap = 0, index = 0; - //u16_t i; - - zmw_get_wlan_dev(dev); - - ra[0] = zmw_rx_buf_readh(dev, buf, 4); - ra[1] = zmw_rx_buf_readh(dev, buf, 6); - ra[2] = zmw_rx_buf_readh(dev, buf, 8); - - ta[0] = zmw_rx_buf_readh(dev, buf, 10); - ta[1] = zmw_rx_buf_readh(dev, buf, 12); - ta[2] = zmw_rx_buf_readh(dev, buf, 14); - - frameType = zmw_rx_buf_readb(dev, buf, 0); - - if (wd->wlanMode == ZM_MODE_AP) - { -#if 1 - vap = 0; - if ((ra[0] & 0x1) != 1) - { - /* AP : Find virtual AP */ - index = zfApFindSta(dev, ta); - if (index != 0xffff) - { - vap = wd->ap.staTable[index].vap; - } - } - zm_msg2_mm(ZM_LV_2, "vap=", vap); -#endif - - /* Dispatch by frame type */ - switch (frameType) - { - /* Beacon */ - case ZM_WLAN_FRAME_TYPE_BEACON : - zfApProcessBeacon(dev, buf); - break; - /* Authentication */ - case ZM_WLAN_FRAME_TYPE_AUTH : - zfApProcessAuth(dev, buf, ta, vap); - break; - /* Association request */ - case ZM_WLAN_FRAME_TYPE_ASOCREQ : - /* Reassociation request */ - case ZM_WLAN_FRAME_TYPE_REASOCREQ : - zfApProcessAsocReq(dev, buf, ta, vap); - break; - /* Association response */ - case ZM_WLAN_FRAME_TYPE_ASOCRSP : - //zfApProcessAsocRsp(dev, buf); - break; - /* Deauthentication */ - case ZM_WLAN_FRAME_TYPE_DEAUTH : - zfApProcessDeauth(dev, buf, ta, vap); - break; - /* Disassociation */ - case ZM_WLAN_FRAME_TYPE_DISASOC : - zfApProcessDisasoc(dev, buf, ta, vap); - break; - /* Probe request */ - case ZM_WLAN_FRAME_TYPE_PROBEREQ : - zfProcessProbeReq(dev, buf, ta); - break; - /* Probe response */ - case ZM_WLAN_FRAME_TYPE_PROBERSP : - zfApProcessProbeRsp(dev, buf, AddInfo); - break; - /* Action */ - case ZM_WLAN_FRAME_TYPE_ACTION : - zfApProcessAction(dev, buf); - break; - } - } - else //if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) || (wd->wlanMode == ZM_MODE_IBSS)) - { - /* Dispatch by frame type */ - switch (frameType) - { - /* Beacon */ - case ZM_WLAN_FRAME_TYPE_BEACON : - /* if enable 802.11h and current channel is silent but receive beacon from other AP */ - if (((wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags - & ZM_REG_FLAG_CHANNEL_CSA) != 0) && wd->sta.DFSEnable) - { - wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags - &= ~(ZM_REG_FLAG_CHANNEL_CSA & ZM_REG_FLAG_CHANNEL_PASSIVE); - } - zfStaProcessBeacon(dev, buf, AddInfo); //CWYang(m) - break; - /* Authentication */ - case ZM_WLAN_FRAME_TYPE_AUTH : - /* TODO : vap parameter is useless in STA mode, get rid of it */ - zfStaProcessAuth(dev, buf, ta, 0); - break; - /* Association request */ - case ZM_WLAN_FRAME_TYPE_ASOCREQ : - /* TODO : vap parameter is useless in STA mode, get rid of it */ - zfStaProcessAsocReq(dev, buf, ta, 0); - break; - /* Association response */ - case ZM_WLAN_FRAME_TYPE_ASOCRSP : - /* Reassociation request */ - case ZM_WLAN_FRAME_TYPE_REASOCRSP : - zfStaProcessAsocRsp(dev, buf); - break; - /* Deauthentication */ - case ZM_WLAN_FRAME_TYPE_DEAUTH : - zm_debug_msg0("Deauthentication received"); - zfStaProcessDeauth(dev, buf); - break; - /* Disassociation */ - case ZM_WLAN_FRAME_TYPE_DISASOC : - zm_debug_msg0("Disassociation received"); - zfStaProcessDisasoc(dev, buf); - break; - /* Probe request */ - case ZM_WLAN_FRAME_TYPE_PROBEREQ : - zfProcessProbeReq(dev, buf, ta); - break; - /* Probe response */ - case ZM_WLAN_FRAME_TYPE_PROBERSP : - /* if enable 802.11h and current channel is silent but receive probe response from other AP */ - if (((wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags - & ZM_REG_FLAG_CHANNEL_CSA) != 0) && wd->sta.DFSEnable) - { - wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags - &= ~(ZM_REG_FLAG_CHANNEL_CSA & ZM_REG_FLAG_CHANNEL_PASSIVE); - } - zfStaProcessProbeRsp(dev, buf, AddInfo); - break; - - case ZM_WLAN_FRAME_TYPE_ATIM: - zfStaProcessAtim(dev, buf); - break; - /* Action */ - case ZM_WLAN_FRAME_TYPE_ACTION : - zm_msg0_mm(ZM_LV_2, "ProcessActionMgtFrame"); - zfStaProcessAction(dev, buf); - break; - } - } -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfProcessProbeReq */ -/* Process probe request management frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : auth frame buffer */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -void zfProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src) -{ - u16_t offset; - u8_t len; - u16_t i, j; - u8_t ch; - u16_t sendFlag; - - zmw_get_wlan_dev(dev); - - /* check mode : AP/IBSS */ - if ((wd->wlanMode != ZM_MODE_AP) && (wd->wlanMode != ZM_MODE_IBSS)) - { - zm_msg0_mm(ZM_LV_3, "Ignore probe req"); - return; - } - - if ((wd->wlanMode != ZM_MODE_AP) && (wd->sta.adapterState == ZM_STA_STATE_DISCONNECT)) - { - zm_msg0_mm(ZM_LV_3, "Packets dropped due to disconnect state"); - return; - } - - if ( wd->wlanMode == ZM_MODE_IBSS ) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, 0, 0, 0); - - return; - } - - /* check SSID */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID); - if (offset == 0xffff) - { - zm_msg0_mm(ZM_LV_3, "probe req SSID not found"); - return; - } - - len = zmw_rx_buf_readb(dev, buf, offset+1); - - for (i=0; iap.apBitmap & (1<wlanMode : ", wd->wlanMode); - if (wd->wlanMode == ZM_MODE_AP) - { - /* => every 1.28 seconds */ - /* AP : aging STA that does not active for wd->ap.staAgingTime */ - now = wd->tick & 0x7f; - if (now == 0x0) - { - zfApAgingSta(dev); - } - else if (now == 0x1f) - { - zfQueueAge(dev, wd->ap.uapsdQ, wd->tick, 10000); - } - /* AP : check (wd->ap.protectedObss) and (wd->ap.bStaAssociated) */ - /* to enable NonErp and Protection mode */ - else if (now == 0x3f) - { - //zfApProtctionMonitor(dev); - } - } -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApInitStaTbl */ -/* Init AP's station table. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -void zfApInitStaTbl(zdev_t* dev) -{ - u16_t i; - - zmw_get_wlan_dev(dev); - - for (i=0; iap.staTable[i].valid = 0; - wd->ap.staTable[i].state = 0; - wd->ap.staTable[i].addr[0] = 0; - wd->ap.staTable[i].addr[1] = 0; - wd->ap.staTable[i].addr[2] = 0; - wd->ap.staTable[i].time = 0; - wd->ap.staTable[i].vap = 0; - wd->ap.staTable[i].encryMode = ZM_NO_WEP; - } - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApFindSta */ -/* Find a STA in station table. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : Target STA address */ -/* */ -/* OUTPUTS */ -/* 0xffff : fail */ -/* other : STA table index */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfApFindSta(zdev_t* dev, u16_t* addr) -{ - u16_t i; - - zmw_get_wlan_dev(dev); - - for (i=0; iap.staTable[i].valid == 1) - { - if ((wd->ap.staTable[i].addr[0] == addr[0]) - && (wd->ap.staTable[i].addr[1] == addr[1]) - && (wd->ap.staTable[i].addr[2] == addr[2])) - { - return i; - } - } - } - return 0xffff; -} - -u16_t zfApGetSTAInfo(zdev_t* dev, u16_t* addr, u16_t* state, u8_t* vap) -{ - u16_t id; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - *vap = wd->ap.staTable[id].vap; - *state = wd->ap.staTable[id++].state; - } - - zmw_leave_critical_section(dev); - - return id; -} - - -void zfApGetStaQosType(zdev_t* dev, u16_t* addr, u8_t* qosType) -{ - u16_t id; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - *qosType = wd->ap.staTable[id].qosType; - } - else - { - *qosType = 0; - } - - zmw_leave_critical_section(dev); - - return; -} - -void zfApGetStaTxRateAndQosType(zdev_t* dev, u16_t* addr, u32_t* phyCtrl, - u8_t* qosType, u16_t* rcProbingFlag) -{ - u16_t id; - u8_t rate; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->ap.staTable[id].rcCell, rcProbingFlag); -#ifdef ZM_AP_DEBUG - //rate = 15; -#endif - *phyCtrl = zcRateToPhyCtrl[rate]; - *qosType = wd->ap.staTable[id].qosType; - } - else - { - if (wd->frequency < 3000) - { - /* CCK 1M */ - //header[2] = 0x0f00; //PHY control L - //header[3] = 0x0000; //PHY control H - *phyCtrl = 0x00000F00; - } - else - { - /* CCK 6M */ - //header[2] = 0x0f01; //PHY control L - //header[3] = 0x000B; //PHY control H - *phyCtrl = 0x000B0F01; - } - *qosType = 0; - } - - zmw_leave_critical_section(dev); - - zm_msg2_mm(ZM_LV_3, "PhyCtrl=", *phyCtrl); - return; -} - -void zfApGetStaEncryType(zdev_t* dev, u16_t* addr, u8_t* encryType) -{ - //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); - u16_t id; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - *encryType = wd->ap.staTable[id].encryMode; - } - else - { - *encryType = ZM_NO_WEP; - } - - zmw_leave_critical_section(dev); - - zm_msg2_mm(ZM_LV_3, "encyrType=", *encryType); - return; -} - -void zfApGetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t* iv16, u32_t* iv32) -{ - //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); - u16_t id; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - *iv16 = wd->ap.staTable[id].iv16; - *iv32 = wd->ap.staTable[id].iv32; - } - else - { - *iv16 = 0; - *iv32 = 0; - } - - zmw_leave_critical_section(dev); - - zm_msg2_mm(ZM_LV_3, "iv16=", *iv16); - zm_msg2_mm(ZM_LV_3, "iv32=", *iv32); - return; -} - -void zfApSetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t iv16, u32_t iv32) -{ - //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); - u16_t id; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - wd->ap.staTable[id].iv16 = iv16; - wd->ap.staTable[id].iv32 = iv32; - } - - zmw_leave_critical_section(dev); - - zm_msg2_mm(ZM_LV_3, "iv16=", iv16); - zm_msg2_mm(ZM_LV_3, "iv32=", iv32); - return; -} - -void zfApClearStaKey(zdev_t* dev, u16_t* addr) -{ - //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); - u16_t bcAddr[3] = { 0xffff, 0xffff, 0xffff }; - u16_t id; - - zmw_get_wlan_dev(dev); - - if (zfMemoryIsEqual((u8_t*)bcAddr, (u8_t*)addr, sizeof(bcAddr)) == TRUE) - { - /* Turn off group key information */ - // zfClearKey(dev, 0); - } - else - { - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - /* Turn off STA's key information */ - zfHpRemoveKey(dev, id+1); - - /* Update STA's Encryption Type */ - wd->ap.staTable[id].encryMode = ZM_NO_WEP; - } - else - { - zm_msg0_mm(ZM_LV_3, "Can't find STA address\n"); - } - zmw_leave_critical_section(dev); - } -} - -#ifdef ZM_ENABLE_CENC -void zfApGetStaCencIvAndKeyIdx(zdev_t* dev, u16_t* addr, u32_t *iv, u8_t *keyIdx) -{ - //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); - u16_t id; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - *iv++ = wd->ap.staTable[id].txiv[0]; - *iv++ = wd->ap.staTable[id].txiv[1]; - *iv++ = wd->ap.staTable[id].txiv[2]; - *iv = wd->ap.staTable[id].txiv[3]; - *keyIdx = wd->ap.staTable[id].cencKeyIdx; - } - else - { - *iv++ = 0x5c365c37; - *iv++ = 0x5c365c36; - *iv++ = 0x5c365c36; - *iv = 0x5c365c36; - *keyIdx = 0; - } - - zmw_leave_critical_section(dev); - return; -} - -void zfApSetStaCencIv(zdev_t* dev, u16_t* addr, u32_t *iv) -{ - //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); - u16_t id; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - wd->ap.staTable[id].txiv[0] = *iv++; - wd->ap.staTable[id].txiv[1] = *iv++; - wd->ap.staTable[id].txiv[2] = *iv++; - wd->ap.staTable[id].txiv[3] = *iv; - } - - zmw_leave_critical_section(dev); - - return; -} -#endif //ZM_ENABLE_CENC - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApFlushBufferedPsFrame */ -/* Free buffered PS frames. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2007.1 */ -/* */ -/************************************************************************/ -void zfApFlushBufferedPsFrame(zdev_t* dev) -{ - u16_t emptyFlag; - u16_t freeCount; - u16_t vap; - zbuf_t* psBuf = NULL; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - freeCount = 0; - emptyFlag = 0; - while (1) - { - psBuf = NULL; - zmw_enter_critical_section(dev); - if (wd->ap.uniHead != wd->ap.uniTail) - { - psBuf = wd->ap.uniArray[wd->ap.uniHead]; - wd->ap.uniHead = (wd->ap.uniHead + 1) & (ZM_UNI_ARRAY_SIZE - 1); - } - else - { - emptyFlag = 1; - } - zmw_leave_critical_section(dev); - - if (psBuf != NULL) - { - zfwBufFree(dev, psBuf, ZM_ERR_FLUSH_PS_QUEUE); - } - zm_assert(freeCount++ < (ZM_UNI_ARRAY_SIZE*2)); - - if (emptyFlag != 0) - { - break; - } - } - - for (vap=0; vapap.bcmcHead[vap] != wd->ap.bcmcTail[vap]) - { - psBuf = wd->ap.bcmcArray[vap][wd->ap.bcmcHead[vap]]; - wd->ap.bcmcHead[vap] = (wd->ap.bcmcHead[vap] + 1) - & (ZM_BCMC_ARRAY_SIZE - 1); - } - else - { - emptyFlag = 1; - } - zmw_leave_critical_section(dev); - - if (psBuf != NULL) - { - zfwBufFree(dev, psBuf, ZM_ERR_FLUSH_PS_QUEUE); - } - zm_assert(freeCount++ < (ZM_BCMC_ARRAY_SIZE*2)); - - if (emptyFlag != 0) - { - break; - } - } - } - return; -} - - -u16_t zfApBufferPsFrame(zdev_t* dev, zbuf_t* buf, u16_t port) -{ - u16_t id; - u16_t addr[3]; - u16_t vap = 0; - u8_t up; - u16_t fragOff; - u8_t ac; - u16_t ret; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if (port < ZM_MAX_AP_SUPPORT) - { - vap = port; - } - - addr[0] = zmw_rx_buf_readh(dev, buf, 0); - addr[1] = zmw_rx_buf_readh(dev, buf, 2); - addr[2] = zmw_rx_buf_readh(dev, buf, 4); - - if ((addr[0] & 0x1) == 0x1) - { - if (wd->ap.staPowerSaving > 0) - { - zmw_enter_critical_section(dev); - - /* Buffer this BC or MC frame */ - if (((wd->ap.bcmcTail[vap]+1)&(ZM_BCMC_ARRAY_SIZE-1)) - != wd->ap.bcmcHead[vap]) - { - wd->ap.bcmcArray[vap][wd->ap.bcmcTail[vap]++] = buf; - wd->ap.bcmcTail[vap] &= (ZM_BCMC_ARRAY_SIZE-1); - zmw_leave_critical_section(dev); - - zm_msg0_tx(ZM_LV_0, "Buffer BCMC"); - } - else - { - /* bcmcArray full */ - zmw_leave_critical_section(dev); - - zm_msg0_tx(ZM_LV_0, "BCMC buffer full"); - - /* free buffer according to buffer type */ - zfwBufFree(dev, buf, ZM_ERR_BCMC_PS_BUFFER_UNAVAILABLE); - } - return 1; - } - } - else - { - zmw_enter_critical_section(dev); - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - if (wd->ap.staTable[id].psMode == 1) - { - - zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff); - ac = zcUpToAc[up&0x7] & 0x3; - - if ((wd->ap.staTable[id].qosType == 1) && - ((wd->ap.staTable[id].qosInfo & (0x8>>ac)) != 0)) - { - ret = zfQueuePutNcs(dev, wd->ap.uapsdQ, buf, wd->tick); - zmw_leave_critical_section(dev); - if (ret != ZM_SUCCESS) - { - zfwBufFree(dev, buf, ZM_ERR_AP_UAPSD_QUEUE_FULL); - } - } - else - { - /* Buffer this unicast frame */ - if (((wd->ap.uniTail+1)&(ZM_UNI_ARRAY_SIZE-1)) - != wd->ap.uniHead) - { - wd->ap.uniArray[wd->ap.uniTail++] = buf; - wd->ap.uniTail &= (ZM_UNI_ARRAY_SIZE-1); - zmw_leave_critical_section(dev); - zm_msg0_tx(ZM_LV_0, "Buffer UNI"); - - } - else - { - /* uniArray full */ - zmw_leave_critical_section(dev); - zm_msg0_tx(ZM_LV_0, "UNI buffer full"); - /* free buffer according to buffer type */ - zfwBufFree(dev, buf, ZM_ERR_UNI_PS_BUFFER_UNAVAILABLE); - } - } - return 1; - } /* if (wd->ap.staTable[id++].psMode == 1) */ - } /* if ((id = zfApFindSta(dev, addr)) != 0xffff) */ - zmw_leave_critical_section(dev); - } - - return 0; -} - -u16_t zfApGetSTAInfoAndUpdatePs(zdev_t* dev, u16_t* addr, u16_t* state, - u8_t* vap, u16_t psMode, u8_t* uapsdTrig) -{ - u16_t id; - u8_t uapsdStaAwake = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - -#ifdef ZM_AP_DEBUG - //psMode=0; -#endif - - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - if (psMode != 0) - { - zm_msg0_mm(ZM_LV_0, "psMode = 1"); - if (wd->ap.staTable[id].psMode == 0) - { - wd->ap.staPowerSaving++; - } - else - { - if (wd->ap.staTable[id].qosType == 1) - { - zm_msg0_mm(ZM_LV_0, "UAPSD trigger"); - *uapsdTrig = wd->ap.staTable[id].qosInfo; - } - } - } - else - { - if (wd->ap.staTable[id].psMode != 0) - { - wd->ap.staPowerSaving--; - if ((wd->ap.staTable[id].qosType == 1) && ((wd->ap.staTable[id].qosInfo&0xf)!=0)) - { - uapsdStaAwake = 1; - } - } - } - - wd->ap.staTable[id].psMode = (u8_t) psMode; - wd->ap.staTable[id].time = wd->tick; - *vap = wd->ap.staTable[id].vap; - *state = wd->ap.staTable[id++].state; - } - - zmw_leave_critical_section(dev); - - if (uapsdStaAwake == 1) - { - zbuf_t* psBuf; - u8_t mb; - - while (1) - { - psBuf = zfQueueGetWithMac(dev, wd->ap.uapsdQ, (u8_t*)addr, &mb); - if (psBuf != NULL) - { - zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, 0); - } - else - { - break; - } - } - } - - return id; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApGetNewSta */ -/* Get a new STA from station table. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* 0xffff : fail */ -/* other : STA table index */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfApGetNewSta(zdev_t* dev) -{ - u16_t i; - - zmw_get_wlan_dev(dev); - - for (i=0; iap.staTable[i].valid == 0) - { - zm_msg2_mm(ZM_LV_0, "zfApGetNewSta=", i); - return i; - } - } - return 0xffff; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApAddSta */ -/* Add a STA to station table. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : STA MAC address */ -/* state : STA state */ -/* apId : Virtual AP ID */ -/* type : 0=>11b, 1=>11g */ -/* */ -/* OUTPUTS */ -/* 0xffff : fail */ -/* Other : index */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfApAddSta(zdev_t* dev, u16_t* addr, u16_t state, u16_t apId, u8_t type, - u8_t qosType, u8_t qosInfo) -{ - u16_t index; - u16_t i; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zm_msg1_mm(ZM_LV_0, "STA type=", type); - - zmw_enter_critical_section(dev); - - index = zfApFindSta(dev, addr); - if (index != 0xffff) - { - zm_msg0_mm(ZM_LV_2, "found"); - /* Update STA state */ - if ((state == ZM_STATE_AUTH) || (state == ZM_STATE_PREAUTH)) - { - wd->ap.staTable[index].state = state; - wd->ap.staTable[index].time = wd->tick; - wd->ap.staTable[index].vap = (u8_t)apId; - } - else if (state == ZM_STATE_ASOC) - { - if ((wd->ap.staTable[index].state == ZM_STATE_AUTH)) - //&& (wd->ap.staTable[index].vap == apId)) - { - wd->ap.staTable[index].state = state; - wd->ap.staTable[index].time = wd->tick; - wd->ap.staTable[index].qosType = qosType; - wd->ap.staTable[index].vap = (u8_t)apId; - wd->ap.staTable[index].staType = type; - wd->ap.staTable[index].qosInfo = qosInfo; - - if (wd->frequency < 3000) - { - /* Init 11b/g */ - zfRateCtrlInitCell(dev, &wd->ap.staTable[index].rcCell, type, 1, 1); - } - else - { - /* Init 11a */ - zfRateCtrlInitCell(dev, &wd->ap.staTable[index].rcCell, type, 0, 1); - } - - if (wd->zfcbApConnectNotify != NULL) - { - wd->zfcbApConnectNotify(dev, (u8_t*)addr, apId); - } - } - else - { - index = 0xffff; - } - } - } - else - { - zm_msg0_mm(ZM_LV_2, "Not found"); - if ((state == ZM_STATE_AUTH) || (state == ZM_STATE_PREAUTH)) - { - /* Get a new STA and update state */ - index = zfApGetNewSta(dev); - zm_msg2_mm(ZM_LV_1, "new STA index=", index); - - if (index != 0xffff) - { - for (i=0; i<3; i++) - { - wd->ap.staTable[index].addr[i] = addr[i]; - } - wd->ap.staTable[index].state = state; - wd->ap.staTable[index].valid = 1; - wd->ap.staTable[index].time = wd->tick; - wd->ap.staTable[index].vap = (u8_t)apId; - wd->ap.staTable[index].encryMode = ZM_NO_WEP; - } - } - } - - zmw_leave_critical_section(dev); - - return index; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApAgingSta */ -/* Aging STA in station table. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* number of 11b STA in STA table */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -void zfApAgingSta(zdev_t* dev) -{ - u16_t i; - u32_t deltaMs; - u16_t addr[3]; - u16_t txFlag; - u16_t psStaCount = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - wd->ap.gStaAssociated = wd->ap.bStaAssociated = 0; - - for (i=0; iap.staTable[i].valid == 1) - { - addr[0] = wd->ap.staTable[i].addr[0]; - addr[1] = wd->ap.staTable[i].addr[1]; - addr[2] = wd->ap.staTable[i].addr[2]; - /* millisecond */ - deltaMs = (u32_t)((u32_t)wd->tick-(u32_t)wd->ap.staTable[i].time) - * ZM_MS_PER_TICK; - - /* preauth */ - if ((wd->ap.staTable[i].state == ZM_STATE_PREAUTH) - && (deltaMs > ZM_PREAUTH_TIMEOUT_MS)) - { - /* Aging STA */ - wd->ap.staTable[i].valid = 0; - wd->ap.authSharing = 0; - txFlag = 1; - } - - /* auth */ - if ((wd->ap.staTable[i].state == ZM_STATE_AUTH) - && (deltaMs > ZM_AUTH_TIMEOUT_MS)) - { - /* Aging STA */ - wd->ap.staTable[i].valid = 0; - txFlag = 1; - } - - /* asoc */ - if (wd->ap.staTable[i].state == ZM_STATE_ASOC) - { - if (wd->ap.staTable[i].psMode != 0) - { - psStaCount++; - } - - if (deltaMs > ((u32_t)wd->ap.staAgingTimeSec<<10)) - { - /* Aging STA */ - zm_msg1_mm(ZM_LV_0, "Age STA index=", i); - wd->ap.staTable[i].valid = 0; - txFlag = 1; - } - else if (deltaMs > ((u32_t)wd->ap.staProbingTimeSec<<10)) - { - if (wd->ap.staTable[i].psMode == 0) - { - /* Probing non-PS STA */ - zm_msg1_mm(ZM_LV_0, "Probing STA index=", i); - wd->ap.staTable[i].time += - (wd->ap.staProbingTimeSec * ZM_TICK_PER_SECOND); - txFlag = 2; - } - } - } - - - } - zmw_leave_critical_section(dev); - - if (txFlag == 1) - { - /* Send deauthentication management frame */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, addr, 4, 0, 0); - } - else if (txFlag == 2) - { - zfSendMmFrame(dev, ZM_WLAN_DATA_FRAME, addr, 0, 0, 0); - } - - } - - wd->ap.staPowerSaving = psStaCount; - - return; -} - -void zfApProtctionMonitor(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - /* 11b STA associated => nonErp, Protect */ - if (wd->ap.bStaAssociated > 0) - { - /* Enable NonErp bit in information element */ - wd->erpElement = ZM_WLAN_NON_ERP_PRESENT_BIT - | ZM_WLAN_USE_PROTECTION_BIT; - - /* Enable protection mode */ - zfApSetProtectionMode(dev, 1); - - } - /* 11b STA not associated, protection OBSS present => Protect */ - else if (wd->ap.protectedObss > 2) //Threshold - { - if (wd->disableSelfCts == 0) - { - /* Disable NonErp bit in information element */ - wd->erpElement = ZM_WLAN_USE_PROTECTION_BIT; - - /* Enable protection mode */ - zfApSetProtectionMode(dev, 1); - } - } - else - { - /* Disable NonErp bit in information element */ - wd->erpElement = 0; - - /* Disable protection mode */ - zfApSetProtectionMode(dev, 0); - } - wd->ap.protectedObss = 0; -} - - -void zfApProcessBeacon(zdev_t* dev, zbuf_t* buf) -{ - u16_t offset; - u8_t ch; - - zmw_get_wlan_dev(dev); - - zm_msg0_mm(ZM_LV_3, "Rx beacon"); - - /* update Non-ERP flag(wd->ap.nonErpObss) */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP); - if (offset == 0xffff) - { - /* 11b OBSS */ - wd->ap.protectedObss++; - return; - } - - ch = zmw_rx_buf_readb(dev, buf, offset+2); - if ((ch & ZM_WLAN_USE_PROTECTION_BIT) == ZM_WLAN_USE_PROTECTION_BIT) - { - /* Protected OBSS */ - wd->ap.protectedObss = 1; - } - - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfProcessAuth */ -/* Process authenticate management frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : auth frame buffer */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -/* Note : AP allows one authenticating STA at a time, does not */ -/* support multiple authentication process. Make sure */ -/* authentication state machine will not be blocked due */ -/* to incompleted authentication handshake. */ -void zfApProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId) -{ - u16_t algo, seq, status; - u8_t authSharing; - u16_t ret; - u16_t i; - u8_t challengePassed = 0; - u8_t frameCtrl; - u32_t retAlgoSeq; - u32_t retStatus; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - - frameCtrl = zmw_rx_buf_readb(dev, buf, 1); - /* AP : Auth share 3 */ - /* shift for WEP IV */ - if ((frameCtrl & 0x40) != 0) - { - algo = zmw_rx_buf_readh(dev, buf, 28); - seq = zmw_rx_buf_readh(dev, buf, 30); - status = zmw_rx_buf_readh(dev, buf, 32); - } - else - { - algo = zmw_rx_buf_readh(dev, buf, 24); - seq = zmw_rx_buf_readh(dev, buf, 26); - status = zmw_rx_buf_readh(dev, buf, 28); - } - - zm_msg2_mm(ZM_LV_0, "Rx Auth, seq=", seq); - - /* Set default to authentication algorithm not support */ - retAlgoSeq = 0x20000 | algo; - retStatus = 13; /* authentication algorithm not support */ - - /* AP : Auth open 1 */ - if (algo == 0) - { - if (wd->ap.authAlgo[apId] == 0) - { - retAlgoSeq = 0x20000; - if (seq == 1) - { - /* AP : update STA to auth */ - ret = zfApAddSta(dev, src, ZM_STATE_AUTH, apId, 0, 0, 0); - if (ret != 0xffff) - { - /* AP : call zfwAuthNotify() for host to judge */ - //zfwAuthNotify(dev, src); - - /* AP : response Auth seq=2, success */ - retStatus = 0; - - } - else - { - /* AP : response Auth seq=2, unspecific error */ - retStatus = 1; - } - } - else - { - /* AP : response Auth seq=2, sequence number out of expected */ - retStatus = 14; - } - } - } - /* AP : Auth share 1 */ - else if (algo == 1) - { - if (wd->ap.authAlgo[apId] == 1) - { - if (seq == 1) - { - retAlgoSeq = 0x20001; - - /* critical section */ - zmw_enter_critical_section(dev); - if (wd->ap.authSharing == 1) - { - authSharing = 1; - } - else - { - authSharing = 0; - wd->ap.authSharing = 1; - } - /* end of critical section */ - zmw_leave_critical_section(dev); - - if (authSharing == 1) - { - /* AP : response Auth seq=2, status = fail */ - retStatus = 1; - } - else - { - /* AP : update STA to preauth */ - zfApAddSta(dev, src, ZM_STATE_PREAUTH, apId, 0, 0, 0); - - /* AP : call zfwAuthNotify() for host to judge */ - //zfwAuthNotify(dev, src); - - /* AP : response Auth seq=2 */ - retStatus = 0; - } - } - else if (seq == 3) - { - retAlgoSeq = 0x40001; - - if (wd->ap.authSharing == 1) - { - /* check challenge text */ - if (zmw_buf_readh(dev, buf, 30+4) == 0x8010) - { - for (i=0; i<128; i++) - { - if (wd->ap.challengeText[i] - != zmw_buf_readb(dev, buf, 32+i+4)) - { - break; - } - } - if (i == 128) - { - challengePassed = 1; - } - } - - if (challengePassed == 1) - { - /* AP : update STA to auth */ - zfApAddSta(dev, src, ZM_STATE_AUTH, apId, 0, 0, 0); - - /* AP : response Auth seq=2 */ - retStatus = 0; - } - else - { - /* AP : response Auth seq=2, challenge failure */ - retStatus = 15; - - /* TODO : delete STA */ - } - - wd->ap.authSharing = 0; - } - } - else - { - retAlgoSeq = 0x40001; - retStatus = 14; - } - } - } - - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH, src, retAlgoSeq, - retStatus, apId); - return; -} - -void zfApProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId) -{ - u16_t aid = 0xffff; - u8_t frameType; - u16_t offset; - u8_t staType = 0; - u8_t qosType = 0; - u8_t qosInfo = 0; - u8_t tmp; - u16_t i, j, k; - u16_t encMode = 0; - - zmw_get_wlan_dev(dev); - /* AP : check SSID */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID); - if (offset != 0xffff) - { - k = 0; - for (j = 0; j < wd->ap.vapNumber; j++) - { - tmp = zmw_buf_readb(dev, buf, offset+1); - if (tmp - != wd->ap.ssidLen[j]) - { - k++; - } - } - if (k == wd->ap.vapNumber) - { - goto zlDeauth; - } - - k = 0; - for (j = 0; j < wd->ap.vapNumber; j++) - { - for (i=0; iap.ssidLen[j]; i++) - { - tmp = zmw_buf_readb(dev, buf, offset+2+i); - if (tmp - != wd->ap.ssid[j][i]) - { - break; - } - } - if (i == wd->ap.ssidLen[j]) - { - apId = j; - } - else - { - k++; - } - } - if (k == wd->ap.vapNumber) - { - goto zlDeauth; - } - } - - /* TODO : check capability */ - - /* AP : check support rate */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE); - if (offset != 0xffff) - { - /* 11g STA */ - staType = 1; - } - //CWYang(+) - offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY); - if (offset != 0xffff) - { - /* 11n STA */ - staType = 2; - } - - /* TODO : do not allow 11b STA to associated in Pure G mode */ - if (wd->ap.wlanType[apId] == ZM_WLAN_TYPE_PURE_G && staType == 0) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 3, 0, 0); - return; - } - - /* In pure B mode, we set G STA into B mode */ - if (wd->ap.wlanType[apId] == ZM_WLAN_TYPE_PURE_B && staType == 1) - { - staType = 0; - } - - /* AP : check 11i and WPA */ - /* AP : check 11h */ - - /* AP : check WME */ - offset = zfFindWifiElement(dev, buf, 2, 0); - if (offset != 0xffff) - { - /* WME STA */ - qosType = 1; - zm_msg0_mm(ZM_LV_0, "WME STA"); - - if (wd->ap.uapsdEnabled != 0) - { - qosInfo = zmw_rx_buf_readb(dev, buf, offset+8); - } - } - - if (wd->ap.wpaSupport[apId] == 1) - { - offset = zfFindElement(dev, buf, ZM_WLAN_EID_WPA_IE); - if (offset != 0xffff) - { - /* get WPA IE */ - u8_t length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length+2 < ZM_MAX_WPAIE_SIZE) - { - zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2); - wd->ap.stawpaLen[apId] = length+2; - encMode = 1; - - - zm_msg1_mm(ZM_LV_0, "WPA Mode zfwAsocNotify, apId=", apId); - - /* AP : Call zfwAsocNotify() */ - if (wd->zfcbAsocNotify != NULL) - { - wd->zfcbAsocNotify(dev, src, wd->ap.stawpaIe[apId], wd->ap.stawpaLen[apId], apId); - } - } - else - { - goto zlDeauth; - } - } - else if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_RSN_IE)) != 0xffff ) - { - /* get RSN IE */ - u8_t length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length+2 < ZM_MAX_WPAIE_SIZE) - { - zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2); - wd->ap.stawpaLen[apId] = length+2; - encMode = 1; - - zm_msg1_mm(ZM_LV_0, "RSN Mode zfwAsocNotify, apId=", apId); - - /* AP : Call zfwAsocNotify() */ - if (wd->zfcbAsocNotify != NULL) - { - wd->zfcbAsocNotify(dev, src, wd->ap.stawpaIe[apId], wd->ap.stawpaLen[apId], apId); - } - } - else - { - goto zlDeauth; - } - } -#ifdef ZM_ENABLE_CENC - else if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_CENC_IE)) != 0xffff ) - { - /* get CENC IE */ - u8_t length = zmw_rx_buf_readb(dev, buf, offset+1); - - if (length+2 < ZM_MAX_WPAIE_SIZE) - { - zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2); - wd->ap.stawpaLen[apId] = length+2; - encMode = 1; - - zm_msg1_mm(ZM_LV_0, "CENC Mode zfwAsocNotify, apId=", apId); - - /* AP : Call zfwAsocNotify() */ - if (wd->zfcbCencAsocNotify != NULL) - { - wd->zfcbCencAsocNotify(dev, src, wd->ap.stawpaIe[apId], - wd->ap.stawpaLen[apId], apId); - } - } - else - { - goto zlDeauth; - } - } -#endif //ZM_ENABLE_CENC - else - { /* ap is encryption but sta has no wpa/rsn ie */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0); - return; - } - } - /* sta has wpa/rsn ie but ap is no encryption */ - if ((wd->ap.wpaSupport[apId] == 0) && (encMode == 1)) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0); - return; - } - - /* AP : update STA to asoc */ - aid = zfApAddSta(dev, src, ZM_STATE_ASOC, apId, staType, qosType, qosInfo); - - zfApStoreAsocReqIe(dev, buf, aid); - -zlDeauth: - /* AP : send asoc rsp2 */ - if (aid != 0xffff) - { - frameType = zmw_rx_buf_readb(dev, buf, 0); - - if (frameType == ZM_WLAN_FRAME_TYPE_ASOCREQ) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCRSP, src, 0, aid+1, apId); - } - else - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_REASOCRSP, src, 0, aid+1, apId); - } - } - else - { - /* TODO : send deauthentication */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0); - } - - return; -} - -void zfApStoreAsocReqIe(zdev_t* dev, zbuf_t* buf, u16_t aid) -{ - //struct zsWlanAssoFrameHeader* pAssoFrame; - //u8_t pBuf[sizeof(struct zsWlanAssoFrameHeader)]; - u16_t offset; - u32_t i; - u16_t length; - u8_t *htcap; - - zmw_get_wlan_dev(dev); - - for (i=0; ista.asocRspFrameBodySize; i++) - { - wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24); - } - /* capability: 2 octets */ - offset = 24; - - /* Listen interval: 2 octets */ - offset = 26; - - /* SSID */ - offset = 28; - - /* supported rates */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_SUPPORT_RATE); - if (offset == 0xffff) - return; - length = zmw_rx_buf_readb(dev, buf, offset + 1); - - /* extended supported rates */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE); - if (offset == 0xffff) - return; - length = zmw_rx_buf_readb(dev, buf, offset + 1); - - /* power capability:4 octets */ - offset = offset + 2 + length; - - /* supported channels: 4 octets */ - offset = offset + 2 + 4; - - /* RSN */ - - /* QoS */ - - /* HT capabilities: 28 octets */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY); - if (offset != 0xffff) { - /* atheros pre n */ - htcap = (u8_t *)&wd->ap.ie[aid].HtCap; - htcap[0] = zmw_rx_buf_readb(dev, buf, offset); - htcap[1] = 26; - for (i=1; i<=26; i++) - { - htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i); - zm_debug_msg2("ASOC: HT Capabilities, htcap=", htcap[i+1]); - } - return; - } - else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff) { - /* pre n 2.0 standard */ - htcap = (u8_t *)&wd->ap.ie[aid].HtCap; - for (i=0; i<28; i++) - { - htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i); - zm_debug_msg2("ASOC: HT Capabilities, htcap=", htcap[i]); - } - } - else { - /* not 11n AP */ - return; - } - - - /* supported regulatory classes */ - offset = offset + length; - //length = zmw_rx_buf_readb(dev, buf, offset + 1); - { - u8_t *htcap; - htcap = (u8_t *)&wd->sta.ie.HtInfo; - //zm_debug_msg2("ASOC: HT Capabilities info=", ((u16_t *)htcap)[1]); - //zm_debug_msg2("ASOC: A-MPDU parameters=", htcap[4]); - //zm_debug_msg2("ASOC: Supported MCS set=", ((u32_t *)htcap)[1]>>8); - } - -} - -void zfApProcessAsocRsp(zdev_t* dev, zbuf_t* buf) -{ - -} - -void zfApProcessDeauth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId) -{ - u16_t aid; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - /* AP : if SA=associated STA then deauthenticate STA */ - aid = zfApFindSta(dev, src); - if (aid != 0xffff) - { - /* Clear STA table */ - wd->ap.staTable[aid].valid = 0; - if (wd->zfcbDisAsocNotify != NULL) - { - wd->zfcbDisAsocNotify(dev, (u8_t*)src, apId); - } - } - zmw_leave_critical_section(dev); - -} - -void zfApProcessDisasoc(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId) -{ - u16_t aid; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - /* AP : if SA=associated STA then deauthenticate STA */ - aid = zfApFindSta(dev, src); - if (aid != 0xffff) - { - /* Clear STA table */ - wd->ap.staTable[aid].valid = 0; - zmw_leave_critical_section(dev); - if (wd->zfcbDisAsocNotify != NULL) - { - wd->zfcbDisAsocNotify(dev, (u8_t*)src, apId); - } - } - zmw_leave_critical_section(dev); - -} - - -void zfApProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) -{ -#if 0 - zmw_get_wlan_dev(dev); - - zm_msg0_mm(ZM_LV_0, "Rx probersp"); - - /* Gather scan result */ - - //zm_debug_msg1("bssList Count = ", wd->sta.bssList.bssCount); - /* return if not in scanning */ - if ((wd->heartBeatNotification & ZM_BSSID_LIST_SCAN) - != ZM_BSSID_LIST_SCAN) - { - return; - } - - //if ( wd->sta.pUpdateBssList->bssCount == ZM_MAX_BSS ) - if ( wd->sta.bssList.bssCount == ZM_MAX_BSS ) - { - return; - } - - zfProcessProbeRsp(dev, buf, AddInfo); - -#endif -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApAddIeSsid */ -/* Add AP information element SSID to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* vap : virtual AP ID */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.11 */ -/* */ -/************************************************************************/ -u16_t zfApAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap) -{ - u16_t i; - - zmw_get_wlan_dev(dev); - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.ssidLen[vap]); - - /* Information : SSID */ - for (i=0; iap.ssidLen[vap]; i++) - { - zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.ssid[vap][i]); - } - - return offset; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApAddIeTim */ -/* Add AP information element TIM to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* vap : virtual AP ID */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.11 */ -/* */ -/************************************************************************/ -u16_t zfApAddIeTim(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap) -{ - u8_t uniBitMap[9]; - u16_t highestByte; - u16_t i; - u16_t lenOffset; - u16_t id; - u16_t dst[3]; - u16_t aid; - u16_t bitPosition; - u16_t bytePosition; - zbuf_t* psBuf; - zbuf_t* tmpBufArray[ZM_UNI_ARRAY_SIZE]; - u16_t tmpBufArraySize = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_TIM); - - /* offset of Element Length */ - lenOffset = offset++; - - /* Information : TIM */ - /* DTIM count */ - /* TODO : Doesn't work for Virtual AP's case */ - wd->CurrentDtimCount++; - if (wd->CurrentDtimCount >= wd->dtim) - { - wd->CurrentDtimCount = 0; - } - zmw_tx_buf_writeb(dev, buf, offset++, wd->CurrentDtimCount); - /* DTIM period */ - zmw_tx_buf_writeb(dev, buf, offset++, wd->dtim); - /* bitmap offset */ - zmw_tx_buf_writeb(dev, buf, offset++, 0); - - /* Update BCMC bit */ - if (wd->CurrentDtimCount == 0) - { - zmw_enter_critical_section(dev); - wd->ap.timBcmcBit[vap] = (wd->ap.bcmcTail[vap]!=wd->ap.bcmcHead[vap])?1:0; - zmw_leave_critical_section(dev); - } - else - { - wd->ap.timBcmcBit[vap] = 0; - } - - /* Update Unicast bitmap */ - /* reset bit map */ - for (i=0; i<9; i++) - { - uniBitMap[i] = 0; - } - highestByte = 0; -#if 1 - - zmw_enter_critical_section(dev); - - id = wd->ap.uniHead; - while (id != wd->ap.uniTail) - { - psBuf = wd->ap.uniArray[id]; - - /* TODO : Aging PS frame after queuing for more than 10 seconds */ - - /* get destination STA's aid */ - dst[0] = zmw_tx_buf_readh(dev, psBuf, 0); - dst[1] = zmw_tx_buf_readh(dev, psBuf, 2); - dst[2] = zmw_tx_buf_readh(dev, psBuf, 4); - aid = zfApFindSta(dev, dst); - if (aid != 0xffff) - { - if (wd->ap.staTable[aid].psMode != 0) - { - zm_msg1_mm(ZM_LV_0, "aid=",aid); - aid++; - zm_assert(aid<=64); - bitPosition = (1 << (aid & 0x7)); - bytePosition = (aid >> 3); - uniBitMap[bytePosition] |= bitPosition; - - if (bytePosition>highestByte) - { - highestByte = bytePosition; - } - id = (id+1) & (ZM_UNI_ARRAY_SIZE-1); - } - else - { - zm_msg0_mm(ZM_LV_0, "Send PS frame which STA no longer in PS mode"); - /* Send PS frame which STA no longer in PS mode */ - zfApRemoveFromPsQueue(dev, id, dst); - tmpBufArray[tmpBufArraySize++] = psBuf; - } - } - else - { - zm_msg0_mm(ZM_LV_0, "Free garbage PS frame"); - /* Free garbage PS frame */ - zfApRemoveFromPsQueue(dev, id, dst); - zfwBufFree(dev, psBuf, 0); - } - } - - zmw_leave_critical_section(dev); -#endif - - zfQueueGenerateUapsdTim(dev, wd->ap.uapsdQ, uniBitMap, &highestByte); - - zm_msg1_mm(ZM_LV_3, "bm=",uniBitMap[0]); - zm_msg1_mm(ZM_LV_3, "highestByte=",highestByte); - zm_msg1_mm(ZM_LV_3, "timBcmcBit[]=",wd->ap.timBcmcBit[vap]); - - /* bitmap */ - zmw_tx_buf_writeb(dev, buf, offset++, - uniBitMap[0] | wd->ap.timBcmcBit[vap]); - for (i=0; iap.uniTail = (wd->ap.uniTail-1) & (ZM_UNI_ARRAY_SIZE-1); - while (id != wd->ap.uniTail) - { - nid = (id + 1) & (ZM_UNI_ARRAY_SIZE - 1); - wd->ap.uniArray[id] = wd->ap.uniArray[nid]; - - /* Search until tail to config more data bit */ - dst[0] = zmw_buf_readh(dev, wd->ap.uniArray[id], 0); - dst[1] = zmw_buf_readh(dev, wd->ap.uniArray[id], 2); - dst[2] = zmw_buf_readh(dev, wd->ap.uniArray[id], 4); - if ((addr[0] == dst[0]) && (addr[1] == dst[1]) - && (addr[2] == dst[2])) - { - moreData = 0x20; - } - - id = nid; - } - return moreData; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApAddIeWmePara */ -/* Add WME Parameter Element to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* vap : virtual AP ID */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.1 */ -/* */ -/************************************************************************/ -u16_t zfApAddIeWmePara(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap) -{ - zmw_get_wlan_dev(dev); - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WIFI_IE); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, 24); - - /* OUI */ - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - zmw_tx_buf_writeb(dev, buf, offset++, 0x50); - zmw_tx_buf_writeb(dev, buf, offset++, 0xF2); - zmw_tx_buf_writeb(dev, buf, offset++, 0x02); - zmw_tx_buf_writeb(dev, buf, offset++, 0x01); - zmw_tx_buf_writeb(dev, buf, offset++, 0x01); - - /* QoS Info */ - if (wd->ap.uapsdEnabled) - { - zmw_tx_buf_writeb(dev, buf, offset++, 0x81); - } - else - { - zmw_tx_buf_writeb(dev, buf, offset++, 0x01); - } - - /* Reserved */ - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - - /* Best Effort AC parameters */ - zmw_tx_buf_writeb(dev, buf, offset++, 0x03); - zmw_tx_buf_writeb(dev, buf, offset++, 0xA4); - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - /* Backfround AC parameters */ - zmw_tx_buf_writeb(dev, buf, offset++, 0x27); - zmw_tx_buf_writeb(dev, buf, offset++, 0xA4); - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - /* Video AC parameters */ - zmw_tx_buf_writeb(dev, buf, offset++, 0x42); - zmw_tx_buf_writeb(dev, buf, offset++, 0x43); - zmw_tx_buf_writeb(dev, buf, offset++, 0x5E); - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - /* Voice AC parameters */ - zmw_tx_buf_writeb(dev, buf, offset++, 0x62); - zmw_tx_buf_writeb(dev, buf, offset++, 0x32); - zmw_tx_buf_writeb(dev, buf, offset++, 0x2F); - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - - return offset; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApSendBeacon */ -/* Sned AP mode beacon. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.11 */ -/* */ -/************************************************************************/ -void zfApSendBeacon(zdev_t* dev) -{ - zbuf_t* buf; - u16_t offset; - u16_t vap; - u16_t seq; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - wd->ap.beaconCounter++; - if (wd->ap.beaconCounter >= wd->ap.vapNumber) - { - wd->ap.beaconCounter = 0; - } - vap = wd->ap.beaconCounter; - - - zm_msg1_mm(ZM_LV_2, "Send beacon, vap=", vap); - - /* TBD : Maximum size of beacon */ - buf = zfwBufAllocate(dev, 1024); - if (buf == NULL) - { - zm_msg0_mm(ZM_LV_0, "Alloc beacon buf Fail!"); - return; - } - - offset = 0; - - /* wlan header */ - /* Frame control */ - zmw_tx_buf_writeh(dev, buf, offset, 0x0080); - offset+=2; - /* Duration */ - zmw_tx_buf_writeh(dev, buf, offset, 0x0000); - offset+=2; - /* Address 1 */ - zmw_tx_buf_writeh(dev, buf, offset, 0xffff); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, 0xffff); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, 0xffff); - offset+=2; - /* Address 2 */ - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]); - offset+=2; -#ifdef ZM_VAPMODE_MULTILE_SSID - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]); //Multiple SSID -#else - zmw_tx_buf_writeh(dev, buf, offset, (wd->macAddr[2]+(vap<<8))); //VAP -#endif - offset+=2; - /* Address 3 */ - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]); - offset+=2; -#ifdef ZM_VAPMODE_MULTILE_SSID - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]); //Multiple SSID -#else - zmw_tx_buf_writeh(dev, buf, offset, (wd->macAddr[2]+(vap<<8))); //VAP -#endif - offset+=2; - - /* Sequence number */ - zmw_enter_critical_section(dev); - seq = ((wd->mmseq++)<<4); - zmw_leave_critical_section(dev); - zmw_tx_buf_writeh(dev, buf, offset, seq); - offset+=2; - - /* 24-31 Time Stamp : hardware will fill this field */ - zmw_tx_buf_writeh(dev, buf, offset, 0); - zmw_tx_buf_writeh(dev, buf, offset+2, 0); - zmw_tx_buf_writeh(dev, buf, offset+4, 0); - zmw_tx_buf_writeh(dev, buf, offset+6, 0); - offset+=8; - - /* Beacon Interval */ - zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval); - offset+=2; - - /* Capability */ - zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]); - offset+=2; - - /* SSID */ - if (wd->ap.hideSsid[vap] == 0) - { - offset = zfApAddIeSsid(dev, buf, offset, vap); - } - else - { - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID); - zmw_tx_buf_writeb(dev, buf, offset++, 0); - - } - - /* Support Rate */ - if ( wd->frequency < 3000 ) - { - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK); - } - else - { - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM); - } - - /* DS parameter set */ - offset = zfMmAddIeDs(dev, buf, offset); - - /* TIM */ - offset = zfApAddIeTim(dev, buf, offset, vap); - - /* If WLAN Type is not PURE B */ - if (wd->ap.wlanType[vap] != ZM_WLAN_TYPE_PURE_B) - { - if ( wd->frequency < 3000 ) - { - /* ERP Information */ - offset = zfMmAddIeErp(dev, buf, offset); - - /* Extended Supported Rates */ - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM); - } - } - - /* TODO : country information */ - /* TODO : RSN */ - if (wd->ap.wpaSupport[vap] == 1) - { - offset = zfMmAddIeWpa(dev, buf, offset, vap); - } - - /* WME Parameters */ - if (wd->ap.qosMode == 1) - { - offset = zfApAddIeWmePara(dev, buf, offset, vap); - } - - /* HT Capabilities Info */ - offset = zfMmAddHTCapability(dev, buf, offset); - - /* Extended HT Capabilities Info */ - offset = zfMmAddExtendedHTCapability(dev, buf, offset); - - /* 1212 : write to beacon fifo */ - /* 1221 : write to share memory */ - zfHpSendBeacon(dev, buf, offset); - - /* Free beacon buffer */ - /* TODO: In order to fit the madwifi beacon architecture, we need to - free beacon buffer in the HAL layer. - */ - - //zfwBufFree(dev, buf, 0); -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfIntrabssForward */ -/* Called to transmit intra-BSS frame from upper layer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer pointer */ -/* vap : virtual AP */ -/* */ -/* OUTPUTS */ -/* 1 : unicast intras-BSS frame */ -/* 0 : other frames */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2005.11 */ -/* */ -/************************************************************************/ -u16_t zfIntrabssForward(zdev_t* dev, zbuf_t* buf, u8_t srcVap) -{ - u16_t err; - u16_t asocFlag = 0; - u16_t dst[3]; - u16_t aid; - u16_t staState; - zbuf_t* txBuf; - u16_t len; - u16_t i; - u16_t temp; - u16_t ret; - u8_t vap = 0; -#ifdef ZM_ENABLE_NATIVE_WIFI - dst[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET); - dst[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2); - dst[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4); -#else - dst[0] = zmw_rx_buf_readh(dev, buf, 0); - dst[1] = zmw_rx_buf_readh(dev, buf, 2); - dst[2] = zmw_rx_buf_readh(dev, buf, 4); -#endif // ZM_ENABLE_NATIVE_WIFI - - /* Do Intra-BSS forward(data copy) if necessary*/ - if ((dst[0]&0x1) != 0x1) - { - aid = zfApGetSTAInfo(dev, dst, &staState, &vap); - if ((aid != 0xffff) && (staState == ZM_STATE_ASOC) && (srcVap == vap)) - { - asocFlag = 1; - zm_msg0_rx(ZM_LV_2, "Intra-BSS forward : asoc STA"); - } - - } - else - { - vap = srcVap; - zm_msg0_rx(ZM_LV_2, "Intra-BSS forward : BCorMC"); - } - - /* destination address = associated STA or BC/MC */ - if ((asocFlag == 1) || ((dst[0]&0x1) == 0x1)) - { - /* Allocate frame */ - txBuf = zfwBufAllocate(dev, ZM_RX_FRAME_SIZE); - if (txBuf == NULL) - { - zm_msg0_rx(ZM_LV_1, "Alloc intra-bss buf Fail!"); - goto zlAllocError; - } - - /* Copy frame */ - len = zfwBufGetSize(dev, buf); - for (i=0; iap.staTable[id].rxMicKey); - - return NULL; -} - -struct zsMicVar* zfApGetTxMicKey(zdev_t* dev, zbuf_t* buf, u8_t* qosType) -{ - u8_t da[6]; - u16_t id = 0, macAddr[3]; - - zmw_get_wlan_dev(dev); - - zfCopyFromIntTxBuffer(dev, buf, da, 0, 6); - - macAddr[0] = da[0] + (da[1] << 8); - macAddr[1] = da[2] + (da[3] << 8); - macAddr[2] = da[4] + (da[5] << 8); - - if ((macAddr[0] & 0x1)) - { - return (&wd->ap.bcMicKey[0]); - } - else if ((id = zfApFindSta(dev, macAddr)) != 0xffff) - { - *qosType = wd->ap.staTable[id].qosType; - return (&wd->ap.staTable[id].txMicKey); - } - - return NULL; -} - -u16_t zfApUpdatePsBit(zdev_t* dev, zbuf_t* buf, u8_t* vap, u8_t* uapsdTrig) -{ - u16_t staState; - u16_t aid; - u16_t psBit; - u16_t src[3]; - u16_t dst[1]; - u16_t i; - - zmw_get_wlan_dev(dev); - - src[0] = zmw_rx_buf_readh(dev, buf, 10); - src[1] = zmw_rx_buf_readh(dev, buf, 12); - src[2] = zmw_rx_buf_readh(dev, buf, 14); - - if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3) - { - /* AP */ - dst[0] = zmw_rx_buf_readh(dev, buf, 4); - - psBit = (zmw_rx_buf_readb(dev, buf, 1) & 0x10) >> 4; - /* Get AID and update STA PS mode */ - aid = zfApGetSTAInfoAndUpdatePs(dev, src, &staState, vap, psBit, uapsdTrig); - - /* if STA not associated, send deauth */ - if ((aid == 0xffff) || (staState != ZM_STATE_ASOC)) - { - if ((dst[0]&0x1)==0) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 0x7, - 0, 0); - } - - return ZM_ERR_STA_NOT_ASSOCIATED; - } - } /* if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3) */ - else - { - /* WDS */ - for (i=0; iap.wds.wdsBitmap & (1<ap.wds.macAddr[i][0]) - && (src[1] == wd->ap.wds.macAddr[i][1]) - && (src[2] == wd->ap.wds.macAddr[i][2])) - { - *vap = 0x20 + i; - break; - } - } - } - } - return ZM_SUCCESS; -} - -void zfApProcessPsPoll(zdev_t* dev, zbuf_t* buf) -{ - u16_t src[3]; - u16_t dst[3]; - zbuf_t* psBuf = NULL; - u16_t id; - u8_t moreData = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - src[0] = zmw_tx_buf_readh(dev, buf, 10); - src[1] = zmw_tx_buf_readh(dev, buf, 12); - src[2] = zmw_tx_buf_readh(dev, buf, 14); - - /* Find ps buffer for PsPoll */ - zmw_enter_critical_section(dev); - id = wd->ap.uniHead; - while (id != wd->ap.uniTail) - { - psBuf = wd->ap.uniArray[id]; - - dst[0] = zmw_tx_buf_readh(dev, psBuf, 0); - dst[1] = zmw_tx_buf_readh(dev, psBuf, 2); - dst[2] = zmw_tx_buf_readh(dev, psBuf, 4); - - if ((src[0] == dst[0]) && (src[1] == dst[1]) && (src[2] == dst[2])) - { - moreData = zfApRemoveFromPsQueue(dev, id, src); - break; - } - else - { - psBuf = NULL; - } - id = (id + 1) & (ZM_UNI_ARRAY_SIZE - 1); - } - zmw_leave_critical_section(dev); - - /* Send ps buffer */ - if (psBuf != NULL) - { - /* Send with more data bit */ - zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, moreData); - } - - return; -} - -void zfApSetProtectionMode(zdev_t* dev, u16_t mode) -{ - zmw_get_wlan_dev(dev); - - if (mode == 0) - { - if (wd->ap.protectionMode != mode) - { - /* Write MAC&PHY registers to disable protection */ - - wd->ap.protectionMode = mode; - } - - } - else - { - if (wd->ap.protectionMode != mode) - { - /* Write MAC&PHY registers to enable protection */ - - wd->ap.protectionMode = mode; - } - } - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfApSendFailure */ -/* Send failure. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : receiver address */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2007.1 */ -/* */ -/************************************************************************/ -void zfApSendFailure(zdev_t* dev, u8_t* addr) -{ - u16_t id; - u16_t staAddr[3]; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - staAddr[0] = addr[0] + (((u16_t)addr[1])<<8); - staAddr[1] = addr[2] + (((u16_t)addr[3])<<8); - staAddr[2] = addr[4] + (((u16_t)addr[5])<<8); - zmw_enter_critical_section(dev); - id = zfApFindSta(dev, staAddr); - if (id != 0xffff) - { - /* Send failture : Add 3 minutes to inactive time that will */ - /* will make STA been kicked out soon */ - wd->ap.staTable[id].time -= (3*ZM_TICK_PER_MINUTE); - } - zmw_leave_critical_section(dev); -} - - -void zfApProcessAction(zdev_t* dev, zbuf_t* buf) -{ - u8_t category; - - //zmw_get_wlan_dev(dev); - - //zmw_declare_for_critical_section(); - - category = zmw_rx_buf_readb(dev, buf, 24); - - switch (category) - { - case ZM_WLAN_BLOCK_ACK_ACTION_FRAME: - zfAggBlockAckActionFrame(dev, buf); - break; - default: - break; - } - - return; -} diff --git a/drivers/staging/otus/80211core/cmmsta.c b/drivers/staging/otus/80211core/cmmsta.c deleted file mode 100644 index 0fda30d05ed2..000000000000 --- a/drivers/staging/otus/80211core/cmmsta.c +++ /dev/null @@ -1,5817 +0,0 @@ -/* - * 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" -#include "../hal/hpreg.h" - -/* TODO : change global variable to constant */ -u8_t zgWpaRadiusOui[] = { 0x00, 0x50, 0xf2, 0x01 }; -u8_t zgWpaAesOui[] = { 0x00, 0x50, 0xf2, 0x04 }; -u8_t zgWpa2RadiusOui[] = { 0x00, 0x0f, 0xac, 0x01 }; -u8_t zgWpa2AesOui[] = { 0x00, 0x0f, 0xac, 0x04 }; - -const u16_t zcCwTlb[16] = { 0, 1, 3, 7, 15, 31, 63, 127, - 255, 511, 1023, 2047, 4095, 4095, 4095, 4095}; - -void zfStaStartConnectCb(zdev_t* dev); - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaPutApIntoBlockingList */ -/* Put AP into blocking AP list. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* bssid : AP's BSSID */ -/* weight : weight of AP */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -void zfStaPutApIntoBlockingList(zdev_t* dev, u8_t* bssid, u8_t weight) -{ - u16_t i, j; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - if (weight > 0) - { - zmw_enter_critical_section(dev); - /*Find same bssid entry first*/ - for (i=0; ista.blockingApList[i].addr[j]!= bssid[j]) - { - break; - } - } - - if(j==6) - { - break; - } - } - /*This bssid doesn't have old record.Find an empty entry*/ - if (i == ZM_MAX_BLOCKING_AP_LIST_SIZE) - { - for (i=0; ista.blockingApList[i].weight == 0) - { - break; - } - } - } - - /* If the list is full, pick one entry for replacement */ - if (i == ZM_MAX_BLOCKING_AP_LIST_SIZE) - { - i = bssid[5] & (ZM_MAX_BLOCKING_AP_LIST_SIZE-1); - } - - /* Update AP address and weight */ - for (j=0; j<6; j++) - { - wd->sta.blockingApList[i].addr[j] = bssid[j]; - } - - wd->sta.blockingApList[i].weight = weight; - zmw_leave_critical_section(dev); - } - - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaIsApInBlockingList */ -/* Is AP in blocking list. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* bssid : AP's BSSID */ -/* */ -/* OUTPUTS */ -/* TRUE : AP in blocking list */ -/* FALSE : AP not in blocking list */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfStaIsApInBlockingList(zdev_t* dev, u8_t* bssid) -{ - u16_t i, j; - zmw_get_wlan_dev(dev); - //zmw_declare_for_critical_section(); - - //zmw_enter_critical_section(dev); - for (i=0; ista.blockingApList[i].weight != 0) - { - for (j=0; j<6; j++) - { - if (wd->sta.blockingApList[i].addr[j] != bssid[j]) - { - break; - } - } - if (j == 6) - { - //zmw_leave_critical_section(dev); - return TRUE; - } - } - } - //zmw_leave_critical_section(dev); - return FALSE; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaRefreshBlockList */ -/* Is AP in blocking list. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* flushFlag : flush whole blocking list */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -void zfStaRefreshBlockList(zdev_t* dev, u16_t flushFlag) -{ - u16_t i; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - for (i=0; ista.blockingApList[i].weight != 0) - { - if (flushFlag != 0) - { - wd->sta.blockingApList[i].weight = 0; - } - else - { - wd->sta.blockingApList[i].weight--; - } - } - } - zmw_leave_critical_section(dev); - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaConnectFail */ -/* Handle Connect failure. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* bssid : BSSID */ -/* reason : reason of failure */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -void zfStaConnectFail(zdev_t* dev, u16_t reason, u16_t* bssid, u8_t weight) -{ - zmw_get_wlan_dev(dev); - - /* Change internal state */ - zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT); - - /* Improve WEP/TKIP performance with HT AP, detail information please look bug#32495 */ - //zfHpSetTTSIFSTime(dev, 0x8); - - /* Notify wrapper of connection status changes */ - if (wd->zfcbConnectNotify != NULL) - { - wd->zfcbConnectNotify(dev, reason, bssid); - } - - /* Put AP into internal blocking list */ - zfStaPutApIntoBlockingList(dev, (u8_t *)bssid, weight); - - /* Issue another SCAN */ - if ( wd->sta.bAutoReconnect ) - { - zm_debug_msg0("Start internal scan..."); - zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL); - zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL); - } -} - -u8_t zfiWlanIBSSGetPeerStationsCount(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->sta.oppositeCount; -} - -u8_t zfiWlanIBSSIteratePeerStations(zdev_t* dev, u8_t numToIterate, zfpIBSSIteratePeerStationCb callback, void *ctx) -{ - u8_t oppositeCount; - u8_t i; - u8_t index = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - oppositeCount = wd->sta.oppositeCount; - if ( oppositeCount > numToIterate ) - { - oppositeCount = numToIterate; - } - - for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++) - { - if ( oppositeCount == 0 ) - { - break; - } - - if ( wd->sta.oppositeInfo[i].valid == 0 ) - { - continue; - } - - callback(dev, &wd->sta.oppositeInfo[i], ctx, index++); - oppositeCount--; - - } - - zmw_leave_critical_section(dev); - - return index; -} - - -s8_t zfStaFindFreeOpposite(zdev_t* dev, u16_t *sa, int *pFoundIdx) -{ - int oppositeCount; - int i; - - zmw_get_wlan_dev(dev); - - oppositeCount = wd->sta.oppositeCount; - - for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++) - { - if ( oppositeCount == 0 ) - { - break; - } - - if ( wd->sta.oppositeInfo[i].valid == 0 ) - { - continue; - } - - oppositeCount--; - if ( zfMemoryIsEqual((u8_t*) sa, wd->sta.oppositeInfo[i].macAddr, 6) ) - { - //wd->sta.oppositeInfo[i].aliveCounter++; - wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER; - - /* it is already stored */ - return 1; - } - } - - // Check if there's still space for new comer - if ( wd->sta.oppositeCount == ZM_MAX_OPPOSITE_COUNT ) - { - return -1; - } - - // Find an unused slot for new peer station - for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++) - { - if ( wd->sta.oppositeInfo[i].valid == 0 ) - { - break; - } - } - - *pFoundIdx = i; - return 0; -} - -s8_t zfStaFindOppositeByMACAddr(zdev_t* dev, u16_t *sa, u8_t *pFoundIdx) -{ - u32_t oppositeCount; - u32_t i; - - zmw_get_wlan_dev(dev); - - oppositeCount = wd->sta.oppositeCount; - - for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++) - { - if ( oppositeCount == 0 ) - { - break; - } - - if ( wd->sta.oppositeInfo[i].valid == 0 ) - { - continue; - } - - oppositeCount--; - if ( zfMemoryIsEqual((u8_t*) sa, wd->sta.oppositeInfo[i].macAddr, 6) ) - { - *pFoundIdx = (u8_t)i; - - return 0; - } - } - - *pFoundIdx = 0; - return 1; -} - -static void zfStaInitCommonOppositeInfo(zdev_t* dev, int i) -{ - zmw_get_wlan_dev(dev); - - /* set the default rate to the highest rate */ - wd->sta.oppositeInfo[i].valid = 1; - wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER; - wd->sta.oppositeCount++; - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - /* Set parameters for new opposite peer station !!! */ - wd->sta.oppositeInfo[i].camIdx = 0xff; // Not set key in this location - wd->sta.oppositeInfo[i].pkInstalled = 0; - wd->sta.oppositeInfo[i].wpaState = ZM_STA_WPA_STATE_INIT ; // No encryption -#endif -} - -int zfStaSetOppositeInfoFromBSSInfo(zdev_t* dev, struct zsBssInfo* pBssInfo) -{ - int i; - u8_t* dst; - u16_t sa[3]; - int res; - u32_t oneTxStreamCap; - - zmw_get_wlan_dev(dev); - - zfMemoryCopy((u8_t*) sa, pBssInfo->macaddr, 6); - - res = zfStaFindFreeOpposite(dev, sa, &i); - if ( res != 0 ) - { - goto zlReturn; - } - - dst = wd->sta.oppositeInfo[i].macAddr; - zfMemoryCopy(dst, (u8_t *)sa, 6); - - oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM); - - if (pBssInfo->extSupportedRates[1] != 0) - { - /* TODO : Handle 11n */ - if (pBssInfo->frequency < 3000) - { - /* 2.4GHz */ - if (pBssInfo->EnableHT == 1) - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, pBssInfo->SG40); - else - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 1, pBssInfo->SG40); - } - else - { - /* 5GHz */ - if (pBssInfo->EnableHT == 1) - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, pBssInfo->SG40); - else - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, pBssInfo->SG40); - } - } - else - { - /* TODO : Handle 11n */ - if (pBssInfo->frequency < 3000) - { - /* 2.4GHz */ - if (pBssInfo->EnableHT == 1) - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, pBssInfo->SG40); - else - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 0, 1, pBssInfo->SG40); - } - else - { - /* 5GHz */ - if (pBssInfo->EnableHT == 1) - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, pBssInfo->SG40); - else - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, pBssInfo->SG40); - } - } - - - zfStaInitCommonOppositeInfo(dev, i); -zlReturn: - return 0; -} - -int zfStaSetOppositeInfoFromRxBuf(zdev_t* dev, zbuf_t* buf) -{ - int i; - u8_t* dst; - u16_t sa[3]; - int res = 0; - u16_t offset; - u8_t bSupportExtRate; - u32_t rtsctsRate = 0xffffffff; /* CTS:OFDM 6M, RTS:OFDM 6M */ - u32_t oneTxStreamCap; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET); - sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2); - sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4); - - zmw_enter_critical_section(dev); - - res = zfStaFindFreeOpposite(dev, sa, &i); - if ( res != 0 ) - { - goto zlReturn; - } - - dst = wd->sta.oppositeInfo[i].macAddr; - zfCopyFromRxBuffer(dev, buf, dst, ZM_WLAN_HEADER_A2_OFFSET, 6); - - if ( (wd->sta.currentFrequency < 3000) && !(wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) - { - bSupportExtRate = 0; - } else { - bSupportExtRate = 1; - } - - if ( (bSupportExtRate == 1) - && (wd->sta.currentFrequency < 3000) - && (wd->wlanMode == ZM_MODE_IBSS) - && (wd->wfc.bIbssGMode == 0) ) - { - bSupportExtRate = 0; - } - - wd->sta.connection_11b = 0; - oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM); - - if ( ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE)) != 0xffff) - && (bSupportExtRate == 1) ) - { - /* TODO : Handle 11n */ - if (wd->sta.currentFrequency < 3000) - { - /* 2.4GHz */ - if (wd->sta.EnableHT == 1) - { - //11ng - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, wd->sta.SG40); - } - else - { - //11g - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 1, wd->sta.SG40); - } - rtsctsRate = 0x00001bb; /* CTS:CCK 1M, RTS:OFDM 6M */ - } - else - { - /* 5GHz */ - if (wd->sta.EnableHT == 1) - { - //11na - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, wd->sta.SG40); - } - else - { - //11a - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, wd->sta.SG40); - } - rtsctsRate = 0x10b01bb; /* CTS:OFDM 6M, RTS:OFDM 6M */ - } - } - else - { - /* TODO : Handle 11n */ - if (wd->sta.currentFrequency < 3000) - { - /* 2.4GHz */ - if (wd->sta.EnableHT == 1) - { - //11ng - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, wd->sta.SG40); - rtsctsRate = 0x00001bb; /* CTS:CCK 1M, RTS:OFDM 6M */ - } - else - { - //11b - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 0, 1, wd->sta.SG40); - rtsctsRate = 0x0; /* CTS:CCK 1M, RTS:CCK 1M */ - wd->sta.connection_11b = 1; - } - } - else - { - /* 5GHz */ - if (wd->sta.EnableHT == 1) - { - //11na - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, wd->sta.SG40); - } - else - { - //11a - zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, wd->sta.SG40); - } - rtsctsRate = 0x10b01bb; /* CTS:OFDM 6M, RTS:OFDM 6M */ - } - } - - zfStaInitCommonOppositeInfo(dev, i); - -zlReturn: - zmw_leave_critical_section(dev); - - if (rtsctsRate != 0xffffffff) - { - zfHpSetRTSCTSRate(dev, rtsctsRate); - } - return res; -} - -void zfStaProtErpMonitor(zdev_t* dev, zbuf_t* buf) -{ - u16_t offset; - u8_t erp; - u8_t bssid[6]; - - zmw_get_wlan_dev(dev); - - if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&&(zfStaIsConnected(dev)) ) - { - ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid); - - if (zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6)) - { - offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP); - if (offset != 0xffff) - { - erp = zmw_rx_buf_readb(dev, buf, offset+2); - - if ( erp & ZM_BIT_1 ) - { - //zm_debug_msg0("protection mode on"); - if (wd->sta.bProtectionMode == FALSE) - { - wd->sta.bProtectionMode = TRUE; - zfHpSetSlotTime(dev, 0); - } - } - else - { - //zm_debug_msg0("protection mode off"); - if (wd->sta.bProtectionMode == TRUE) - { - wd->sta.bProtectionMode = FALSE; - zfHpSetSlotTime(dev, 1); - } - } - } - } - //Check the existence of Non-N AP - //Follow the check the "pBssInfo->EnableHT" - offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY); - if (offset != 0xffff) - {} - else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff) - {} - else - {wd->sta.NonNAPcount++;} - } -} - -void zfStaUpdateWmeParameter(zdev_t* dev, zbuf_t* buf) -{ - u16_t tmp; - u16_t aifs[5]; - u16_t cwmin[5]; - u16_t cwmax[5]; - u16_t txop[5]; - u8_t acm; - u8_t ac; - u16_t len; - u16_t i; - u16_t offset; - u8_t rxWmeParameterSetCount; - - zmw_get_wlan_dev(dev); - - /* Update if WME parameter set count is changed */ - /* If connect to WME AP */ - if (wd->sta.wmeConnected != 0) - { - /* Find WME parameter element */ - offset = zfFindWifiElement(dev, buf, 2, 1); - if (offset != 0xffff) - { - len = zmw_rx_buf_readb(dev, buf, offset+1); - if (len >= 7) - { - rxWmeParameterSetCount=zmw_rx_buf_readb(dev, buf, offset+8); - if (rxWmeParameterSetCount != wd->sta.wmeParameterSetCount) - { - zm_msg0_mm(ZM_LV_0, "wmeParameterSetCount changed!"); - wd->sta.wmeParameterSetCount = rxWmeParameterSetCount; - /* retrieve WME parameter and update TxQ parameters */ - acm = 0xf; - for (i=0; i<4; i++) - { - if (len >= (8+(i*4)+4)) - { - tmp=zmw_rx_buf_readb(dev, buf, offset+10+i*4); - ac = (tmp >> 5) & 0x3; - if ((tmp & 0x10) == 0) - { - acm &= (~(1<> 4)]; - txop[ac]=zmw_rx_buf_readh(dev, buf, - offset+12+i*4); - } - } - - if ((acm & 0x4) != 0) - { - cwmin[2] = cwmin[0]; - cwmax[2] = cwmax[0]; - aifs[2] = aifs[0]; - txop[2] = txop[0]; - } - if ((acm & 0x8) != 0) - { - cwmin[3] = cwmin[2]; - cwmax[3] = cwmax[2]; - aifs[3] = aifs[2]; - txop[3] = txop[2]; - } - cwmin[4] = 3; - cwmax[4] = 7; - aifs[4] = 28; - - if ((cwmin[2]+aifs[2]) > ((cwmin[0]+aifs[0])+1)) - { - wd->sta.ac0PriorityHigherThanAc2 = 1; - } - else - { - wd->sta.ac0PriorityHigherThanAc2 = 0; - } - zfHpUpdateQosParameter(dev, cwmin, cwmax, aifs, txop); - } - } - } - } //if (wd->sta.wmeConnected != 0) -} -/* process 802.11h Dynamic Frequency Selection */ -void zfStaUpdateDot11HDFS(zdev_t* dev, zbuf_t* buf) -{ - //u8_t length, channel, is5G; - u16_t offset; - - zmw_get_wlan_dev(dev); - - /* - Channel Switch Announcement Element Format - +------+----------+------+-------------------+------------------+--------------------+ - |Format|Element ID|Length|Channel Switch Mode|New Channel Number|Channel Switch Count| - +------+----------+------+-------------------+------------------+--------------------+ - |Bytes | 1 | 1 | 1 | 1 | 1 | - +------+----------+------+-------------------+------------------+--------------------+ - |Value | 37 | 3 | 0 or 1 |unsigned integer |unsigned integer | - +------+----------+------+-------------------+------------------+--------------------+ - */ - - /* get EID(Channel Switch Announcement) */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_CHANNEL_SWITCH_ANNOUNCE); - if (offset == 0xffff) - { - //zm_debug_msg0("EID(Channel Switch Announcement) not found"); - return; - } - else if ( zmw_rx_buf_readb(dev, buf, offset+1) == 0x3 ) - { - zm_debug_msg0("EID(Channel Switch Announcement) found"); - - //length = zmw_rx_buf_readb(dev, buf, offset+1); - //zfCopyFromRxBuffer(dev, buf, pBssInfo->supportedRates, offset, length+2); - - //Chanell Switch Mode set to 1, driver should disable transmit immediate - //we do this by poll CCA high - if (zmw_rx_buf_readb(dev, buf, offset+2) == 0x1 ) - { - //use ZM_OID_INTERNAL_WRITE,ZM_CMD_RESET to notice firmware flush quene and stop dma, - //then restart rx dma but not tx dma - if (wd->sta.DFSDisableTx != TRUE) - { - /* TODO : zfHpResetTxRx would cause Rx hang */ - //zfHpResetTxRx(dev); - wd->sta.DFSDisableTx = TRUE; - /* Trgger Rx DMA */ - zfHpStartRecv(dev); - } - //Adapter->ZD80211HSetting.DisableTxBy80211H=TRUE; - //AcquireCtrOfPhyReg(Adapter); - //ZD1205_WRITE_REGISTER(Adapter,CR24, 0x0); - //ReleaseDoNotSleep(Adapter); - } - - if (zmw_rx_buf_readb(dev, buf, offset+4) <= 0x2 ) - { - //Channel Switch - //if Channel Switch Count = 0 , STA should change channel immediately. - //if Channel Switch Count > 0 , STA should change channel after TBTT*count - //But it won't be accurate to let driver calculate TBTT*count, and the value of - //Channel Switch Count will decrease by one each when continue receving beacon - //So we change channel here when we receive count <=2. - - zfHpDeleteAllowChannel(dev, wd->sta.currentFrequency); - wd->frequency = zfChNumToFreq(dev, zmw_rx_buf_readb(dev, buf, offset+3), 0); - //zfHpAddAllowChannel(dev, wd->frequency); - zm_debug_msg1("CWY - jump to frequency = ", wd->frequency); - zfCoreSetFrequency(dev, wd->frequency); - wd->sta.DFSDisableTx = FALSE; - /* Increase rxBeaconCount to prevent beacon lost */ - if (zfStaIsConnected(dev)) - { - wd->sta.rxBeaconCount = 1 << 6; // 2 times of check would pass - } - //start tx dma to transmit packet - - //if (zmw_rx_buf_readb(dev, buf, offset+3) != wd->frequency) - //{ - // //ZDDbgPrint(("Radar Detect by AP\n")); - // zfCoreSetFrequency(); - // ProcessRadarDetectEvent(Adapter); - // Set_RF_Channel(Adapter, SwRfd->Rfd->RxBuffer[index+3], (UCHAR)Adapter->RF_Mode, 1); - // Adapter->CardSetting.Channel = SwRfd->Rfd->RxBuffer[index+3]; - // Adapter->SaveChannel = Adapter->CardSetting.Channel; - // Adapter->UtilityChannel = Adapter->CardSetting.Channel; - //} - } - } - -} -/* TODO : process 802.11h Transmission Power Control */ -void zfStaUpdateDot11HTPC(zdev_t* dev, zbuf_t* buf) -{ -} - -/* IBSS power-saving mode */ -void zfStaIbssPSCheckState(zdev_t* dev, zbuf_t* buf) -{ - u8_t i, frameCtrl; - - zmw_get_wlan_dev(dev); - - if ( !zfStaIsConnected(dev) ) - { - return; - } - - if ( wd->wlanMode != ZM_MODE_IBSS ) - { - return ; - } - - /* check BSSID */ - if ( !zfRxBufferEqualToStr(dev, buf, (u8_t*) wd->sta.bssid, - ZM_WLAN_HEADER_A3_OFFSET, 6) ) - { - return; - } - - frameCtrl = zmw_rx_buf_readb(dev, buf, 1); - - /* check power management bit */ - if ( frameCtrl & ZM_BIT_4 ) - { - for(i=1; ista.staPSList.entity[i].bUsed ) - { - continue; - } - - /* check source address */ - if ( zfRxBufferEqualToStr(dev, buf, - wd->sta.staPSList.entity[i].macAddr, - ZM_WLAN_HEADER_A2_OFFSET, 6) ) - { - return; - } - } - - for(i=1; ista.staPSList.entity[i].bUsed ) - { - wd->sta.staPSList.entity[i].bUsed = TRUE; - wd->sta.staPSList.entity[i].bDataQueued = FALSE; - break; - } - } - - if ( i == ZM_MAX_PS_STA ) - { - /* STA list is full */ - return; - } - - zfCopyFromRxBuffer(dev, buf, wd->sta.staPSList.entity[i].macAddr, - ZM_WLAN_HEADER_A2_OFFSET, 6); - - if ( wd->sta.staPSList.count == 0 ) - { - // enable ATIM window - //zfEnableAtimWindow(dev); - } - - wd->sta.staPSList.count++; - } - else if ( wd->sta.staPSList.count ) - { - for(i=1; ista.staPSList.entity[i].bUsed ) - { - if ( zfRxBufferEqualToStr(dev, buf, - wd->sta.staPSList.entity[i].macAddr, - ZM_WLAN_HEADER_A2_OFFSET, 6) ) - { - wd->sta.staPSList.entity[i].bUsed = FALSE; - wd->sta.staPSList.count--; - - if ( wd->sta.staPSList.entity[i].bDataQueued ) - { - /* send queued data */ - } - } - } - } - - if ( wd->sta.staPSList.count == 0 ) - { - /* disable ATIM window */ - //zfDisableAtimWindow(dev); - } - - } -} - -/* IBSS power-saving mode */ -u8_t zfStaIbssPSQueueData(zdev_t* dev, zbuf_t* buf) -{ - u8_t i; - u16_t da[3]; - - zmw_get_wlan_dev(dev); - - if ( !zfStaIsConnected(dev) ) - { - return 0; - } - - if ( wd->wlanMode != ZM_MODE_IBSS ) - { - return 0; - } - - if ( wd->sta.staPSList.count == 0 && wd->sta.powerSaveMode <= ZM_STA_PS_NONE ) - { - return 0; - } - - /* DA */ -#ifdef ZM_ENABLE_NATIVE_WIFI - da[0] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET); - da[1] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET + 2); - da[2] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET + 4); -#else - da[0] = zmw_tx_buf_readh(dev, buf, 0); - da[1] = zmw_tx_buf_readh(dev, buf, 2); - da[2] = zmw_tx_buf_readh(dev, buf, 4); -#endif - - if ( ZM_IS_MULTICAST_OR_BROADCAST(da) ) - { - wd->sta.staPSList.entity[0].bDataQueued = TRUE; - wd->sta.ibssPSDataQueue[wd->sta.ibssPSDataCount++] = buf; - return 1; - } - - // Unicast packet... - - for(i=1; ista.staPSList.entity[i].macAddr, - (u8_t*) da, 6) ) - { - wd->sta.staPSList.entity[i].bDataQueued = TRUE; - wd->sta.ibssPSDataQueue[wd->sta.ibssPSDataCount++] = buf; - - return 1; - } - } - -#if 0 - if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE ) - { - wd->sta.staPSDataQueue[wd->sta.staPSDataCount++] = buf; - - return 1; - } -#endif - - return 0; -} - -/* IBSS power-saving mode */ -void zfStaIbssPSSend(zdev_t* dev) -{ - u8_t i; - u16_t bcastAddr[3] = {0xffff, 0xffff, 0xffff}; - - zmw_get_wlan_dev(dev); - - if ( !zfStaIsConnected(dev) ) - { - return ; - } - - if ( wd->wlanMode != ZM_MODE_IBSS ) - { - return ; - } - - for(i=0; ista.staPSList.entity[i].bDataQueued ) - { - if ( i == 0 ) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ATIM, - bcastAddr, - 0, 0, 0); - } - else if ( wd->sta.staPSList.entity[i].bUsed ) - { - // Send ATIM to prevent the peer to go to sleep - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ATIM, - (u16_t*) wd->sta.staPSList.entity[i].macAddr, - 0, 0, 0); - } - - wd->sta.staPSList.entity[i].bDataQueued = FALSE; - } - } - - for(i=0; ista.ibssPSDataCount; i++) - { - zfTxSendEth(dev, wd->sta.ibssPSDataQueue[i], 0, - ZM_EXTERNAL_ALLOC_BUF, 0); - } - - wd->sta.ibssPrevPSDataCount = wd->sta.ibssPSDataCount; - wd->sta.ibssPSDataCount = 0; -} - - -void zfStaReconnect(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE && - wd->wlanMode != ZM_MODE_IBSS ) - { - return; - } - - if ( (zfStaIsConnected(dev))||(zfStaIsConnecting(dev)) ) - { - return; - } - - if ( wd->sta.bChannelScan ) - { - return; - } - - /* Recover zero SSID length */ - if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) && (wd->ws.ssidLen == 0)) - { - zm_debug_msg0("zfStaReconnect: NOT Support!! Set SSID to any BSS"); - /* ANY BSS */ - zmw_enter_critical_section(dev); - wd->sta.ssid[0] = 0; - wd->sta.ssidLen = 0; - zmw_leave_critical_section(dev); - } - - // RAY: To ensure no TX pending before re-connecting - zfFlushVtxq(dev); - zfWlanEnable(dev); - zfScanMgrScanAck(dev); -} - -void zfStaTimer100ms(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - if ( (wd->tick % 10) == 0 ) - { - zfPushVtxq(dev); -// zfPowerSavingMgrMain(dev); - } -} - - -void zfStaCheckRxBeacon(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) && (zfStaIsConnected(dev))) - { - if (wd->beaconInterval == 0) - { - wd->beaconInterval = 100; - } - if ( (wd->tick % ((wd->beaconInterval * 10) / ZM_MS_PER_TICK)) == 0 ) - { - /* Check rxBeaconCount */ - if (wd->sta.rxBeaconCount == 0) - { - if (wd->sta.beaconMissState == 1) - { - /*notify AP that we left*/ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, wd->sta.bssid, 3, 0, 0); - /* Beacon Lost */ - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS, - wd->sta.bssid, 0); - } - else - { - wd->sta.beaconMissState = 1; - /* Reset channel */ - zfCoreSetFrequencyExV2(dev, wd->frequency, wd->BandWidth40, - wd->ExtOffset, NULL, 1); - } - } - else - { - wd->sta.beaconMissState = 0; - } - wd->sta.rxBeaconCount = 0; - } - } -} - - - -void zfStaCheckConnectTimeout(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE ) - { - return; - } - - if ( !zfStaIsConnecting(dev) ) - { - return; - } - - zmw_enter_critical_section(dev); - if ( (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_OPEN)|| - (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_1)|| - (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_2)|| - (wd->sta.connectState == ZM_STA_CONN_STATE_ASSOCIATE) ) - { - if ( (wd->tick - wd->sta.connectTimer) > ZM_INTERVAL_CONNECT_TIMEOUT ) - { - if ( wd->sta.connectByReasso ) - { - wd->sta.failCntOfReasso++; - if ( wd->sta.failCntOfReasso > 2 ) - { - wd->sta.connectByReasso = FALSE; - } - } - - wd->sta.connectState = ZM_STA_CONN_STATE_NONE; - zm_debug_msg1("connect timeout, state = ", wd->sta.connectState); - //zfiWlanDisable(dev); - goto failed; - } - } - - zmw_leave_critical_section(dev); - return; - -failed: - zmw_leave_critical_section(dev); - if(wd->sta.authMode == ZM_AUTH_MODE_AUTO) - { // Fix some AP not send authentication failed message to sta and lead to connect timeout ! - wd->sta.connectTimeoutCount++; - } - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT, wd->sta.bssid, 2); - return; -} - -void zfMmStaTimeTick(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - /* airopeek */ - if (wd->wlanMode != ZM_MODE_AP && !wd->swSniffer) - { - if ( wd->tick & 1 ) - { - zfTimerCheckAndHandle(dev); - } - - zfStaCheckRxBeacon(dev); - zfStaTimer100ms(dev); - zfStaCheckConnectTimeout(dev); - zfPowerSavingMgrMain(dev); - } - -#ifdef ZM_ENABLE_AGGREGATION - /* - * add by honda - */ - zfAggScanAndClear(dev, wd->tick); -#endif -} - -void zfStaSendBeacon(zdev_t* dev) -{ - zbuf_t* buf; - u16_t offset, seq; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - //zm_debug_msg0("\n"); - - /* TBD : Maximum size of beacon */ - buf = zfwBufAllocate(dev, 1024); - if (buf == NULL) - { - zm_debug_msg0("Allocate beacon buffer failed"); - return; - } - - offset = 0; - /* wlan header */ - /* Frame control */ - zmw_tx_buf_writeh(dev, buf, offset, 0x0080); - offset+=2; - /* Duration */ - zmw_tx_buf_writeh(dev, buf, offset, 0x0000); - offset+=2; - /* Address 1 */ - zmw_tx_buf_writeh(dev, buf, offset, 0xffff); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, 0xffff); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, 0xffff); - offset+=2; - /* Address 2 */ - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]); - offset+=2; - /* Address 3 */ - zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[0]); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[1]); - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[2]); - offset+=2; - - /* Sequence number */ - zmw_enter_critical_section(dev); - seq = ((wd->mmseq++)<<4); - zmw_leave_critical_section(dev); - zmw_tx_buf_writeh(dev, buf, offset, seq); - offset+=2; - - /* 24-31 Time Stamp : hardware will fill this field */ - offset+=8; - - /* Beacon Interval */ - zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval); - offset+=2; - - /* Capability */ - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]); - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]); - - /* SSID */ - offset = zfStaAddIeSsid(dev, buf, offset); - - if(wd->frequency <= ZM_CH_G_14) // 2.4 GHz b+g - { - - /* Support Rate */ - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK); - - /* DS parameter set */ - offset = zfMmAddIeDs(dev, buf, offset); - - offset = zfStaAddIeIbss(dev, buf, offset); - - if( wd->wfc.bIbssGMode - && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode . - { - /* ERP Information */ - wd->erpElement = 0; - offset = zfMmAddIeErp(dev, buf, offset); - } - - /* TODO : country information */ - /* RSN */ - if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK ) - { - offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH); - } - - if( wd->wfc.bIbssGMode - && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode . - { - /* Enable G Mode */ - /* Extended Supported Rates */ - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM); - } - } - else // 5GHz a - { - /* Support Rate a Mode */ - offset = zfMmAddIeSupportRate(dev, buf, offset, - ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM); - - /* DS parameter set */ - offset = zfMmAddIeDs(dev, buf, offset); - - offset = zfStaAddIeIbss(dev, buf, offset); - - /* TODO : country information */ - /* RSN */ - if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK ) - { - offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH); - } - } - - if ( wd->wlanMode != ZM_MODE_IBSS ) - { - /* TODO : Need to check if it is ok */ - /* HT Capabilities Info */ - offset = zfMmAddHTCapability(dev, buf, offset); - - /* Extended HT Capabilities Info */ - offset = zfMmAddExtendedHTCapability(dev, buf, offset); - } - - if ( wd->sta.ibssAdditionalIESize ) - offset = zfStaAddIbssAdditionalIE(dev, buf, offset); - - /* 1212 : write to beacon fifo */ - /* 1221 : write to share memory */ - zfHpSendBeacon(dev, buf, offset); - - /* Free beacon buffer */ - //zfwBufFree(dev, buf, 0); -} - -void zfStaSignalStatistic(zdev_t* dev, u8_t SignalStrength, u8_t SignalQuality) //CWYang(+) -{ - zmw_get_wlan_dev(dev); - - /* Add Your Code to Do Works Like Moving Average Here */ - wd->SignalStrength = (wd->SignalStrength * 7 + SignalStrength * 3)/10; - wd->SignalQuality = (wd->SignalQuality * 7 + SignalQuality * 3)/10; - -} - -struct zsBssInfo* zfStaFindBssInfo(zdev_t* dev, zbuf_t* buf, struct zsWlanProbeRspFrameHeader *pProbeRspHeader) -{ - u8_t i; - u8_t j; - u8_t k; - u8_t isMatched, length, channel; - u16_t offset, frequency; - struct zsBssInfo* pBssInfo; - - zmw_get_wlan_dev(dev); - - pBssInfo = wd->sta.bssList.head; - if (pBssInfo == NULL) - { - return NULL; - } - - for( i=0; ista.bssList.bssCount; i++ ) - { - //zm_debug_msg2("check pBssInfo = ", pBssInfo); - - /* Check BSSID */ - for( j=0; j<6; j++ ) - { - if ( pBssInfo->bssid[j] != pProbeRspHeader->bssid[j] ) - { - break; - } - } - - /* Check SSID */ - if (j == 6) - { - if (pProbeRspHeader->ssid[1] <= 32) - { - /* compare length and ssid */ - isMatched = 1; - if((pProbeRspHeader->ssid[1] != 0) && (pBssInfo->ssid[1] != 0)) - { - for( k=1; kssid[1] + 1; k++ ) - { - if ( pBssInfo->ssid[k] != pProbeRspHeader->ssid[k] ) - { - isMatched = 0; - break; - } - } - } - } - else - { - isMatched = 0; - } - } - else - { - isMatched = 0; - } - - /* Check channel */ - /* Add check channel to solve the bug #31222 */ - if (isMatched) { - offset = zfFindElement(dev, buf, ZM_WLAN_EID_DS); - if (offset != 0xffff) { - length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length == 1) { - channel = zmw_rx_buf_readb(dev, buf, offset+2); - if (zfHpIsAllowedChannel(dev, zfChNumToFreq(dev, channel, 0)) == 0) { - frequency = 0; - } else { - frequency = zfChNumToFreq(dev, channel, 0);; - } - } else { - frequency = 0; - } - } else { - frequency = wd->sta.currentFrequency; - } - - if (frequency != 0) { - if ( ((frequency > 3000) && (pBssInfo->frequency > 3000)) - || ((frequency < 3000) && (pBssInfo->frequency < 3000)) ) { - /* redundant */ - break; - } - } - } - - pBssInfo = pBssInfo->next; - } - - if ( i == wd->sta.bssList.bssCount ) - { - pBssInfo = NULL; - } - - return pBssInfo; -} - -u8_t zfStaInitBssInfo(zdev_t* dev, zbuf_t* buf, - struct zsWlanProbeRspFrameHeader *pProbeRspHeader, - struct zsBssInfo* pBssInfo, struct zsAdditionInfo* AddInfo, u8_t type) -{ - u8_t length, channel, is5G; - u16_t i, offset; - u8_t apQosInfo; - u16_t eachIElength = 0; - u16_t accumulateLen = 0; - - zmw_get_wlan_dev(dev); - - if ((type == 1) && ((pBssInfo->flag & ZM_BSS_INFO_VALID_BIT) != 0)) - { - goto zlUpdateRssi; - } - - /* get SSID */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID); - if (offset == 0xffff) - { - zm_debug_msg0("EID(SSID) not found"); - goto zlError; - } - - length = zmw_rx_buf_readb(dev, buf, offset+1); - - { - u8_t Show_Flag = 0; - zfwGetShowZeroLengthSSID(dev, &Show_Flag); - - if(Show_Flag) - { - if (length > ZM_MAX_SSID_LENGTH ) - { - zm_debug_msg0("EID(SSID) is invalid"); - goto zlError; - } - } - else - { - if ( length == 0 || length > ZM_MAX_SSID_LENGTH ) - { - zm_debug_msg0("EID(SSID) is invalid"); - goto zlError; - } - - } - } - zfCopyFromRxBuffer(dev, buf, pBssInfo->ssid, offset, length+2); - - /* get DS parameter */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_DS); - if (offset != 0xffff) - { - length = zmw_rx_buf_readb(dev, buf, offset+1); - if ( length != 1 ) - { - zm_msg0_mm(ZM_LV_0, "Abnormal DS Param Set IE"); - goto zlError; - } - channel = zmw_rx_buf_readb(dev, buf, offset+2); - - if (zfHpIsAllowedChannel(dev, zfChNumToFreq(dev, channel, 0)) == 0) - { - goto zlError2; - } - - pBssInfo->frequency = zfChNumToFreq(dev, channel, 0); // auto check - pBssInfo->channel = channel; - - - } - else - { - /* DS parameter not found */ - pBssInfo->frequency = wd->sta.currentFrequency; - pBssInfo->channel = zfChFreqToNum(wd->sta.currentFrequency, &is5G); - } - - /* initialize security type */ - pBssInfo->securityType = ZM_SECURITY_TYPE_NONE; - - /* get macaddr */ - for( i=0; i<6; i++ ) - { - pBssInfo->macaddr[i] = pProbeRspHeader->sa[i]; - } - - /* get bssid */ - for( i=0; i<6; i++ ) - { - pBssInfo->bssid[i] = pProbeRspHeader->bssid[i]; - } - - /* get timestamp */ - for( i=0; i<8; i++ ) - { - pBssInfo->timeStamp[i] = pProbeRspHeader->timeStamp[i]; - } - - /* get beacon interval */ - pBssInfo->beaconInterval[0] = pProbeRspHeader->beaconInterval[0]; - pBssInfo->beaconInterval[1] = pProbeRspHeader->beaconInterval[1]; - - /* get capability */ - pBssInfo->capability[0] = pProbeRspHeader->capability[0]; - pBssInfo->capability[1] = pProbeRspHeader->capability[1]; - - /* Copy frame body */ - offset = 36; // Copy from the start of variable IE - pBssInfo->frameBodysize = zfwBufGetSize(dev, buf)-offset; - if (pBssInfo->frameBodysize > (ZM_MAX_PROBE_FRAME_BODY_SIZE-1)) - { - pBssInfo->frameBodysize = ZM_MAX_PROBE_FRAME_BODY_SIZE-1; - } - accumulateLen = 0; - do - { - eachIElength = zmw_rx_buf_readb(dev, buf, offset + accumulateLen+1) + 2; //Len+(EID+Data) - - if ( (eachIElength >= 2) - && ((accumulateLen + eachIElength) <= pBssInfo->frameBodysize) ) - { - zfCopyFromRxBuffer(dev, buf, pBssInfo->frameBody+accumulateLen, offset+accumulateLen, eachIElength); - accumulateLen+=(u16_t)eachIElength; - } - else - { - zm_msg0_mm(ZM_LV_1, "probersp frameBodysize abnormal"); - break; - } - } - while(accumulateLen < pBssInfo->frameBodysize); - pBssInfo->frameBodysize = accumulateLen; - - /* get supported rates */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_SUPPORT_RATE); - if (offset == 0xffff) - { - zm_debug_msg0("EID(supported rates) not found"); - goto zlError; - } - - length = zmw_rx_buf_readb(dev, buf, offset+1); - if ( length == 0 || length > ZM_MAX_SUPP_RATES_IE_SIZE) - { - zm_msg0_mm(ZM_LV_0, "Supported rates IE length abnormal"); - goto zlError; - } - zfCopyFromRxBuffer(dev, buf, pBssInfo->supportedRates, offset, length+2); - - - - /* get Country information */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_COUNTRY); - if (offset != 0xffff) - { - length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length > ZM_MAX_COUNTRY_INFO_SIZE) - { - length = ZM_MAX_COUNTRY_INFO_SIZE; - } - zfCopyFromRxBuffer(dev, buf, pBssInfo->countryInfo, offset, length+2); - /* check 802.11d support data */ - if (wd->sta.b802_11D) - { - zfHpGetRegulationTablefromISO(dev, (u8_t *)&pBssInfo->countryInfo, 3); - /* only set regulatory one time */ - wd->sta.b802_11D = 0; - } - } - - /* get ERP information */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP); - if (offset != 0xffff) - { - pBssInfo->erp = zmw_rx_buf_readb(dev, buf, offset+2); - } - - /* get extended supported rates */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE); - if (offset != 0xffff) - { - length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length > ZM_MAX_SUPP_RATES_IE_SIZE) - { - zm_msg0_mm(ZM_LV_0, "Extended rates IE length abnormal"); - goto zlError; - } - zfCopyFromRxBuffer(dev, buf, pBssInfo->extSupportedRates, offset, length+2); - } - else - { - pBssInfo->extSupportedRates[0] = 0; - pBssInfo->extSupportedRates[1] = 0; - } - - /* get WPA IE */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_WPA_IE); - if (offset != 0xffff) - { - length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length > ZM_MAX_IE_SIZE) - { - length = ZM_MAX_IE_SIZE; - } - zfCopyFromRxBuffer(dev, buf, pBssInfo->wpaIe, offset, length+2); - pBssInfo->securityType = ZM_SECURITY_TYPE_WPA; - } - else - { - pBssInfo->wpaIe[1] = 0; - } - - /* get WPS IE */ - offset = zfFindWifiElement(dev, buf, 4, 0xff); - if (offset != 0xffff) - { - length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length > ZM_MAX_WPS_IE_SIZE ) - { - length = ZM_MAX_WPS_IE_SIZE; - } - zfCopyFromRxBuffer(dev, buf, pBssInfo->wscIe, offset, length+2); - } - else - { - pBssInfo->wscIe[1] = 0; - } - - /* get SuperG IE */ - offset = zfFindSuperGElement(dev, buf, ZM_WLAN_EID_VENDOR_PRIVATE); - if (offset != 0xffff) - { - pBssInfo->apCap |= ZM_SuperG_AP; - } - - /* get XR IE */ - offset = zfFindXRElement(dev, buf, ZM_WLAN_EID_VENDOR_PRIVATE); - if (offset != 0xffff) - { - pBssInfo->apCap |= ZM_XR_AP; - } - - /* get RSN IE */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_RSN_IE); - if (offset != 0xffff) - { - length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length > ZM_MAX_IE_SIZE) - { - length = ZM_MAX_IE_SIZE; - } - zfCopyFromRxBuffer(dev, buf, pBssInfo->rsnIe, offset, length+2); - pBssInfo->securityType = ZM_SECURITY_TYPE_WPA; - } - else - { - pBssInfo->rsnIe[1] = 0; - } -#ifdef ZM_ENABLE_CENC - /* get CENC IE */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_CENC_IE); - if (offset != 0xffff) - { - length = zmw_rx_buf_readb(dev, buf, offset+1); - if (length > ZM_MAX_IE_SIZE ) - { - length = ZM_MAX_IE_SIZE; - } - zfCopyFromRxBuffer(dev, buf, pBssInfo->cencIe, offset, length+2); - pBssInfo->securityType = ZM_SECURITY_TYPE_CENC; - pBssInfo->capability[0] &= 0xffef; - } - else - { - pBssInfo->cencIe[1] = 0; - } -#endif //ZM_ENABLE_CENC - /* get WME Parameter IE, probe rsp may contain WME parameter element */ - //if ( wd->bQoSEnable ) - { - offset = zfFindWifiElement(dev, buf, 2, 1); - if (offset != 0xffff) - { - apQosInfo = zmw_rx_buf_readb(dev, buf, offset+8) & 0x80; - pBssInfo->wmeSupport = 1 | apQosInfo; - } - else if ((offset = zfFindWifiElement(dev, buf, 2, 0)) != 0xffff) - { - apQosInfo = zmw_rx_buf_readb(dev, buf, offset+8) & 0x80; - pBssInfo->wmeSupport = 1 | apQosInfo; - } - else - { - pBssInfo->wmeSupport = 0; - } - } - //CWYang(+) - offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY); - if (offset != 0xffff) - { - /* 11n AP */ - pBssInfo->EnableHT = 1; - if (zmw_rx_buf_readb(dev, buf, offset+1) & 0x02) - { - pBssInfo->enableHT40 = 1; - } - else - { - pBssInfo->enableHT40 = 0; - } - - if (zmw_rx_buf_readb(dev, buf, offset+1) & 0x40) - { - pBssInfo->SG40 = 1; - } - else - { - pBssInfo->SG40 = 0; - } - } - else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff) - { - /* 11n AP */ - pBssInfo->EnableHT = 1; - pBssInfo->apCap |= ZM_All11N_AP; - if (zmw_rx_buf_readb(dev, buf, offset+2) & 0x02) - { - pBssInfo->enableHT40 = 1; - } - else - { - pBssInfo->enableHT40 = 0; - } - - if (zmw_rx_buf_readb(dev, buf, offset+2) & 0x40) - { - pBssInfo->SG40 = 1; - } - else - { - pBssInfo->SG40 = 0; - } - } - else - { - pBssInfo->EnableHT = 0; - } - /* HT information */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY); - if (offset != 0xffff) - { - /* atheros pre n */ - pBssInfo->extChOffset = zmw_rx_buf_readb(dev, buf, offset+2) & 0x03; - } - else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTINFORMATION)) != 0xffff) - { - /* pre n 2.0 standard */ - pBssInfo->extChOffset = zmw_rx_buf_readb(dev, buf, offset+3) & 0x03; - } - else - { - pBssInfo->extChOffset = 0; - } - - if ( (pBssInfo->enableHT40 == 1) - && ((pBssInfo->extChOffset != 1) && (pBssInfo->extChOffset != 3)) ) - { - pBssInfo->enableHT40 = 0; - } - - if (pBssInfo->enableHT40 == 1) - { - if (zfHpIsAllowedChannel(dev, pBssInfo->frequency+((pBssInfo->extChOffset==1)?20:-20)) == 0) - { - /* if extension channel is not an allowed channel, treat AP as non-HT mode */ - pBssInfo->EnableHT = 0; - pBssInfo->enableHT40 = 0; - pBssInfo->extChOffset = 0; - } - } - - /* get ATH Extended Capability */ - if ( ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)&& - ((offset = zfFindBrdcmMrvlRlnkExtCap(dev, buf)) == 0xffff)) - - { - pBssInfo->athOwlAp = 1; - } - else - { - pBssInfo->athOwlAp = 0; - } - - /* get Broadcom Extended Capability */ - if ( (pBssInfo->EnableHT == 1) //((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff) - && ((offset = zfFindBroadcomExtCap(dev, buf)) != 0xffff) ) - { - pBssInfo->broadcomHTAp = 1; - } - else - { - pBssInfo->broadcomHTAp = 0; - } - - /* get Marvel Extended Capability */ - offset = zfFindMarvelExtCap(dev, buf); - if (offset != 0xffff) - { - pBssInfo->marvelAp = 1; - } - else - { - pBssInfo->marvelAp = 0; - } - - /* get ATIM window */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_IBSS); - if (offset != 0xffff ) - { - pBssInfo->atimWindow = zmw_rx_buf_readh(dev, buf,offset+2); - } - - /* Fit for support mode */ - if (pBssInfo->frequency > 3000) { - if (wd->supportMode & ZM_WIRELESS_MODE_5_N) { -#if 0 - if (wd->supportMode & ZM_WIRELESS_MODE_5_54) { - /* support mode: a, n */ - /* do nothing */ - } else { - /* support mode: n */ - /* reject non-n bss info */ - if (!pBssInfo->EnableHT) { - goto zlError2; - } - } -#endif - } else { - if (wd->supportMode & ZM_WIRELESS_MODE_5_54) { - /* support mode: a */ - /* delete n mode information */ - pBssInfo->EnableHT = 0; - pBssInfo->enableHT40 = 0; - pBssInfo->apCap &= (~ZM_All11N_AP); - pBssInfo->extChOffset = 0; - pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody, - pBssInfo->frameBodysize, ZM_WLAN_EID_HT_CAPABILITY); - pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody, - pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTCAPABILITY); - pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody, - pBssInfo->frameBodysize, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY); - pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody, - pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTINFORMATION); - } else { - /* support mode: none */ - goto zlError2; - } - } - } else { - if (wd->supportMode & ZM_WIRELESS_MODE_24_N) { -#if 0 - if (wd->supportMode & ZM_WIRELESS_MODE_24_54) { - if (wd->supportMode & ZM_WIRELESS_MODE_24_11) { - /* support mode: b, g, n */ - /* do nothing */ - } else { - /* support mode: g, n */ - /* reject b-only bss info */ - if ( (!pBssInfo->EnableHT) - && (pBssInfo->extSupportedRates[1] == 0) ) { - goto zlError2; - } - } - } else { - if (wd->supportMode & ZM_WIRELESS_MODE_24_11) { - /* support mode: b, n */ - /* 1. reject g-only bss info - * 2. if non g-only, delete g mode information - */ - if ( !pBssInfo->EnableHT ) { - if ( zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->supportedRates) - || zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->extSupportedRates) ) { - goto zlError2; - } else { - zfGatherBMode(dev, pBssInfo->supportedRates, - pBssInfo->extSupportedRates); - pBssInfo->erp = 0; - - pBssInfo->frameBodysize = zfRemoveElement(dev, - pBssInfo->frameBody, pBssInfo->frameBodysize, - ZM_WLAN_EID_ERP); - pBssInfo->frameBodysize = zfRemoveElement(dev, - pBssInfo->frameBody, pBssInfo->frameBodysize, - ZM_WLAN_EID_EXTENDED_RATE); - - pBssInfo->frameBodysize = zfUpdateElement(dev, - pBssInfo->frameBody, pBssInfo->frameBodysize, - pBssInfo->supportedRates); - } - } - } else { - /* support mode: n */ - /* reject non-n bss info */ - if (!pBssInfo->EnableHT) { - goto zlError2; - } - } - } -#endif - } else { - /* delete n mode information */ - pBssInfo->EnableHT = 0; - pBssInfo->enableHT40 = 0; - pBssInfo->apCap &= (~ZM_All11N_AP); - pBssInfo->extChOffset = 0; - pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody, - pBssInfo->frameBodysize, ZM_WLAN_EID_HT_CAPABILITY); - pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody, - pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTCAPABILITY); - pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody, - pBssInfo->frameBodysize, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY); - pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody, - pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTINFORMATION); - - if (wd->supportMode & ZM_WIRELESS_MODE_24_54) { -#if 0 - if (wd->supportMode & ZM_WIRELESS_MODE_24_11) { - /* support mode: b, g */ - /* delete n mode information */ - } else { - /* support mode: g */ - /* delete n mode information */ - /* reject b-only bss info */ - if (pBssInfo->extSupportedRates[1] == 0) { - goto zlError2; - } - } -#endif - } else { - if (wd->supportMode & ZM_WIRELESS_MODE_24_11) { - /* support mode: b */ - /* delete n mode information */ - if ( zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->supportedRates) - || zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->extSupportedRates) ) { - goto zlError2; - } else { - zfGatherBMode(dev, pBssInfo->supportedRates, - pBssInfo->extSupportedRates); - pBssInfo->erp = 0; - - pBssInfo->frameBodysize = zfRemoveElement(dev, - pBssInfo->frameBody, pBssInfo->frameBodysize, - ZM_WLAN_EID_ERP); - pBssInfo->frameBodysize = zfRemoveElement(dev, - pBssInfo->frameBody, pBssInfo->frameBodysize, - ZM_WLAN_EID_EXTENDED_RATE); - - pBssInfo->frameBodysize = zfUpdateElement(dev, - pBssInfo->frameBody, pBssInfo->frameBodysize, - pBssInfo->supportedRates); - } - } else { - /* support mode: none */ - goto zlError2; - } - } - } - } - - pBssInfo->flag |= ZM_BSS_INFO_VALID_BIT; - -zlUpdateRssi: - /* Update Timer information */ - pBssInfo->tick = wd->tick; - - /* Update ERP information */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP); - if (offset != 0xffff) - { - pBssInfo->erp = zmw_rx_buf_readb(dev, buf, offset+2); - } - - if( (s8_t)pBssInfo->signalStrength < (s8_t)AddInfo->Tail.Data.SignalStrength1 ) - { - /* Update signal strength */ - pBssInfo->signalStrength = (u8_t)AddInfo->Tail.Data.SignalStrength1; - /* Update signal quality */ - pBssInfo->signalQuality = (u8_t)(AddInfo->Tail.Data.SignalStrength1 * 2); - - /* Update the sorting value */ - pBssInfo->sortValue = zfComputeBssInfoWeightValue(dev, - (pBssInfo->supportedRates[6] + pBssInfo->extSupportedRates[0]), - pBssInfo->EnableHT, - pBssInfo->enableHT40, - pBssInfo->signalStrength); - } - - return 0; - -zlError: - - return 1; - -zlError2: - - return 2; -} - -void zfStaProcessBeacon(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) //CWYang(m) -{ - /* Parse TIM and send PS-POLL in power saving mode */ - struct zsWlanBeaconFrameHeader* pBeaconHeader; - struct zsBssInfo* pBssInfo; - u8_t pBuf[sizeof(struct zsWlanBeaconFrameHeader)]; - u8_t bssid[6]; - int res; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - /* sta routine jobs */ - zfStaProtErpMonitor(dev, buf); /* check protection mode */ - - if (zfStaIsConnected(dev)) - { - ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid); - - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - if ( zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6) ) - { - zfPowerSavingMgrProcessBeacon(dev, buf); - zfStaUpdateWmeParameter(dev, buf); - if (wd->sta.DFSEnable) - zfStaUpdateDot11HDFS(dev, buf); - if (wd->sta.TPCEnable) - zfStaUpdateDot11HTPC(dev, buf); - /* update signal strength and signal quality */ - zfStaSignalStatistic(dev, AddInfo->Tail.Data.SignalStrength1, - AddInfo->Tail.Data.SignalQuality); //CWYang(+) - wd->sta.rxBeaconCount++; - } - } - else if ( wd->wlanMode == ZM_MODE_IBSS ) - { - if ( zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A3_OFFSET, 6) ) - { - int res; - struct zsPartnerNotifyEvent event; - - zm_debug_msg0("20070916 Receive opposite Beacon!"); - zmw_enter_critical_section(dev); - wd->sta.ibssReceiveBeaconCount++; - zmw_leave_critical_section(dev); - - res = zfStaSetOppositeInfoFromRxBuf(dev, buf); - if ( res == 0 ) - { - // New peer station found. Notify the wrapper now - zfInitPartnerNotifyEvent(dev, buf, &event); - if (wd->zfcbIbssPartnerNotify != NULL) - { - wd->zfcbIbssPartnerNotify(dev, 1, &event); - } - } - /* update signal strength and signal quality */ - zfStaSignalStatistic(dev, AddInfo->Tail.Data.SignalStrength1, - AddInfo->Tail.Data.SignalQuality); //CWYang(+) - } - //else if ( wd->sta.ibssPartnerStatus == ZM_IBSS_PARTNER_LOST ) - // Why does this happen in IBSS?? The impact of Vista since - // we need to tell it the BSSID -#if 0 - else if ( wd->sta.oppositeCount == 0 ) - { /* IBSS merge if SSID matched */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID); - if (offset != 0xffff) - { - if ( (wd->sta.ssidLen == zmw_buf_readb(dev, buf, offset+1))&& - (zfRxBufferEqualToStr(dev, buf, wd->sta.ssid, - offset+2, wd->sta.ssidLen)) ) - { - capabilityInfo = zmw_buf_readh(dev, buf, 34); - - if ( capabilityInfo & ZM_BIT_1 ) - { - if ( (wd->sta.capability[0] & ZM_BIT_4) == - (capabilityInfo & ZM_BIT_4) ) - { - zm_debug_msg0("IBSS merge"); - zfCopyFromRxBuffer(dev, buf, bssid, - ZM_WLAN_HEADER_A3_OFFSET, 6); - zfUpdateBssid(dev, bssid); - } - } - } - } - } -#endif - } - } - - /* return if not channel scan */ - if ( !wd->sta.bChannelScan ) - { - goto zlReturn; - } - - zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanBeaconFrameHeader)); - pBeaconHeader = (struct zsWlanBeaconFrameHeader*) pBuf; - - zmw_enter_critical_section(dev); - - //zm_debug_msg1("bss count = ", wd->sta.bssList.bssCount); - - pBssInfo = zfStaFindBssInfo(dev, buf, pBeaconHeader); - - if ( pBssInfo == NULL ) - { - /* Allocate a new entry if BSS not in the scan list */ - pBssInfo = zfBssInfoAllocate(dev); - if (pBssInfo != NULL) - { - res = zfStaInitBssInfo(dev, buf, pBeaconHeader, pBssInfo, AddInfo, 0); - //zfDumpSSID(pBssInfo->ssid[1], &(pBssInfo->ssid[2])); - if ( res != 0 ) - { - zfBssInfoFree(dev, pBssInfo); - } - else - { - zfBssInfoInsertToList(dev, pBssInfo); - } - } - } - else - { - res = zfStaInitBssInfo(dev, buf, pBeaconHeader, pBssInfo, AddInfo, 1); - if (res == 2) - { - zfBssInfoRemoveFromList(dev, pBssInfo); - zfBssInfoFree(dev, pBssInfo); - } - else if ( wd->wlanMode == ZM_MODE_IBSS ) - { - int idx; - - // It would reset the alive counter if the peer station is found! - zfStaFindFreeOpposite(dev, (u16_t *)pBssInfo->macaddr, &idx); - } - } - - zmw_leave_critical_section(dev); - -zlReturn: - - return; -} - - -void zfAuthFreqCompleteCb(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - if (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_COMPLETED) - { - zm_debug_msg0("ZM_STA_CONN_STATE_ASSOCIATE"); - wd->sta.connectTimer = wd->tick; - wd->sta.connectState = ZM_STA_CONN_STATE_ASSOCIATE; - } - - zmw_leave_critical_section(dev); - return; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfProcessAuth */ -/* Process authenticate management frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : auth frame buffer */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -/* Note : AP allows one authenticating STA at a time, does not */ -/* support multiple authentication process. Make sure */ -/* authentication state machine will not be blocked due */ -/* to incompleted authentication handshake. */ -void zfStaProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId) -{ - struct zsWlanAuthFrameHeader* pAuthFrame; - u8_t pBuf[sizeof(struct zsWlanAuthFrameHeader)]; - u32_t p1, p2; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - if ( !zfStaIsConnecting(dev) ) - { - return; - } - - pAuthFrame = (struct zsWlanAuthFrameHeader*) pBuf; - zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanAuthFrameHeader)); - - if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_OPEN ) - { - if ( (zmw_le16_to_cpu(pAuthFrame->seq) == 2)&& - (zmw_le16_to_cpu(pAuthFrame->algo) == 0)&& - (zmw_le16_to_cpu(pAuthFrame->status) == 0) ) - { - - zmw_enter_critical_section(dev); - wd->sta.connectTimer = wd->tick; - zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_COMPLETED"); - wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_COMPLETED; - zmw_leave_critical_section(dev); - - //Set channel according to AP's configuration - //Move to here because of Cisco 11n AP feature - zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40, - wd->ExtOffset, zfAuthFreqCompleteCb); - - /* send association frame */ - if ( wd->sta.connectByReasso ) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_REASOCREQ, - wd->sta.bssid, 0, 0, 0); - } - else - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCREQ, - wd->sta.bssid, 0, 0, 0); - } - - - } - else - { - zm_debug_msg1("authentication failed, status = ", - pAuthFrame->status); - - if (wd->sta.authMode == ZM_AUTH_MODE_AUTO) - { - wd->sta.bIsSharedKey = 1; - zfStaStartConnect(dev, wd->sta.bIsSharedKey); - } - else - { - zm_debug_msg0("ZM_STA_STATE_DISCONNECT"); - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3); - } - } - } - else if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_1 ) - { - if ( (zmw_le16_to_cpu(pAuthFrame->algo) == 1) && - (zmw_le16_to_cpu(pAuthFrame->seq) == 2) && - (zmw_le16_to_cpu(pAuthFrame->status) == 0)) - //&& (pAuthFrame->challengeText[1] <= 255) ) - { - zfMemoryCopy(wd->sta.challengeText, pAuthFrame->challengeText, - pAuthFrame->challengeText[1]+2); - - /* send the 3rd authentication frame */ - p1 = 0x30001; - p2 = 0; - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH, - wd->sta.bssid, p1, p2, 0); - - zmw_enter_critical_section(dev); - wd->sta.connectTimer = wd->tick; - - zm_debug_msg0("ZM_STA_SUB_STATE_AUTH_SHARE_2"); - wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_SHARE_2; - zmw_leave_critical_section(dev); - } - else - { - zm_debug_msg1("authentication failed, status = ", - pAuthFrame->status); - - zm_debug_msg0("ZM_STA_STATE_DISCONNECT"); - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3); - } - } - else if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_2 ) - { - if ( (zmw_le16_to_cpu(pAuthFrame->algo) == 1)&& - (zmw_le16_to_cpu(pAuthFrame->seq) == 4)&& - (zmw_le16_to_cpu(pAuthFrame->status) == 0) ) - { - //Set channel according to AP's configuration - //Move to here because of Cisco 11n AP feature - zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40, - wd->ExtOffset, NULL); - - /* send association frame */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCREQ, - wd->sta.bssid, 0, 0, 0); - - zmw_enter_critical_section(dev); - wd->sta.connectTimer = wd->tick; - - zm_debug_msg0("ZM_STA_SUB_STATE_ASSOCIATE"); - wd->sta.connectState = ZM_STA_CONN_STATE_ASSOCIATE; - zmw_leave_critical_section(dev); - } - else - { - zm_debug_msg1("authentication failed, status = ", - pAuthFrame->status); - - zm_debug_msg0("ZM_STA_STATE_DISCONNECT"); - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3); - } - } - else - { - zm_debug_msg0("unknown case"); - } -} - -void zfStaProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId) -{ - - return; -} - -void zfStaProcessAsocRsp(zdev_t* dev, zbuf_t* buf) -{ - struct zsWlanAssoFrameHeader* pAssoFrame; - u8_t pBuf[sizeof(struct zsWlanAssoFrameHeader)]; - u16_t offset; - u32_t i; - u32_t oneTxStreamCap; - - zmw_get_wlan_dev(dev); - - if ( !zfStaIsConnecting(dev) ) - { - return; - } - - pAssoFrame = (struct zsWlanAssoFrameHeader*) pBuf; - zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanAssoFrameHeader)); - - if ( wd->sta.connectState == ZM_STA_CONN_STATE_ASSOCIATE ) - { - if ( pAssoFrame->status == 0 ) - { - zm_debug_msg0("ZM_STA_STATE_CONNECTED"); - - if (wd->sta.EnableHT == 1) - { - wd->sta.wmeConnected = 1; - } - if ((wd->sta.wmeEnabled & ZM_STA_WME_ENABLE_BIT) != 0) //WME enabled - { - /* Asoc rsp may contain WME parameter element */ - offset = zfFindWifiElement(dev, buf, 2, 1); - if (offset != 0xffff) - { - zm_debug_msg0("WME enable"); - wd->sta.wmeConnected = 1; - if ((wd->sta.wmeEnabled & ZM_STA_UAPSD_ENABLE_BIT) != 0) - { - if ((zmw_rx_buf_readb(dev, buf, offset+8) & 0x80) != 0) - { - zm_debug_msg0("UAPSD enable"); - wd->sta.qosInfo = wd->sta.wmeQosInfo; - } - } - - zfStaUpdateWmeParameter(dev, buf); - } - } - - - //Store asoc response frame body, for VISTA only - wd->sta.asocRspFrameBodySize = zfwBufGetSize(dev, buf)-24; - if (wd->sta.asocRspFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE) - { - wd->sta.asocRspFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE; - } - for (i=0; ista.asocRspFrameBodySize; i++) - { - wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24); - } - - zfStaStoreAsocRspIe(dev, buf); - if (wd->sta.EnableHT && - ((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) != 0) && - (wd->ExtOffset != 0)) - { - wd->sta.htCtrlBandwidth = 1; - } - else - { - wd->sta.htCtrlBandwidth = 0; - } - - //Set channel according to AP's configuration - //zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40, - // wd->ExtOffset, NULL); - - if (wd->sta.EnableHT == 1) - { - wd->addbaComplete = 0; - - if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0 && - (wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) == 0) - { - wd->addbaCount = 1; - zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0); - zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100); - } - } - - /* set RIFS support */ - if(wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode) - { - wd->sta.HT2040 = 1; -// zfHpSetRifs(dev, wd->sta.EnableHT, 1, (wd->sta.currentFrequency < 3000)? 1:0); - } - - wd->sta.aid = pAssoFrame->aid & 0x3fff; - wd->sta.oppositeCount = 0; /* reset opposite count */ - zfStaSetOppositeInfoFromRxBuf(dev, buf); - - wd->sta.rxBeaconCount = 16; - - zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED); - wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev); - if (wd->zfcbConnectNotify != NULL) - { - if (wd->sta.EnableHT != 0) /* 11n */ - { - oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM); - if (wd->sta.htCtrlBandwidth == 1) /* HT40*/ - { - if(oneTxStreamCap) /* one Tx stream */ - { - if (wd->sta.SG40) - { - wd->CurrentTxRateKbps = 150000; - wd->CurrentRxRateKbps = 300000; - } - else - { - wd->CurrentTxRateKbps = 135000; - wd->CurrentRxRateKbps = 270000; - } - } - else /* Two Tx streams */ - { - if (wd->sta.SG40) - { - wd->CurrentTxRateKbps = 300000; - wd->CurrentRxRateKbps = 300000; - } - else - { - wd->CurrentTxRateKbps = 270000; - wd->CurrentRxRateKbps = 270000; - } - } - } - else /* HT20 */ - { - if(oneTxStreamCap) /* one Tx stream */ - { - wd->CurrentTxRateKbps = 650000; - wd->CurrentRxRateKbps = 130000; - } - else /* Two Tx streams */ - { - wd->CurrentTxRateKbps = 130000; - wd->CurrentRxRateKbps = 130000; - } - } - } - else /* 11abg */ - { - if (wd->sta.connection_11b != 0) - { - wd->CurrentTxRateKbps = 11000; - wd->CurrentRxRateKbps = 11000; - } - else - { - wd->CurrentTxRateKbps = 54000; - wd->CurrentRxRateKbps = 54000; - } - } - - - wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid); - } - wd->sta.connectByReasso = TRUE; - wd->sta.failCntOfReasso = 0; - - zfPowerSavingMgrConnectNotify(dev); - - /* Disable here because fixed rate is only for test, TBD. */ - //if (wd->sta.EnableHT) - //{ - // wd->txMCS = 7; //Rate = 65Mbps - // wd->txMT = 2; // Ht rate - // wd->enableAggregation = 2; // Enable Aggregation - //} - } - else - { - zm_debug_msg1("association failed, status = ", - pAssoFrame->status); - - zm_debug_msg0("ZM_STA_STATE_DISCONNECT"); - wd->sta.connectByReasso = FALSE; - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED, wd->sta.bssid, 3); - } - } - -} - -void zfStaStoreAsocRspIe(zdev_t* dev, zbuf_t* buf) -{ - u16_t offset; - u32_t i; - u16_t length; - u8_t *htcap; - u8_t asocBw40 = 0; - u8_t asocExtOffset = 0; - - zmw_get_wlan_dev(dev); - - for (i=0; ista.asocRspFrameBodySize; i++) - { - wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24); - } - - /* HT capabilities: 28 octets */ - if ( ((wd->sta.currentFrequency > 3000) && !(wd->supportMode & ZM_WIRELESS_MODE_5_N)) - || ((wd->sta.currentFrequency < 3000) && !(wd->supportMode & ZM_WIRELESS_MODE_24_N)) ) - { - /* not 11n AP */ - htcap = (u8_t *)&wd->sta.ie.HtCap; - for (i=0; i<28; i++) - { - htcap[i] = 0; - } - wd->BandWidth40 = 0; - wd->ExtOffset = 0; - return; - } - - offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY); - if (offset != 0xffff) - { - /* atheros pre n */ - zm_debug_msg0("atheros pre n"); - htcap = (u8_t *)&wd->sta.ie.HtCap; - htcap[0] = zmw_rx_buf_readb(dev, buf, offset); - htcap[1] = 26; - for (i=1; i<=26; i++) - { - htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i); - zm_msg2_mm(ZM_LV_1, "ASOC: HT Capabilities, htcap=", htcap[i+1]); - } - } - else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff) - { - /* pre n 2.0 standard */ - zm_debug_msg0("pre n 2.0 standard"); - htcap = (u8_t *)&wd->sta.ie.HtCap; - for (i=0; i<28; i++) - { - htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i); - zm_msg2_mm(ZM_LV_1, "ASOC: HT Capabilities, htcap=", htcap[i]); - } - } - else - { - /* not 11n AP */ - htcap = (u8_t *)&wd->sta.ie.HtCap; - for (i=0; i<28; i++) - { - htcap[i] = 0; - } - wd->BandWidth40 = 0; - wd->ExtOffset = 0; - return; - } - - asocBw40 = (u8_t)((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) >> 1); - - /* HT information */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY); - if (offset != 0xffff) - { - /* atheros pre n */ - zm_debug_msg0("atheros pre n HTINFO"); - length = 22; - htcap = (u8_t *)&wd->sta.ie.HtInfo; - htcap[0] = zmw_rx_buf_readb(dev, buf, offset); - htcap[1] = 22; - for (i=1; i<=22; i++) - { - htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i); - zm_msg2_mm(ZM_LV_1, "ASOC: HT Info, htinfo=", htcap[i+1]); - } - } - else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTINFORMATION)) != 0xffff) - { - /* pre n 2.0 standard */ - zm_debug_msg0("pre n 2.0 standard HTINFO"); - length = zmw_rx_buf_readb(dev, buf, offset + 1); - htcap = (u8_t *)&wd->sta.ie.HtInfo; - for (i=0; i<24; i++) - { - htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i); - zm_msg2_mm(ZM_LV_1, "ASOC: HT Info, htinfo=", htcap[i]); - } - } - else - { - zm_debug_msg0("no HTINFO"); - htcap = (u8_t *)&wd->sta.ie.HtInfo; - for (i=0; i<24; i++) - { - htcap[i] = 0; - } - } - asocExtOffset = wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_ExtChannelOffsetBelow; - - if ((wd->sta.EnableHT == 1) && (asocBw40 == 1) && ((asocExtOffset == 1) || (asocExtOffset == 3))) - { - wd->BandWidth40 = asocBw40; - wd->ExtOffset = asocExtOffset; - } - else - { - wd->BandWidth40 = 0; - wd->ExtOffset = 0; - } - - return; -} - -void zfStaProcessDeauth(zdev_t* dev, zbuf_t* buf) -{ - u16_t apMacAddr[3]; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - /* STA : if SA=connected AP then disconnect with AP */ - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - apMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET); - apMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2); - apMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4); - if ((apMacAddr[0] == wd->sta.bssid[0]) && (apMacAddr[1] == wd->sta.bssid[1]) && (apMacAddr[2] == wd->sta.bssid[2])) - { - if (zfwBufGetSize(dev, buf) >= 24+2) //not a malformed frame - { - if ( zfStaIsConnected(dev) ) - { - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_DEAUTH, wd->sta.bssid, 2); - } - else if (zfStaIsConnecting(dev)) - { - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3); - } - else - { - } - } - } - } - else if ( wd->wlanMode == ZM_MODE_IBSS ) - { - u16_t peerMacAddr[3]; - u8_t peerIdx; - s8_t res; - - if ( zfStaIsConnected(dev) ) - { - peerMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET); - peerMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2); - peerMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4); - - zmw_enter_critical_section(dev); - res = zfStaFindOppositeByMACAddr(dev, peerMacAddr, &peerIdx); - if ( res == 0 ) - { - wd->sta.oppositeInfo[peerIdx].aliveCounter = 0; - } - zmw_leave_critical_section(dev); - } - } -} - -void zfStaProcessDisasoc(zdev_t* dev, zbuf_t* buf) -{ - u16_t apMacAddr[3]; - - zmw_get_wlan_dev(dev); - - /* STA : if SA=connected AP then disconnect with AP */ - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - apMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET); - apMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2); - apMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4); - - if ((apMacAddr[0] == wd->sta.bssid[0]) && (apMacAddr[1] == wd->sta.bssid[1]) && (apMacAddr[2] == wd->sta.bssid[2])) - { - if (zfwBufGetSize(dev, buf) >= 24+2) //not a malformed frame - { - if ( zfStaIsConnected(dev) ) - { - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_DISASOC, wd->sta.bssid, 2); - } - else - { - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED, wd->sta.bssid, 3); - } - } - } - } -} - - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfProcessProbeReq */ -/* Process probe request management frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : auth frame buffer */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -void zfStaProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src) -{ - u16_t offset; - u8_t len; - u16_t i, j; - u16_t sendFlag; - - zmw_get_wlan_dev(dev); - - /* check mode : AP/IBSS */ - if ((wd->wlanMode != ZM_MODE_AP) && (wd->wlanMode != ZM_MODE_IBSS)) - { - zm_msg0_mm(ZM_LV_3, "Ignore probe req"); - return; - } - - /* check SSID */ - offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID); - if (offset == 0xffff) - { - zm_msg0_mm(ZM_LV_3, "probe req SSID not found"); - return; - } - - len = zmw_rx_buf_readb(dev, buf, offset+1); - - for (i=0; iap.apBitmap & (i<ap.hideSsid[i] == 0)) - { - sendFlag = 1; - } - /* Not broadcast SSID */ - else if (wd->ap.ssidLen[i] == len) - { - for (j=0; jap.ssid[i][j]) - { - break; - } - } - if (j == len) - { - sendFlag = 1; - } - } - if (sendFlag == 1) - { - /* Send probe response */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, i, 0, 0); - } - } - } -} - -void zfStaProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) -{ - /* return if not channel scan */ - // Probe response is sent with unicast. Is this required? - // IBSS would send probe request and the code below would prevent - // the probe response from handling. - #if 0 - zmw_get_wlan_dev(dev); - - if ( !wd->sta.bChannelScan ) - { - return; - } - #endif - - zfProcessProbeRsp(dev, buf, AddInfo); -} - -void zfIBSSSetupBssDesc(zdev_t *dev) -{ -#ifdef ZM_ENABLE_IBSS_WPA2PSK - u8_t i; -#endif - struct zsBssInfo *pBssInfo; - u16_t offset = 0; - - zmw_get_wlan_dev(dev); - - pBssInfo = &wd->sta.ibssBssDesc; - zfZeroMemory((u8_t *)pBssInfo, sizeof(struct zsBssInfo)); - - pBssInfo->signalStrength = 100; - - zfMemoryCopy((u8_t *)pBssInfo->macaddr, (u8_t *)wd->macAddr,6); - zfMemoryCopy((u8_t *)pBssInfo->bssid, (u8_t *)wd->sta.bssid, 6); - - pBssInfo->beaconInterval[0] = (u8_t)(wd->beaconInterval) ; - pBssInfo->beaconInterval[1] = (u8_t)((wd->beaconInterval) >> 8) ; - - pBssInfo->capability[0] = wd->sta.capability[0]; - pBssInfo->capability[1] = wd->sta.capability[1]; - - pBssInfo->ssid[0] = ZM_WLAN_EID_SSID; - pBssInfo->ssid[1] = wd->sta.ssidLen; - zfMemoryCopy((u8_t *)&pBssInfo->ssid[2], (u8_t *)wd->sta.ssid, wd->sta.ssidLen); - zfMemoryCopy((u8_t *)&pBssInfo->frameBody[offset], (u8_t *)pBssInfo->ssid, - wd->sta.ssidLen + 2); - offset += wd->sta.ssidLen + 2; - - /* support rate */ - - /* DS parameter set */ - pBssInfo->channel = zfChFreqToNum(wd->frequency, NULL); - pBssInfo->frequency = wd->frequency; - pBssInfo->atimWindow = wd->sta.atimWindow; - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK ) - { - u8_t rsn[64]= - { - /* Element ID */ - 0x30, - /* Length */ - 0x14, - /* Version */ - 0x01, 0x00, - /* Group Cipher Suite, default=TKIP */ - 0x00, 0x0f, 0xac, 0x04, - /* Pairwise Cipher Suite Count */ - 0x01, 0x00, - /* Pairwise Cipher Suite, default=TKIP */ - 0x00, 0x0f, 0xac, 0x02, - /* Authentication and Key Management Suite Count */ - 0x01, 0x00, - /* Authentication type, default=PSK */ - 0x00, 0x0f, 0xac, 0x02, - /* RSN capability */ - 0x00, 0x00 - }; - - /* Overwrite Group Cipher Suite by AP's setting */ - zfMemoryCopy(rsn+4, zgWpa2AesOui, 4); - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES ) - { - /* Overwrite Pairwise Cipher Suite by AES */ - zfMemoryCopy(rsn+10, zgWpa2AesOui, 4); - } - - // RSN element id - pBssInfo->frameBody[offset++] = ZM_WLAN_EID_RSN_IE ; - - // RSN length - pBssInfo->frameBody[offset++] = rsn[1] ; - - // RSN information - for(i=0; iframeBody[offset++] = rsn[i+2] ; - } - - zfMemoryCopy(pBssInfo->rsnIe, rsn, rsn[1]+2); - } -#endif -} - -void zfIbssConnectNetwork(zdev_t* dev) -{ - struct zsBssInfo* pBssInfo; - struct zsBssInfo tmpBssInfo; - u8_t macAddr[6], bssid[6], bssNotFound = TRUE; - u16_t i, j=100; - u16_t k; - struct zsPartnerNotifyEvent event; - u32_t channelFlags; - u16_t oppositeWepStatus; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - /* change state to CONNECTING and stop the channel scanning */ - zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING); - zfPowerSavingMgrWakeup(dev); - - /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */ - zfUpdateDefaultQosParameter(dev, 0); - - wd->sta.bProtectionMode = FALSE; - zfHpSetSlotTime(dev, 1); - - /* ESS bit off */ - wd->sta.capability[0] &= ~ZM_BIT_0; - /* IBSS bit on */ - wd->sta.capability[0] |= ZM_BIT_1; - /* not not use short slot time */ - wd->sta.capability[1] &= ~ZM_BIT_2; - - wd->sta.wmeConnected = 0; - wd->sta.psMgr.tempWakeUp = 0; - wd->sta.qosInfo = 0; - wd->sta.EnableHT = 0; - wd->BandWidth40 = 0; - wd->ExtOffset = 0; - - if ( wd->sta.bssList.bssCount ) - { - //Reorder BssList by RSSI--CWYang(+) - zfBssInfoReorderList(dev); - - zmw_enter_critical_section(dev); - - pBssInfo = wd->sta.bssList.head; - - for(i=0; ista.bssList.bssCount; i++) - { - // 20070806 #1 Privacy bit - if ( pBssInfo->capability[0] & ZM_BIT_4 ) - { // Privacy Ibss network -// zm_debug_msg0("Privacy bit on"); - oppositeWepStatus = ZM_ENCRYPTION_WEP_ENABLED; - - if ( pBssInfo->rsnIe[1] != 0 ) - { - if ( (pBssInfo->rsnIe[7] == 0x01) || (pBssInfo->rsnIe[7] == 0x05) ) - { // WEP-40 & WEP-104 -// zm_debug_msg0("WEP40 or WEP104"); - oppositeWepStatus = ZM_ENCRYPTION_WEP_ENABLED; - } - else if ( pBssInfo->rsnIe[7] == 0x02 ) - { // TKIP -// zm_debug_msg0("TKIP"); - oppositeWepStatus = ZM_ENCRYPTION_TKIP; - } - else if ( pBssInfo->rsnIe[7] == 0x04 ) - { // AES -// zm_debug_msg0("CCMP-AES"); - oppositeWepStatus = ZM_ENCRYPTION_AES; - } - } - } - else - { -// zm_debug_msg0("Privacy bit off"); - oppositeWepStatus = ZM_ENCRYPTION_WEP_DISABLED; - } - - if ( (zfMemoryIsEqual(&(pBssInfo->ssid[2]), wd->sta.ssid, - wd->sta.ssidLen))&& - (wd->sta.ssidLen == pBssInfo->ssid[1])&& - (oppositeWepStatus == wd->sta.wepStatus) ) - { - /* Check support mode */ - if (pBssInfo->frequency > 3000) { - if ( (pBssInfo->EnableHT == 1) - || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP - { - channelFlags = CHANNEL_A_HT; - if (pBssInfo->enableHT40 == 1) { - channelFlags |= CHANNEL_HT40; - } - } else { - channelFlags = CHANNEL_A; - } - } else { - if ( (pBssInfo->EnableHT == 1) - || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP - { - channelFlags = CHANNEL_G_HT; - if(pBssInfo->enableHT40 == 1) { - channelFlags |= CHANNEL_HT40; - } - } else { - if (pBssInfo->extSupportedRates[1] == 0) { - channelFlags = CHANNEL_B; - } else { - channelFlags = CHANNEL_G; - } - } - } - - if ( ((channelFlags == CHANNEL_B) && (wd->connectMode & ZM_BIT_0)) - || ((channelFlags == CHANNEL_G) && (wd->connectMode & ZM_BIT_1)) - || ((channelFlags == CHANNEL_A) && (wd->connectMode & ZM_BIT_2)) - || ((channelFlags & CHANNEL_HT20) && (wd->connectMode & ZM_BIT_3)) ) - { - pBssInfo = pBssInfo->next; - continue; - } - - /* Bypass DFS channel */ - if (zfHpIsDfsChannelNCS(dev, pBssInfo->frequency)) - { - zm_debug_msg0("Bypass DFS channel"); - continue; - } - - /* check IBSS bit */ - if ( pBssInfo->capability[0] & ZM_BIT_1 ) - { - /* may check timestamp here */ - j = i; - break; - } - } - - pBssInfo = pBssInfo->next; - } - - if ((j < wd->sta.bssList.bssCount) && (pBssInfo != NULL)) - { - zfwMemoryCopy((u8_t*)&tmpBssInfo, (u8_t*)(pBssInfo), sizeof(struct zsBssInfo)); - pBssInfo = &tmpBssInfo; - } - else - { - pBssInfo = NULL; - } - - zmw_leave_critical_section(dev); - - //if ( j < wd->sta.bssList.bssCount ) - if (pBssInfo != NULL) - { - int res; - - zm_debug_msg0("IBSS found"); - - /* Found IBSS, reset bssNotFoundCount */ - zmw_enter_critical_section(dev); - wd->sta.bssNotFoundCount = 0; - zmw_leave_critical_section(dev); - - bssNotFound = FALSE; - wd->sta.atimWindow = pBssInfo->atimWindow; - wd->frequency = pBssInfo->frequency; - //wd->sta.flagFreqChanging = 1; - zfCoreSetFrequency(dev, wd->frequency); - zfUpdateBssid(dev, pBssInfo->bssid); - zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_ZERO); - zfUpdateSupportRate(dev, pBssInfo->supportedRates); - zfUpdateSupportRate(dev, pBssInfo->extSupportedRates); - wd->beaconInterval = pBssInfo->beaconInterval[0] + - (((u16_t) pBssInfo->beaconInterval[1]) << 8); - - if (wd->beaconInterval == 0) - { - wd->beaconInterval = 100; - } - - /* rsn information element */ - if ( pBssInfo->rsnIe[1] != 0 ) - { - zfMemoryCopy(wd->sta.rsnIe, pBssInfo->rsnIe, - pBssInfo->rsnIe[1]+2); - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - /* If not use RSNA , run traditional */ - zmw_enter_critical_section(dev); - wd->sta.ibssWpa2Psk = 1; - zmw_leave_critical_section(dev); -#endif - } - else - { - wd->sta.rsnIe[1] = 0; - } - - /* privacy bit */ - if ( pBssInfo->capability[0] & ZM_BIT_4 ) - { - wd->sta.capability[0] |= ZM_BIT_4; - } - else - { - wd->sta.capability[0] &= ~ZM_BIT_4; - } - - /* preamble type */ - wd->preambleTypeInUsed = wd->preambleType; - if ( wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_AUTO ) - { - if (pBssInfo->capability[0] & ZM_BIT_5) - { - wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT; - } - else - { - wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_LONG; - } - } - - if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG) - { - wd->sta.capability[0] &= ~ZM_BIT_5; - } - else - { - wd->sta.capability[0] |= ZM_BIT_5; - } - - wd->sta.beaconFrameBodySize = pBssInfo->frameBodysize + 12; - - if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE) - { - wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE; - } - - for (k=0; k<8; k++) - { - wd->sta.beaconFrameBody[k] = pBssInfo->timeStamp[k]; - } - wd->sta.beaconFrameBody[8] = pBssInfo->beaconInterval[0]; - wd->sta.beaconFrameBody[9] = pBssInfo->beaconInterval[1]; - wd->sta.beaconFrameBody[10] = pBssInfo->capability[0]; - wd->sta.beaconFrameBody[11] = pBssInfo->capability[1]; - //for (k=12; ksta.beaconFrameBodySize; k++) - for (k=0; kframeBodysize; k++) - { - wd->sta.beaconFrameBody[k+12] = pBssInfo->frameBody[k]; - } - - zmw_enter_critical_section(dev); - res = zfStaSetOppositeInfoFromBSSInfo(dev, pBssInfo); - if ( res == 0 ) - { - zfMemoryCopy(event.bssid, (u8_t *)(pBssInfo->bssid), 6); - zfMemoryCopy(event.peerMacAddr, (u8_t *)(pBssInfo->macaddr), 6); - } - zmw_leave_critical_section(dev); - - //zfwIbssPartnerNotify(dev, 1, &event); - goto connect_done; - } - } - - /* IBSS not found */ - if ( bssNotFound ) - { -#ifdef ZM_ENABLE_IBSS_WPA2PSK - u16_t offset ; -#endif - if ( wd->sta.ibssJoinOnly ) - { - zm_debug_msg0("IBSS join only...retry..."); - goto retry_ibss; - } - - if(wd->sta.bssNotFoundCount<2) - { - zmw_enter_critical_section(dev); - zm_debug_msg1("IBSS not found, do sitesurvey!! bssNotFoundCount=", wd->sta.bssNotFoundCount); - wd->sta.bssNotFoundCount++; - zmw_leave_critical_section(dev); - goto retry_ibss; - } - else - { - zmw_enter_critical_section(dev); - /* Fail IBSS found, TODO create IBSS */ - wd->sta.bssNotFoundCount = 0; - zmw_leave_critical_section(dev); - } - - - if (zfHpIsDfsChannel(dev, wd->frequency)) - { - wd->frequency = zfHpFindFirstNonDfsChannel(dev, wd->frequency > 3000); - } - - if( wd->ws.autoSetFrequency == 0 ) - { /* Auto set frequency */ - zm_debug_msg1("Create Ad Hoc Network Band ", wd->ws.adhocMode); - wd->frequency = zfFindCleanFrequency(dev, wd->ws.adhocMode); - wd->ws.autoSetFrequency = 0xff; - } - zm_debug_msg1("IBSS not found, created one in channel ", wd->frequency); - - wd->sta.ibssBssIsCreator = 1; - - //wd->sta.flagFreqChanging = 1; - zfCoreSetFrequency(dev, wd->frequency); - if (wd->sta.bDesiredBssid == TRUE) - { - for (k=0; k<6; k++) - { - bssid[k] = wd->sta.desiredBssid[k]; - } - } - else - { - #if 1 - macAddr[0] = (wd->macAddr[0] & 0xff); - macAddr[1] = (wd->macAddr[0] >> 8); - macAddr[2] = (wd->macAddr[1] & 0xff); - macAddr[3] = (wd->macAddr[1] >> 8); - macAddr[4] = (wd->macAddr[2] & 0xff); - macAddr[5] = (wd->macAddr[2] >> 8); - zfGenerateRandomBSSID(dev, (u8_t *)wd->macAddr, (u8_t *)bssid); - #else - for (k=0; k<6; k++) - { - bssid[k] = (u8_t) zfGetRandomNumber(dev, 0); - } - bssid[0] &= ~ZM_BIT_0; - bssid[0] |= ZM_BIT_1; - #endif - } - - zfUpdateBssid(dev, bssid); - //wd->sta.atimWindow = 0x0a; - - /* rate information */ - if(wd->frequency <= ZM_CH_G_14) // 2.4 GHz b+g - { - if ( wd->wfc.bIbssGMode - && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) - { - zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_AG); - } - else - { - zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_B); - } - } else { - zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_AG); - } - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED ) - { - wd->sta.capability[0] &= ~ZM_BIT_4; - } - else - { - wd->sta.capability[0] |= ZM_BIT_4; - } - - wd->preambleTypeInUsed = wd->preambleType; - if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG) - { - wd->sta.capability[0] &= ~ZM_BIT_5; - } - else - { - wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT; - wd->sta.capability[0] |= ZM_BIT_5; - } - - zfIBSSSetupBssDesc(dev); - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - - // 20070411 Add WPA2PSK information to its IBSS network !!! - offset = 0 ; - - /* timestamp */ - offset += 8 ; - - /* beacon interval */ - wd->sta.beaconFrameBody[offset++] = (u8_t)(wd->beaconInterval) ; - wd->sta.beaconFrameBody[offset++] = (u8_t)((wd->beaconInterval) >> 8) ; - - /* capability information */ - wd->sta.beaconFrameBody[offset++] = wd->sta.capability[0] ; - wd->sta.beaconFrameBody[offset++] = wd->sta.capability[1] ; - #if 0 - /* ssid */ - // ssid element id - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_SSID ; - // ssid length - wd->sta.beaconFrameBody[offset++] = wd->sta.ssidLen ; - // ssid information - for(i=0; ista.ssidLen; i++) - { - wd->sta.beaconFrameBody[offset++] = wd->sta.ssid[i] ; - } - - /* support rate */ - rateSet = ZM_RATE_SET_CCK ; - if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) ) - { - offset += 0 ; - } - else - { - // support rate element id - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_SUPPORT_RATE ; - - // support rate length - lenOffset = offset++; - - // support rate information - for (i=0; i<4; i++) - { - if ((wd->bRate & (0x1<sta.beaconFrameBody[offset++] = - zg11bRateTbl[i]+((wd->bRateBasic & (0x1<sta.beaconFrameBody[lenOffset] = len ; - } - - /* DS parameter set */ - // DS parameter set elemet id - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_DS ; - - // DS parameter set length - wd->sta.beaconFrameBody[offset++] = 1 ; - - // DS parameter set information - wd->sta.beaconFrameBody[offset++] = - zfChFreqToNum(wd->frequency, NULL) ; - - /* IBSS parameter set */ - // IBSS parameter set element id - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_IBSS ; - - // IBSS parameter set length - wd->sta.beaconFrameBody[offset++] = 2 ; - - // IBSS parameter set information - wd->sta.beaconFrameBody[offset] = wd->sta.atimWindow ; - offset += 2 ; - - /* ERP Information and Extended Supported Rates */ - if ( wd->wfc.bIbssGMode - && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) - { - /* ERP Information */ - wd->erpElement = 0; - // ERP element id - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_ERP ; - - // ERP length - wd->sta.beaconFrameBody[offset++] = 1 ; - - // ERP information - wd->sta.beaconFrameBody[offset++] = wd->erpElement ; - - /* Extended Supported Rates */ - if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) ) - { - offset += 0 ; - } - else - { - len = 0 ; - - // Extended Supported Rates element id - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_EXTENDED_RATE ; - - // Extended Supported Rates length - lenOffset = offset++ ; - - // Extended Supported Rates information - for (i=0; i<8; i++) - { - if ((wd->gRate & (0x1<sta.beaconFrameBody[offset++] = - zg11gRateTbl[i]+((wd->gRateBasic & (0x1<sta.beaconFrameBody[lenOffset] = len ; - } - } - #endif - - /* RSN : important information influence the result of creating an IBSS network */ - if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK ) - { - u8_t frameType = ZM_WLAN_FRAME_TYPE_AUTH ; - u8_t rsn[64]= - { - /* Element ID */ - 0x30, - /* Length */ - 0x14, - /* Version */ - 0x01, 0x00, - /* Group Cipher Suite, default=TKIP */ - 0x00, 0x0f, 0xac, 0x04, - /* Pairwise Cipher Suite Count */ - 0x01, 0x00, - /* Pairwise Cipher Suite, default=TKIP */ - 0x00, 0x0f, 0xac, 0x02, - /* Authentication and Key Management Suite Count */ - 0x01, 0x00, - /* Authentication type, default=PSK */ - 0x00, 0x0f, 0xac, 0x02, - /* RSN capability */ - 0x00, 0x00 - }; - - /* Overwrite Group Cipher Suite by AP's setting */ - zfMemoryCopy(rsn+4, zgWpa2AesOui, 4); - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES ) - { - /* Overwrite Pairwise Cipher Suite by AES */ - zfMemoryCopy(rsn+10, zgWpa2AesOui, 4); - } - - // RSN element id - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_RSN_IE ; - - // RSN length - wd->sta.beaconFrameBody[offset++] = rsn[1] ; - - // RSN information - for(i=0; ista.beaconFrameBody[offset++] = rsn[i+2] ; - - zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2); - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - /* If not use RSNA , run traditional */ - zmw_enter_critical_section(dev); - wd->sta.ibssWpa2Psk = 1; - zmw_leave_critical_section(dev); -#endif - } - - #if 0 - /* HT Capabilities Info */ - { - u8_t OUI[3] = { 0x0 , 0x90 , 0x4C } ; - - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_WPA_IE ; - - wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Data.Length + 4 ; - - for (i = 0; i < 3; i++) - { - wd->sta.beaconFrameBody[offset++] = OUI[i] ; - } - - wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Data.ElementID ; - - for (i = 0; i < 26; i++) - { - wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Byte[i+2] ; - } - } - - /* Extended HT Capabilities Info */ - { - u8_t OUI[3] = { 0x0 , 0x90 , 0x4C } ; - - wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_WPA_IE ; - - wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Data.Length + 4 ; - - for (i = 0; i < 3; i++) - { - wd->sta.beaconFrameBody[offset++] = OUI[i] ; - } - - wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Data.ElementID ; - - for (i = 0; i < 22; i++) - { - wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Byte[i+2] ; - } - } - #endif - - wd->sta.beaconFrameBodySize = offset ; - - if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE) - { - wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE; - } - - // 20070416 Let Create IBSS network could enter the zfwIbssPartnerNotify function - // bssNotFound = FALSE ; - - printk("The capability info 1 = %02x\n", wd->sta.capability[0]) ; - printk("The capability info 2 = %02x\n", wd->sta.capability[1]) ; - for(k=0; ksta.beaconFrameBodySize; k++) - { - printk("%02x ", wd->sta.beaconFrameBody[k]) ; - } - #if 0 - zmw_enter_critical_section(dev); - zfMemoryCopy(event.bssid, (u8_t *)bssid, 6); - zfMemoryCopy(event.peerMacAddr, (u8_t *)wd->macAddr, 6); - zmw_leave_critical_section(dev); - #endif -#endif - - //zmw_enter_critical_section(dev); - //wd->sta.ibssPartnerStatus = ZM_IBSS_PARTNER_LOST; - //zmw_leave_critical_section(dev); - } - else - { - wd->sta.ibssBssIsCreator = 0; - } - -connect_done: - zfHpEnableBeacon(dev, ZM_MODE_IBSS, wd->beaconInterval, wd->dtim, (u8_t)wd->sta.atimWindow); - zfStaSendBeacon(dev); // Refresh Beacon content for ZD1211B HalPlus - zfHpSetAtimWindow(dev, wd->sta.atimWindow); - - // Start the IBSS timer to monitor for new stations - zmw_enter_critical_section(dev); - zfTimerSchedule(dev, ZM_EVENT_IBSS_MONITOR, ZM_TICK_IBSS_MONITOR); - zmw_leave_critical_section(dev); - - - if (wd->zfcbConnectNotify != NULL) - { - wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid); - } - zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED); - wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev); - -#ifdef ZM_ENABLE_IBSS_DELAYED_JOIN_INDICATION - if ( !bssNotFound ) - { - wd->sta.ibssDelayedInd = 1; - zfMemoryCopy((u8_t *)&wd->sta.ibssDelayedIndEvent, (u8_t *)&event, sizeof(struct zsPartnerNotifyEvent)); - } -#else - if ( !bssNotFound ) - { - if (wd->zfcbIbssPartnerNotify != NULL) - { - wd->zfcbIbssPartnerNotify(dev, 1, &event); - } - } -#endif - - return; - -retry_ibss: - zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING); - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND, wd->sta.bssid, 0); - return; -} - -void zfStaProcessAtim(zdev_t* dev, zbuf_t* buf) -{ - zmw_get_wlan_dev(dev); - - zm_debug_msg0("Receiving Atim window notification"); - - wd->sta.recvAtim = 1; -} - -static struct zsBssInfo* zfInfraFindAPToConnect(zdev_t* dev, - struct zsBssInfo* candidateBss) -{ - struct zsBssInfo* pBssInfo; - struct zsBssInfo* pNowBssInfo=NULL; - u16_t i; - u16_t ret, apWepStatus; - u32_t k; - u32_t channelFlags; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - pBssInfo = wd->sta.bssList.head; - - for(i=0; ista.bssList.bssCount; i++) - { - if ( pBssInfo->capability[0] & ZM_BIT_4 ) - { - apWepStatus = ZM_ENCRYPTION_WEP_ENABLED; - } - else - { - apWepStatus = ZM_ENCRYPTION_WEP_DISABLED; - } - - if ( ((zfMemoryIsEqual(&(pBssInfo->ssid[2]), wd->sta.ssid, - wd->sta.ssidLen))&& - (wd->sta.ssidLen == pBssInfo->ssid[1]))|| - ((wd->sta.ssidLen == 0)&& - /* connect to any BSS: AP's ans STA's WEP status must match */ - (wd->sta.wepStatus == apWepStatus )&& - (pBssInfo->securityType != ZM_SECURITY_TYPE_WPA) )) - { - if ( wd->sta.ssidLen == 0 ) - { - zm_debug_msg0("ANY BSS found"); - } - - if ( ((wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED && apWepStatus == ZM_ENCRYPTION_WEP_ENABLED) || - (wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED && - (apWepStatus == ZM_ENCRYPTION_WEP_DISABLED && wd->sta.dropUnencryptedPkts == 1))) && - (wd->sta.authMode >= ZM_AUTH_MODE_OPEN && wd->sta.authMode <= ZM_AUTH_MODE_AUTO) ) - { - zm_debug_msg0("Privacy policy is inconsistent"); - pBssInfo = pBssInfo->next; - continue; - } - - /* for WPA negative test */ - if ( !zfCheckAuthentication(dev, pBssInfo) ) - { - pBssInfo = pBssInfo->next; - continue; - } - - /* Check bssid */ - if (wd->sta.bDesiredBssid == TRUE) - { - for (k=0; k<6; k++) - { - if (wd->sta.desiredBssid[k] != pBssInfo->bssid[k]) - { - zm_msg0_mm(ZM_LV_1, "desired bssid not matched 1"); - break; - } - } - - if (k != 6) - { - zm_msg0_mm(ZM_LV_1, "desired bssid not matched 2"); - pBssInfo = pBssInfo->next; - continue; - } - } - - /* Check support mode */ - if (pBssInfo->frequency > 3000) { - if ( (pBssInfo->EnableHT == 1) - || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP - { - channelFlags = CHANNEL_A_HT; - if (pBssInfo->enableHT40 == 1) { - channelFlags |= CHANNEL_HT40; - } - } else { - channelFlags = CHANNEL_A; - } - } else { - if ( (pBssInfo->EnableHT == 1) - || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP - { - channelFlags = CHANNEL_G_HT; - if(pBssInfo->enableHT40 == 1) { - channelFlags |= CHANNEL_HT40; - } - } else { - if (pBssInfo->extSupportedRates[1] == 0) { - channelFlags = CHANNEL_B; - } else { - channelFlags = CHANNEL_G; - } - } - } - - if ( ((channelFlags == CHANNEL_B) && (wd->connectMode & ZM_BIT_0)) - || ((channelFlags == CHANNEL_G) && (wd->connectMode & ZM_BIT_1)) - || ((channelFlags == CHANNEL_A) && (wd->connectMode & ZM_BIT_2)) - || ((channelFlags & CHANNEL_HT20) && (wd->connectMode & ZM_BIT_3)) ) - { - pBssInfo = pBssInfo->next; - continue; - } - - /* Skip if AP in blocking list */ - ret = zfStaIsApInBlockingList(dev, pBssInfo->bssid); - if (ret == TRUE) - { - zm_msg0_mm(ZM_LV_0, "Candidate AP in blocking List, skip if there's stilla choice!"); - pNowBssInfo = pBssInfo; - pBssInfo = pBssInfo->next; - continue; - } - - if ( pBssInfo->capability[0] & ZM_BIT_0 ) // check if infra-BSS - { - pNowBssInfo = pBssInfo; - wd->sta.apWmeCapability = pBssInfo->wmeSupport; - - - goto done; - } - } - - pBssInfo = pBssInfo->next; - } - -done: - if (pNowBssInfo != NULL) - { - zfwMemoryCopy((void*)candidateBss, (void*)pNowBssInfo, sizeof(struct zsBssInfo)); - pNowBssInfo = candidateBss; - } - - zmw_leave_critical_section(dev); - - return pNowBssInfo; -} - - -void zfInfraConnectNetwork(zdev_t* dev) -{ - struct zsBssInfo* pBssInfo; - struct zsBssInfo* pNowBssInfo=NULL; - struct zsBssInfo candidateBss; - //u16_t i, j=100, quality=10000; - //u8_t ret=FALSE, apWepStatus; - u8_t ret=FALSE; - u16_t k; - u8_t density = ZM_MPDU_DENSITY_NONE; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - /* Reset bssNotFoundCount for Ad-Hoc:IBSS */ - /* Need review : IbssConn -> InfraConn -> IbssConn etc, flag/counter reset? */ - zmw_enter_critical_section(dev); - wd->sta.bssNotFoundCount = 0; - zmw_leave_critical_section(dev); - - /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */ - zfUpdateDefaultQosParameter(dev, 0); - - zfStaRefreshBlockList(dev, 0); - - /* change state to CONNECTING and stop the channel scanning */ - zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING); - zfPowerSavingMgrWakeup(dev); - - wd->sta.wmeConnected = 0; - wd->sta.psMgr.tempWakeUp = 0; - wd->sta.qosInfo = 0; - zfQueueFlush(dev, wd->sta.uapsdQ); - - wd->sta.connectState = ZM_STA_CONN_STATE_NONE; - - //Reorder BssList by RSSI--CWYang(+) - zfBssInfoReorderList(dev); - - pNowBssInfo = zfInfraFindAPToConnect(dev, &candidateBss); - - if (wd->sta.SWEncryptEnable != 0) - { - if (wd->sta.bSafeMode == 0) - { - zfStaDisableSWEncryption(dev);//Quickly reboot - } - } - if ( pNowBssInfo != NULL ) - { - //zm_assert(pNowBssInfo != NULL); - - pBssInfo = pNowBssInfo; - wd->sta.ssidLen = pBssInfo->ssid[1]; - zfMemoryCopy(wd->sta.ssid, &(pBssInfo->ssid[2]), pBssInfo->ssid[1]); - wd->frequency = pBssInfo->frequency; - //wd->sta.flagFreqChanging = 1; - - //zfCoreSetFrequency(dev, wd->frequency); - zfUpdateBssid(dev, pBssInfo->bssid); - zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_ZERO); - zfUpdateSupportRate(dev, pBssInfo->supportedRates); - zfUpdateSupportRate(dev, pBssInfo->extSupportedRates); - - wd->beaconInterval = pBssInfo->beaconInterval[0] + - (((u16_t) pBssInfo->beaconInterval[1]) << 8); - if (wd->beaconInterval == 0) - { - wd->beaconInterval = 100; - } - - /* ESS bit on */ - wd->sta.capability[0] |= ZM_BIT_0; - /* IBSS bit off */ - wd->sta.capability[0] &= ~ZM_BIT_1; - - /* 11n AP flag */ - wd->sta.EnableHT = pBssInfo->EnableHT; - wd->sta.SG40 = pBssInfo->SG40; -#ifdef ZM_ENABLE_CENC - if ( pBssInfo->securityType == ZM_SECURITY_TYPE_CENC ) - { - wd->sta.wmeEnabled = 0; //Disable WMM in CENC - cencInit(dev); - cencSetCENCMode(dev, NdisCENC_PSK); - wd->sta.wpaState = ZM_STA_WPA_STATE_INIT; - /* CENC */ - if ( pBssInfo->cencIe[1] != 0 ) - { - //wd->sta.wepStatus = ZM_ENCRYPTION_CENC; - //wd->sta.encryMode = ZM_CENC; - zfwCencHandleBeaconProbrespon(dev, (u8_t *)&pBssInfo->cencIe, - (u8_t *)&pBssInfo->ssid, (u8_t *)&pBssInfo->macaddr); - zfMemoryCopy(wd->sta.cencIe, pBssInfo->cencIe, - pBssInfo->cencIe[1]+2); - } - else - { - wd->sta.cencIe[1] = 0; - } - } -#endif //ZM_ENABLE_CENC - if ( pBssInfo->securityType == ZM_SECURITY_TYPE_WPA ) - { - wd->sta.wpaState = ZM_STA_WPA_STATE_INIT; - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_TKIP ) - { - wd->sta.encryMode = ZM_TKIP; - - /* Turn on software encryption/decryption for TKIP */ - if (wd->sta.EnableHT == 1) - { - zfStaEnableSWEncryption(dev, (ZM_SW_TKIP_ENCRY_EN|ZM_SW_TKIP_DECRY_EN)); - } - - /* Do not support TKIP in 11n mode */ - //wd->sta.EnableHT = 0; - //pBssInfo->enableHT40 = 0; - } - else if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES ) - { - wd->sta.encryMode = ZM_AES; - - /* If AP supports HT mode */ - if (wd->sta.EnableHT) - { - /* Set MPDU density to 8 us*/ - density = ZM_MPDU_DENSITY_8US; - } - } - - if ( pBssInfo->wpaIe[1] != 0 ) - { - zfMemoryCopy(wd->sta.wpaIe, pBssInfo->wpaIe, - pBssInfo->wpaIe[1]+2); - } - else - { - wd->sta.wpaIe[1] = 0; - } - - if ( pBssInfo->rsnIe[1] != 0 ) - { - zfMemoryCopy(wd->sta.rsnIe, pBssInfo->rsnIe, - pBssInfo->rsnIe[1]+2); - } - else - { - wd->sta.rsnIe[1] = 0; - } - } - - - - /* check preamble bit */ - wd->preambleTypeInUsed = wd->preambleType; - if ( wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_AUTO ) - { - if (pBssInfo->capability[0] & ZM_BIT_5) - { - wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT; - } - else - { - wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_LONG; - } - } - - if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG) - { - wd->sta.capability[0] &= ~ZM_BIT_5; - } - else - { - wd->sta.capability[0] |= ZM_BIT_5; - } - - /* check 802.11n 40MHz Setting */ - if ((pBssInfo->enableHT40 == 1) && - ((pBssInfo->extChOffset == 1) || (pBssInfo->extChOffset == 3))) - { - wd->BandWidth40 = pBssInfo->enableHT40; - wd->ExtOffset = pBssInfo->extChOffset; - } - else - { - wd->BandWidth40 = 0; - wd->ExtOffset = 0; - } - - /* check 802.11H support bit */ - - /* check Owl Ap */ - if ( pBssInfo->athOwlAp & ZM_BIT_0 ) - { - /* In this function, FW retry will be enable, ZM_MAC_REG_RETRY_MAX - will be set to 0. - */ - zfHpDisableHwRetry(dev); - wd->sta.athOwlAp = 1; - /* Set MPDU density to 8 us*/ - density = ZM_MPDU_DENSITY_8US; - } - else - { - /* In this function, FW retry will be disable, ZM_MAC_REG_RETRY_MAX - will be set to 3. - */ - zfHpEnableHwRetry(dev); - wd->sta.athOwlAp = 0; - } - wd->reorder = 1; - - /* Set MPDU density */ - zfHpSetMPDUDensity(dev, density); - - /* check short slot time bit */ - if ( pBssInfo->capability[1] & ZM_BIT_2 ) - { - wd->sta.capability[1] |= ZM_BIT_2; - } - - if ( pBssInfo->erp & ZM_BIT_1 ) - { - //zm_debug_msg0("protection mode on"); - wd->sta.bProtectionMode = TRUE; - zfHpSetSlotTime(dev, 0); - } - else - { - //zm_debug_msg0("protection mode off"); - wd->sta.bProtectionMode = FALSE; - zfHpSetSlotTime(dev, 1); - } - - if (pBssInfo->marvelAp == 1) - { - wd->sta.enableDrvBA = 0; - /* - * 8701 : NetGear 3500 (MARVELL) - * Downlink issue : set slottime to 20. - */ - zfHpSetSlotTimeRegister(dev, 0); - } - else - { - wd->sta.enableDrvBA = 1; - - /* - * This is not good for here do reset slot time. - * I think it should reset when leave MARVELL ap - * or enter disconnect state etc. - */ - zfHpSetSlotTimeRegister(dev, 1); - } - - //Store probe response frame body, for VISTA only - wd->sta.beaconFrameBodySize = pBssInfo->frameBodysize + 12; - if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE) - { - wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE; - } - for (k=0; k<8; k++) - { - wd->sta.beaconFrameBody[k] = pBssInfo->timeStamp[k]; - } - wd->sta.beaconFrameBody[8] = pBssInfo->beaconInterval[0]; - wd->sta.beaconFrameBody[9] = pBssInfo->beaconInterval[1]; - wd->sta.beaconFrameBody[10] = pBssInfo->capability[0]; - wd->sta.beaconFrameBody[11] = pBssInfo->capability[1]; - for (k=0; k<(wd->sta.beaconFrameBodySize - 12); k++) - { - wd->sta.beaconFrameBody[k+12] = pBssInfo->frameBody[k]; - } - - if ( ( pBssInfo->capability[0] & ZM_BIT_4 )&& - (( wd->sta.authMode == ZM_AUTH_MODE_OPEN )|| - ( wd->sta.authMode == ZM_AUTH_MODE_SHARED_KEY)|| - (wd->sta.authMode == ZM_AUTH_MODE_AUTO)) ) - { /* privacy enabled */ - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED ) - { - zm_debug_msg0("Adapter is no WEP, try to connect to WEP AP"); - ret = FALSE; - } - - /* Do not support WEP in 11n mode */ - if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED ) - { - /* Turn on software encryption/decryption for WEP */ - if (wd->sta.EnableHT == 1) - { - zfStaEnableSWEncryption(dev, (ZM_SW_WEP_ENCRY_EN|ZM_SW_WEP_DECRY_EN)); - } - - //wd->sta.EnableHT = 0; - //wd->BandWidth40 = 0; - //wd->ExtOffset = 0; - } - - wd->sta.capability[0] |= ZM_BIT_4; - - if ( wd->sta.authMode == ZM_AUTH_MODE_AUTO ) - { /* Try to use open and shared-key authehtication alternatively */ - if ( (wd->sta.connectTimeoutCount % 2) == 0 ) - wd->sta.bIsSharedKey = 0; - else - wd->sta.bIsSharedKey = 1; - } - else if ( wd->sta.authMode != ZM_AUTH_MODE_SHARED_KEY ) - { /* open or auto */ - //zfStaStartConnect(dev, 0); - wd->sta.bIsSharedKey = 0; - } - else if ( wd->sta.authMode != ZM_AUTH_MODE_OPEN ) - { /* shared key */ - //zfStaStartConnect(dev, 1) ; - wd->sta.bIsSharedKey = 1; - } - } - else - { - if ( (pBssInfo->securityType == ZM_SECURITY_TYPE_WPA)|| - (pBssInfo->capability[0] & ZM_BIT_4) ) - { - wd->sta.capability[0] |= ZM_BIT_4; - /* initialize WPA related parameters */ - } - else - { - wd->sta.capability[0] &= (~ZM_BIT_4); - } - - /* authentication with open system */ - //zfStaStartConnect(dev, 0); - wd->sta.bIsSharedKey = 0; - } - - /* Improve WEP/TKIP performance with HT AP, detail information please look bug#32495 */ - /* - if ( (pBssInfo->broadcomHTAp == 1) - && (wd->sta.SWEncryptEnable != 0) ) - { - zfHpSetTTSIFSTime(dev, 0xa); - } - else - { - zfHpSetTTSIFSTime(dev, 0x8); - } - */ - } - else - { - zm_debug_msg0("Desired SSID not found"); - goto zlConnectFailed; - } - - - zfCoreSetFrequencyV2(dev, wd->frequency, zfStaStartConnectCb); - return; - -zlConnectFailed: - zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND, wd->sta.bssid, 0); - return; -} - -u8_t zfCheckWPAAuth(zdev_t* dev, struct zsBssInfo* pBssInfo) -{ - u8_t ret=TRUE; - u8_t pmkCount; - u8_t i; - u16_t encAlgoType = 0; - - zmw_get_wlan_dev(dev); - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_TKIP ) - { - encAlgoType = ZM_TKIP; - } - else if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES ) - { - encAlgoType = ZM_AES; - } - - switch(wd->sta.authMode) - { - case ZM_AUTH_MODE_WPA: - case ZM_AUTH_MODE_WPAPSK: - if ( pBssInfo->wpaIe[1] == 0 ) - { - ret = FALSE; - break; - } - - pmkCount = pBssInfo->wpaIe[12]; - for(i=0; i < pmkCount; i++) - { - if ( pBssInfo->wpaIe[17 + 4*i] == encAlgoType ) - { - ret = TRUE; - goto done; - } - } - - ret = FALSE; - break; - - case ZM_AUTH_MODE_WPA2: - case ZM_AUTH_MODE_WPA2PSK: - if ( pBssInfo->rsnIe[1] == 0 ) - { - ret = FALSE; - break; - } - - pmkCount = pBssInfo->rsnIe[8]; - for(i=0; i < pmkCount; i++) - { - if ( pBssInfo->rsnIe[13 + 4*i] == encAlgoType ) - { - ret = TRUE; - goto done; - } - } - - ret = FALSE; - break; - } - -done: - return ret; -} - -u8_t zfCheckAuthentication(zdev_t* dev, struct zsBssInfo* pBssInfo) -{ - u8_t ret=TRUE; - u16_t encAlgoType; - u16_t UnicastCipherNum; - - zmw_get_wlan_dev(dev); - - /* Connecting to ANY has been checked */ - if ( wd->sta.ssidLen == 0 ) - { - return ret; - } - - - switch(wd->sta.authMode) - //switch(wd->ws.authMode)//Quickly reboot - { - case ZM_AUTH_MODE_WPA_AUTO: - case ZM_AUTH_MODE_WPAPSK_AUTO: - encAlgoType = 0; - if(pBssInfo->rsnIe[1] != 0) - { - UnicastCipherNum = (pBssInfo->rsnIe[8]) + - (pBssInfo->rsnIe[9] << 8); - - /* If there is only one unicast cipher */ - if (UnicastCipherNum == 1) - { - encAlgoType = pBssInfo->rsnIe[13]; - //encAlgoType = pBssInfo->rsnIe[7]; - } - else - { - u16_t ii; - u16_t desiredCipher = 0; - u16_t IEOffSet = 13; - - /* Enumerate all the supported unicast cipher */ - for (ii = 0; ii < UnicastCipherNum; ii++) - { - if (pBssInfo->rsnIe[IEOffSet+ii*4] > desiredCipher) - { - desiredCipher = pBssInfo->rsnIe[IEOffSet+ii*4]; - } - } - - encAlgoType = desiredCipher; - } - - if ( encAlgoType == 0x02 ) - { - wd->sta.wepStatus = ZM_ENCRYPTION_TKIP; - - if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO ) - { - wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2; - } - else //ZM_AUTH_MODE_WPAPSK_AUTO - { - wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2PSK; - } - } - else if ( encAlgoType == 0x04 ) - { - wd->sta.wepStatus = ZM_ENCRYPTION_AES; - - if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO ) - { - wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2; - } - else //ZM_AUTH_MODE_WPAPSK_AUTO - { - wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2PSK; - } - } - else - { - ret = FALSE; - } - } - else if(pBssInfo->wpaIe[1] != 0) - { - UnicastCipherNum = (pBssInfo->wpaIe[12]) + - (pBssInfo->wpaIe[13] << 8); - - /* If there is only one unicast cipher */ - if (UnicastCipherNum == 1) - { - encAlgoType = pBssInfo->wpaIe[17]; - //encAlgoType = pBssInfo->wpaIe[11]; - } - else - { - u16_t ii; - u16_t desiredCipher = 0; - u16_t IEOffSet = 17; - - /* Enumerate all the supported unicast cipher */ - for (ii = 0; ii < UnicastCipherNum; ii++) - { - if (pBssInfo->wpaIe[IEOffSet+ii*4] > desiredCipher) - { - desiredCipher = pBssInfo->wpaIe[IEOffSet+ii*4]; - } - } - - encAlgoType = desiredCipher; - } - - if ( encAlgoType == 0x02 ) - { - wd->sta.wepStatus = ZM_ENCRYPTION_TKIP; - - if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO ) - { - wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA; - } - else //ZM_AUTH_MODE_WPAPSK_AUTO - { - wd->sta.currentAuthMode = ZM_AUTH_MODE_WPAPSK; - } - } - else if ( encAlgoType == 0x04 ) - { - wd->sta.wepStatus = ZM_ENCRYPTION_AES; - - if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO ) - { - wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA; - } - else //ZM_AUTH_MODE_WPAPSK_AUTO - { - wd->sta.currentAuthMode = ZM_AUTH_MODE_WPAPSK; - } - } - else - { - ret = FALSE; - } - - - } - else - { - ret = FALSE; - } - - break; - - case ZM_AUTH_MODE_WPA: - case ZM_AUTH_MODE_WPAPSK: - case ZM_AUTH_MODE_WPA_NONE: - case ZM_AUTH_MODE_WPA2: - case ZM_AUTH_MODE_WPA2PSK: - { - if ( pBssInfo->securityType != ZM_SECURITY_TYPE_WPA ) - { - ret = FALSE; - } - - ret = zfCheckWPAAuth(dev, pBssInfo); - } - break; - - case ZM_AUTH_MODE_OPEN: - case ZM_AUTH_MODE_SHARED_KEY: - case ZM_AUTH_MODE_AUTO: - { - if ( pBssInfo->wscIe[1] ) - { - // If the AP is a Jumpstart AP, it's ok!! Ray - break; - } - else if ( pBssInfo->securityType == ZM_SECURITY_TYPE_WPA ) - { - ret = FALSE; - } - } - break; - - default: - break; - } - - return ret; -} - -u8_t zfStaIsConnected(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - if ( wd->sta.adapterState == ZM_STA_STATE_CONNECTED ) - { - return TRUE; - } - - return FALSE; -} - -u8_t zfStaIsConnecting(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - if ( wd->sta.adapterState == ZM_STA_STATE_CONNECTING ) - { - return TRUE; - } - - return FALSE; -} - -u8_t zfStaIsDisconnect(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - if ( wd->sta.adapterState == ZM_STA_STATE_DISCONNECT ) - { - return TRUE; - } - - return FALSE; -} - -u8_t zfChangeAdapterState(zdev_t* dev, u8_t newState) -{ - u8_t ret = TRUE; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - //if ( newState == wd->sta.adapterState ) - //{ - // return FALSE; - //} - - switch(newState) - { - case ZM_STA_STATE_DISCONNECT: - zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT); - - #if 1 - zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL); - #else - if ( wd->sta.bChannelScan ) - { - /* stop the action of channel scanning */ - wd->sta.bChannelScan = FALSE; - ret = TRUE; - break; - } - #endif - - break; - case ZM_STA_STATE_CONNECTING: - #if 1 - zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL); - #else - if ( wd->sta.bChannelScan ) - { - /* stop the action of channel scanning */ - wd->sta.bChannelScan = FALSE; - ret = TRUE; - break; - } - #endif - - break; - case ZM_STA_STATE_CONNECTED: - break; - default: - break; - } - - //if ( ret ) - //{ - zmw_enter_critical_section(dev); - wd->sta.adapterState = newState; - zmw_leave_critical_section(dev); - - zm_debug_msg1("change adapter state = ", newState); - //} - - return ret; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaMmAddIeSsid */ -/* Add information element SSID to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Ji-Huang Lee ZyDAS Technology Corporation 2005.11 */ -/* */ -/************************************************************************/ -u16_t zfStaAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - u16_t i; - - zmw_get_wlan_dev(dev); - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ssidLen); - - /* Information : SSID */ - for (i=0; ista.ssidLen; i++) - { - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ssid[i]); - } - - return offset; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaMmAddIeWpa */ -/* Add information element SSID to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Ji-Huang Lee ZyDAS Technology Corporation 2006.01 */ -/* */ -/************************************************************************/ -u16_t zfStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType) -{ - u32_t i; - u8_t ssn[64]={ - /* Element ID */ - 0xdd, - /* Length */ - 0x18, - /* OUI type */ - 0x00, 0x50, 0xf2, 0x01, - /* Version */ - 0x01, 0x00, - /* Group Cipher Suite, default=TKIP */ - 0x00, 0x50, 0xf2, 0x02, - /* Pairwise Cipher Suite Count */ - 0x01, 0x00, - /* Pairwise Cipher Suite, default=TKIP */ - 0x00, 0x50, 0xf2, 0x02, - /* Authentication and Key Management Suite Count */ - 0x01, 0x00, - /* Authentication type, default=PSK */ - 0x00, 0x50, 0xf2, 0x02, - /* WPA capability */ - 0x00, 0x00 - }; - - u8_t rsn[64]={ - /* Element ID */ - 0x30, - /* Length */ - 0x14, - /* Version */ - 0x01, 0x00, - /* Group Cipher Suite, default=TKIP */ - 0x00, 0x0f, 0xac, 0x02, - /* Pairwise Cipher Suite Count */ - 0x01, 0x00, - /* Pairwise Cipher Suite, default=TKIP */ - 0x00, 0x0f, 0xac, 0x02, - /* Authentication and Key Management Suite Count */ - 0x01, 0x00, - /* Authentication type, default=PSK */ - 0x00, 0x0f, 0xac, 0x02, - /* RSN capability */ - 0x00, 0x00 - }; - - zmw_get_wlan_dev(dev); - - if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPAPSK ) - { - /* Overwrite Group Cipher Suite by AP's setting */ - zfMemoryCopy(ssn+8, wd->sta.wpaIe+8, 4); - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES ) - { - /* Overwrite Pairwise Cipher Suite by AES */ - zfMemoryCopy(ssn+14, zgWpaAesOui, 4); - } - - zfCopyToIntTxBuffer(dev, buf, ssn, offset, ssn[1]+2); - zfMemoryCopy(wd->sta.wpaIe, ssn, ssn[1]+2); - offset += (ssn[1]+2); - } - else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA ) - { - /* Overwrite Group Cipher Suite by AP's setting */ - zfMemoryCopy(ssn+8, wd->sta.wpaIe+8, 4); - /* Overwrite Key Management Suite by WPA-Radius */ - zfMemoryCopy(ssn+20, zgWpaRadiusOui, 4); - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES ) - { - /* Overwrite Pairwise Cipher Suite by AES */ - zfMemoryCopy(ssn+14, zgWpaAesOui, 4); - } - - zfCopyToIntTxBuffer(dev, buf, ssn, offset, ssn[1]+2); - zfMemoryCopy(wd->sta.wpaIe, ssn, ssn[1]+2); - offset += (ssn[1]+2); - } - else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA2PSK ) - { - /* Overwrite Group Cipher Suite by AP's setting */ - zfMemoryCopy(rsn+4, wd->sta.rsnIe+4, 4); - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES ) - { - /* Overwrite Pairwise Cipher Suite by AES */ - zfMemoryCopy(rsn+10, zgWpa2AesOui, 4); - } - - if ( frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ ) - { - for(i=0; ista.pmkidInfo.bssidCount; i++) - { - if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid, - (u8_t*) wd->sta.bssid, 6) ) - { - /* matched */ - break; - } - - if ( i < wd->sta.pmkidInfo.bssidCount ) - { - // Fill PMKID Count in RSN information element - rsn[22] = 0x01; - rsn[23] = 0x00; - - // Fill PMKID in RSN information element - zfMemoryCopy(rsn+24, - wd->sta.pmkidInfo.bssidInfo[i].pmkid, 16); - rsn[1] += 18; - } - } - } - - zfCopyToIntTxBuffer(dev, buf, rsn, offset, rsn[1]+2); - zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2); - offset += (rsn[1]+2); - } - else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA2 ) - { - /* Overwrite Group Cipher Suite by AP's setting */ - zfMemoryCopy(rsn+4, wd->sta.rsnIe+4, 4); - /* Overwrite Key Management Suite by WPA2-Radius */ - zfMemoryCopy(rsn+16, zgWpa2RadiusOui, 4); - - if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES ) - { - /* Overwrite Pairwise Cipher Suite by AES */ - zfMemoryCopy(rsn+10, zgWpa2AesOui, 4); - } - - if (( frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ || ( frameType == ZM_WLAN_FRAME_TYPE_ASOCREQ ))) - { - - if (wd->sta.pmkidInfo.bssidCount != 0) { - // Fill PMKID Count in RSN information element - rsn[22] = 1; - rsn[23] = 0; - /* - * The caller is respnsible to give us the relevant PMKID. - * We'll only accept 1 PMKID for now. - */ - for(i=0; ista.pmkidInfo.bssidCount; i++) - { - if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid, (u8_t*) wd->sta.bssid, 6) ) - { - zfMemoryCopy(rsn+24, wd->sta.pmkidInfo.bssidInfo[i].pmkid, 16); - break; - } - } - rsn[1] += 18; - } - - } - - zfCopyToIntTxBuffer(dev, buf, rsn, offset, rsn[1]+2); - zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2); - offset += (rsn[1]+2); - } - - return offset; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaAddIeIbss */ -/* Add information element IBSS parameter to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Ji-Huang Lee ZyDAS Technology Corporation 2005.12 */ -/* */ -/************************************************************************/ -u16_t zfStaAddIeIbss(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - zmw_get_wlan_dev(dev); - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_IBSS); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, 2); - - /* ATIM window */ - zmw_tx_buf_writeh(dev, buf, offset, wd->sta.atimWindow); - offset += 2; - - return offset; -} - - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaAddIeWmeInfo */ -/* Add WME Information Element to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.6 */ -/* */ -/************************************************************************/ -u16_t zfStaAddIeWmeInfo(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t qosInfo) -{ - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WIFI_IE); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, 7); - - /* OUI */ - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - zmw_tx_buf_writeb(dev, buf, offset++, 0x50); - zmw_tx_buf_writeb(dev, buf, offset++, 0xF2); - zmw_tx_buf_writeb(dev, buf, offset++, 0x02); - zmw_tx_buf_writeb(dev, buf, offset++, 0x00); - zmw_tx_buf_writeb(dev, buf, offset++, 0x01); - - /* QoS Info */ - zmw_tx_buf_writeb(dev, buf, offset++, qosInfo); - - return offset; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaAddIePowerCap */ -/* Add information element Power capability to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Sharon 2007.12 */ -/* */ -/************************************************************************/ -u16_t zfStaAddIePowerCap(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - u8_t MaxTxPower; - u8_t MinTxPower; - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_POWER_CAPABILITY); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, 2); - - MinTxPower = (u8_t)(zfHpGetMinTxPower(dev)/2); - MaxTxPower = (u8_t)(zfHpGetMaxTxPower(dev)/2); - - /* Min Transmit Power Cap */ - zmw_tx_buf_writeh(dev, buf, offset++, MinTxPower); - - /* Max Transmit Power Cap */ - zmw_tx_buf_writeh(dev, buf, offset++, MaxTxPower); - - return offset; -} -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfStaAddIeSupportCh */ -/* Add information element supported channels to buffer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer to add information element */ -/* offset : add information element from this offset */ -/* */ -/* OUTPUTS */ -/* buffer offset after adding information element */ -/* */ -/* AUTHOR */ -/* Sharon 2007.12 */ -/* */ -/************************************************************************/ -u16_t zfStaAddIeSupportCh(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - - u8_t i; - u16_t count_24G = 0; - u16_t count_5G = 0; - u16_t channelNum; - u8_t length; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - zmw_enter_critical_section(dev); - - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) - { - if (wd->regulationTable.allowChannel[i].channel < 3000) - { // 2.4Hz - count_24G++; - } - else - { // 5GHz - count_5G++; - } - } - - length = (u8_t)(count_5G * 2 + 2); //5G fill by pair, 2,4G (continuous channels) fill 2 bytes - - /* Element ID */ - zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SUPPORTED_CHANNELS ); - - /* Element Length */ - zmw_tx_buf_writeb(dev, buf, offset++, length); - - // 2.4GHz (continuous channels) - /* First channel number */ - zmw_tx_buf_writeh(dev, buf, offset++, 1); //Start from channle 1 - /* Number of channels */ - zmw_tx_buf_writeh(dev, buf, offset++, count_24G); - - for (i = 0; i < wd->regulationTable.allowChannelCnt ; i++) - { - if (wd->regulationTable.allowChannel[i].channel > 4000 && wd->regulationTable.allowChannel[i].channel < 5000) - { // 5GHz 4000 -5000Mhz - channelNum = (wd->regulationTable.allowChannel[i].channel-4000)/5; - /* First channel number */ - zmw_tx_buf_writeh(dev, buf, offset++, channelNum); - /* Number of channels */ - zmw_tx_buf_writeh(dev, buf, offset++, 1); - } - else if (wd->regulationTable.allowChannel[i].channel >= 5000) - { // 5GHz >5000Mhz - channelNum = (wd->regulationTable.allowChannel[i].channel-5000)/5; - /* First channel number */ - zmw_tx_buf_writeh(dev, buf, offset++, channelNum); - /* Number of channels */ - zmw_tx_buf_writeh(dev, buf, offset++, 1); - } - } - zmw_leave_critical_section(dev); - - return offset; -} - -void zfStaStartConnectCb(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - zfStaStartConnect(dev, wd->sta.bIsSharedKey); -} - -void zfStaStartConnect(zdev_t* dev, u8_t bIsSharedKey) -{ - u32_t p1, p2; - u8_t newConnState; - - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - /* p1_low = algorithm number, p1_high = transaction sequence number */ - if ( bIsSharedKey ) - { - //wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_SHARE_1; - newConnState = ZM_STA_CONN_STATE_AUTH_SHARE_1; - zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_SHARE_1"); - p1 = ZM_AUTH_ALGO_SHARED_KEY; - } - else - { - //wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_OPEN; - newConnState = ZM_STA_CONN_STATE_AUTH_OPEN; - zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_OPEN"); - if( wd->sta.leapEnabled ) - p1 = ZM_AUTH_ALGO_LEAP; - else - p1 = ZM_AUTH_ALGO_OPEN_SYSTEM; - } - - /* status code */ - p2 = 0x0; - - zmw_enter_critical_section(dev); - wd->sta.connectTimer = wd->tick; - wd->sta.connectState = newConnState; - zmw_leave_critical_section(dev); - - /* send the 1st authentication frame */ - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH, wd->sta.bssid, p1, p2, 0); - - return; -} - -void zfSendNullData(zdev_t* dev, u8_t type) -{ - zbuf_t* buf; - //u16_t addrTblSize; - //struct zsAddrTbl addrTbl; - u16_t err; - u16_t hlen; - u16_t header[(34+8+1)/2]; - u16_t bcastAddr[3] = {0xffff,0xffff,0xffff}; - u16_t *dstAddr; - - zmw_get_wlan_dev(dev); - - buf = zfwBufAllocate(dev, 1024); - if (buf == NULL) - { - zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!"); - return; - } - - zfwBufSetSize(dev, buf, 0); - - //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len); - - if ( wd->wlanMode == ZM_MODE_IBSS) - { - dstAddr = bcastAddr; - } - else - { - dstAddr = wd->sta.bssid; - } - - if (wd->sta.wmeConnected != 0) - { - /* If connect to a WMM AP, Send QoS Null data */ - hlen = zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_QOS_NULL, dstAddr, header, 0, buf, 0, 0); - } - else - { - hlen = zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_NULL, dstAddr, header, 0, buf, 0, 0); - } - - if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) - { - header[4] |= 0x0100; //TODS bit - } - - if ( type == 1 ) - { - header[4] |= 0x1000; - } - - /* Get buffer DMA address */ - //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0) - //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0) - //{ - // goto zlError; - //} - - /*increase unicast frame counter*/ - wd->commTally.txUnicastFrm++; - - err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0, - ZM_INTERNAL_ALLOC_BUF, 0, 0xff); - if (err != ZM_SUCCESS) - { - goto zlError; - } - - - return; - -zlError: - - zfwBufFree(dev, buf, 0); - return; - -} - -void zfSendPSPoll(zdev_t* dev) -{ - zbuf_t* buf; - //u16_t addrTblSize; - //struct zsAddrTbl addrTbl; - u16_t err; - u16_t hlen; - u16_t header[(8+24+1)/2]; - - zmw_get_wlan_dev(dev); - - buf = zfwBufAllocate(dev, 1024); - if (buf == NULL) - { - zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!"); - return; - } - - zfwBufSetSize(dev, buf, 0); - - //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len); - - zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_PSPOLL, wd->sta.bssid, header, 0, buf, 0, 0); - - header[0] = 20; - header[4] |= 0x1000; - header[5] = wd->sta.aid | 0xc000; //Both bit-14 and bit-15 are 1 - hlen = 16 + 8; - - /* Get buffer DMA address */ - //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0) - //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0) - //{ - // goto zlError; - //} - - err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0, - ZM_INTERNAL_ALLOC_BUF, 0, 0xff); - if (err != ZM_SUCCESS) - { - goto zlError; - } - - return; - -zlError: - - zfwBufFree(dev, buf, 0); - return; - -} - -void zfSendBA(zdev_t* dev, u16_t start_seq, u8_t *bitmap) -{ - zbuf_t* buf; - //u16_t addrTblSize; - //struct zsAddrTbl addrTbl; - u16_t err; - u16_t hlen; - u16_t header[(8+24+1)/2]; - u16_t i, offset = 0; - - zmw_get_wlan_dev(dev); - - buf = zfwBufAllocate(dev, 1024); - if (buf == NULL) - { - zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!"); - return; - } - - zfwBufSetSize(dev, buf, 12); // 28 = FC 2 + DU 2 + RA 6 + TA 6 + BAC 2 + SEQ 2 + BitMap 8 - // 12 = BAC 2 + SEQ 2 + BitMap 8 - - //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len); - - zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_BA, wd->sta.bssid, header, 0, buf, 0, 0); - - header[0] = 32; /* MAC header 16 + BA control 2 + BA info 10 + FCS 4*/ - header[1] = 0x4; /* No ACK */ - - /* send by OFDM 6M */ - header[2] = (u16_t)(zcRateToPhyCtrl[4] & 0xffff); - header[3] = (u16_t)(zcRateToPhyCtrl[4]>>16) & 0xffff; - - hlen = 16 + 8; /* MAC header 16 + control 8*/ - offset = 0; - zmw_tx_buf_writeh(dev, buf, offset, 0x05); /*compressed bitmap on*/ - offset+=2; - zmw_tx_buf_writeh(dev, buf, offset, start_seq); - offset+=2; - - for (i=0; i<8; i++) { - zmw_tx_buf_writeb(dev, buf, offset, bitmap[i]); - offset++; - } - - err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0, - ZM_INTERNAL_ALLOC_BUF, 0, 0xff); - if (err != ZM_SUCCESS) - { - goto zlError; - } - - return; - -zlError: - - zfwBufFree(dev, buf, 0); - return; - -} - -void zfStaGetTxRate(zdev_t* dev, u16_t* macAddr, u32_t* phyCtrl, - u16_t* rcProbingFlag) -{ - u8_t addr[6], i; - u8_t rate; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - ZM_MAC_WORD_TO_BYTE(macAddr, addr); - *phyCtrl = 0; - - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - zmw_enter_critical_section(dev); - rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[0].rcCell, rcProbingFlag); -//#ifdef ZM_FB50 - //rate = 27; -//#endif - *phyCtrl = zcRateToPhyCtrl[rate]; - zmw_leave_critical_section(dev); - } - else - { - zmw_enter_critical_section(dev); - for(i=0; ista.oppositeCount; i++) - { - if ( addr[0] && 0x01 == 1 ) // The default beacon transmitted rate is CCK and 1 Mbps , but the a mode should use - // OFDM modulation and 6Mbps to transmit beacon. - { - //rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[i].rcCell, rcProbingFlag); - rate = wd->sta.oppositeInfo[i].rcCell.operationRateSet[0]; - *phyCtrl = zcRateToPhyCtrl[rate]; - break; - } - else if ( zfMemoryIsEqual(addr, wd->sta.oppositeInfo[i].macAddr, 6) ) - { - rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[i].rcCell, rcProbingFlag); - *phyCtrl = zcRateToPhyCtrl[rate]; - break; - } - } - zmw_leave_critical_section(dev); - } - - return; -} - -struct zsMicVar* zfStaGetRxMicKey(zdev_t* dev, zbuf_t* buf) -{ - u8_t keyIndex; - u8_t da0; - - zmw_get_wlan_dev(dev); - - /* if need not check MIC, return NULL */ - if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))|| - (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) ) - { - return NULL; - } - - da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET); - - if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) == 0x80) - keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+5); /* Qos Packet*/ - else - keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+3); /* normal Packet*/ - keyIndex = (keyIndex & 0xc0) >> 6; - - return (&wd->sta.rxMicKey[keyIndex]); -} - -struct zsMicVar* zfStaGetTxMicKey(zdev_t* dev, zbuf_t* buf) -{ - zmw_get_wlan_dev(dev); - - /* if need not check MIC, return NULL */ - //if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))|| - // (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) ) - if ( (wd->sta.encryMode != ZM_TKIP) || (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) ) - { - return NULL; - } - - return (&wd->sta.txMicKey); -} - -u16_t zfStaRxValidateFrame(zdev_t* dev, zbuf_t* buf) -{ - u8_t frameType, frameCtrl; - u8_t da0; - //u16_t sa[3]; - u16_t ret; - //u8_t sa0; - - zmw_get_wlan_dev(dev); - - frameType = zmw_rx_buf_readb(dev, buf, 0); - da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET); - //sa0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET); - - if ( (!zfStaIsConnected(dev))&&((frameType & 0xf) == ZM_WLAN_DATA_FRAME) ) - { - return ZM_ERR_DATA_BEFORE_CONNECTED; - } - - - if ( (zfStaIsConnected(dev))&&((frameType & 0xf) == ZM_WLAN_DATA_FRAME) ) - { - /* check BSSID */ - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - /* Big Endian and Little Endian Compatibility */ - u16_t mac[3]; - mac[0] = zmw_cpu_to_le16(wd->sta.bssid[0]); - mac[1] = zmw_cpu_to_le16(wd->sta.bssid[1]); - mac[2] = zmw_cpu_to_le16(wd->sta.bssid[2]); - if ( !zfRxBufferEqualToStr(dev, buf, (u8_t *)mac, - ZM_WLAN_HEADER_A2_OFFSET, 6) ) - { -/*We will get lots of garbage data, especially in AES mode.*/ -/*To avoid sending too many deauthentication frames in STA mode, mark it.*/ -#if 0 - /* If unicast frame, send deauth to the transmitter */ - if (( da0 & 0x01 ) == 0) - { - for (i=0; i<3; i++) - { - sa[i] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+(i*2)); - } - /* If mutilcast address, don't send deauthentication*/ - if (( sa0 & 0x01 ) == 0) - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, sa, 7, 0, 0); - } -#endif - return ZM_ERR_DATA_BSSID_NOT_MATCHED; - } - } - else if ( wd->wlanMode == ZM_MODE_IBSS ) - { - /* Big Endian and Little Endian Compatibility */ - u16_t mac[3]; - mac[0] = zmw_cpu_to_le16(wd->sta.bssid[0]); - mac[1] = zmw_cpu_to_le16(wd->sta.bssid[1]); - mac[2] = zmw_cpu_to_le16(wd->sta.bssid[2]); - if ( !zfRxBufferEqualToStr(dev, buf, (u8_t *)mac, - ZM_WLAN_HEADER_A3_OFFSET, 6) ) - { - return ZM_ERR_DATA_BSSID_NOT_MATCHED; - } - } - - frameCtrl = zmw_rx_buf_readb(dev, buf, 1); - - /* check security bit */ - if ( wd->sta.dropUnencryptedPkts && - (wd->sta.wepStatus != ZM_ENCRYPTION_WEP_DISABLED )&& - ( !(frameCtrl & ZM_BIT_6) ) ) - { /* security on, but got data without encryption */ - - #if 1 - ret = ZM_ERR_DATA_NOT_ENCRYPTED; - if ( wd->sta.pStaRxSecurityCheckCb != NULL ) - { - ret = wd->sta.pStaRxSecurityCheckCb(dev, buf); - } - else - { - ret = ZM_ERR_DATA_NOT_ENCRYPTED; - } - if (ret == ZM_ERR_DATA_NOT_ENCRYPTED) - { - wd->commTally.swRxDropUnencryptedCount++; - } - return ret; - #else - if ( (wd->sta.wepStatus != ZM_ENCRYPTION_TKIP)&& - (wd->sta.wepStatus != ZM_ENCRYPTION_AES) ) - { - return ZM_ERR_DATA_NOT_ENCRYPTED; - } - #endif - } - } - - return ZM_SUCCESS; -} - -void zfStaMicFailureHandling(zdev_t* dev, zbuf_t* buf) -{ - u8_t da0; - u8_t micNotify = 1; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if ( wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK ) - { - return; - } - - zmw_enter_critical_section(dev); - - wd->sta.cmMicFailureCount++; - - if ( wd->sta.cmMicFailureCount == 1 ) - { - zm_debug_msg0("get the first MIC failure"); - //zfTimerSchedule(dev, ZM_EVENT_CM_TIMER, ZM_TICK_CM_TIMEOUT); - - /* Timer Resolution on WinXP is 15/16 ms */ - /* Decrease Time offset for Counter Measure */ - zfTimerSchedule(dev, ZM_EVENT_CM_TIMER, ZM_TICK_CM_TIMEOUT - ZM_TICK_CM_TIMEOUT_OFFSET); - } - else if ( wd->sta.cmMicFailureCount == 2 ) - { - zm_debug_msg0("get the second MIC failure"); - /* reserve 2 second for OS to send MIC failure report to AP */ - wd->sta.cmDisallowSsidLength = wd->sta.ssidLen; - zfMemoryCopy(wd->sta.cmDisallowSsid, wd->sta.ssid, wd->sta.ssidLen); - //wd->sta.cmMicFailureCount = 0; - zfTimerCancel(dev, ZM_EVENT_CM_TIMER); - //zfTimerSchedule(dev, ZM_EVENT_CM_DISCONNECT, ZM_TICK_CM_DISCONNECT); - - /* Timer Resolution on WinXP is 15/16 ms */ - /* Decrease Time offset for Counter Measure */ - zfTimerSchedule(dev, ZM_EVENT_CM_DISCONNECT, ZM_TICK_CM_DISCONNECT - ZM_TICK_CM_DISCONNECT_OFFSET); - } - else - { - micNotify = 0; - } - - zmw_leave_critical_section(dev); - - if (micNotify == 1) - { - da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET); - if ( da0 & 0x01 ) - { - if (wd->zfcbMicFailureNotify != NULL) - { - wd->zfcbMicFailureNotify(dev, wd->sta.bssid, ZM_MIC_GROUP_ERROR); - } - } - else - { - if (wd->zfcbMicFailureNotify != NULL) - { - wd->zfcbMicFailureNotify(dev, wd->sta.bssid, ZM_MIC_PAIRWISE_ERROR); - } - } - } -} - - -u8_t zfStaBlockWlanScan(zdev_t* dev) -{ - u8_t ret=FALSE; - - zmw_get_wlan_dev(dev); - - if ( wd->sta.bChannelScan ) - { - return TRUE; - } - - return ret; -} - -void zfStaResetStatus(zdev_t* dev, u8_t bInit) -{ - u8_t i; - - zmw_get_wlan_dev(dev); - - zfHpDisableBeacon(dev); - - wd->dtim = 1; - wd->sta.capability[0] = 0x01; - wd->sta.capability[1] = 0x00; - /* 802.11h */ - if (wd->sta.DFSEnable || wd->sta.TPCEnable) - wd->sta.capability[1] |= ZM_BIT_0; - - /* release queued packets */ - for(i=0; ista.ibssPSDataCount; i++) - { - zfwBufFree(dev, wd->sta.ibssPSDataQueue[i], 0); - } - - for(i=0; ista.staPSDataCount; i++) - { - zfwBufFree(dev, wd->sta.staPSDataQueue[i], 0); - } - - wd->sta.ibssPSDataCount = 0; - wd->sta.staPSDataCount = 0; - zfZeroMemory((u8_t*) &wd->sta.staPSList, sizeof(struct zsStaPSList)); - - wd->sta.wmeConnected = 0; - wd->sta.psMgr.tempWakeUp = 0; - wd->sta.qosInfo = 0; - zfQueueFlush(dev, wd->sta.uapsdQ); - - return; - -} - -void zfStaIbssMonitoring(zdev_t* dev, u8_t reset) -{ - u16_t i; - u16_t oppositeCount; - struct zsPartnerNotifyEvent event; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - //zm_debug_msg1("zfStaIbssMonitoring %d", wd->sta.oppositeCount); - - zmw_enter_critical_section(dev); - - if ( wd->sta.oppositeCount == 0 ) - { - goto done; - } - - if ( wd->sta.bChannelScan ) - { - goto done; - } - - oppositeCount = wd->sta.oppositeCount; - - for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++) - { - if ( oppositeCount == 0 ) - { - break; - } - - if ( reset ) - { - wd->sta.oppositeInfo[i].valid = 0; - } - - if ( wd->sta.oppositeInfo[i].valid == 0 ) - { - continue; - } - - oppositeCount--; - - if ( wd->sta.oppositeInfo[i].aliveCounter ) - { - zm_debug_msg1("Setting alive to ", wd->sta.oppositeInfo[i].aliveCounter); - - zmw_leave_critical_section(dev); - - if ( wd->sta.oppositeInfo[i].aliveCounter != ZM_IBSS_PEER_ALIVE_COUNTER ) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ, - (u16_t*)wd->sta.oppositeInfo[i].macAddr, 1, 0, 0); - } - - zmw_enter_critical_section(dev); - wd->sta.oppositeInfo[i].aliveCounter--; - } - else - { - zm_debug_msg0("zfStaIbssMonitoring remove the peer station"); - zfMemoryCopy(event.bssid, (u8_t *)(wd->sta.bssid), 6); - zfMemoryCopy(event.peerMacAddr, wd->sta.oppositeInfo[i].macAddr, 6); - - wd->sta.oppositeInfo[i].valid = 0; - wd->sta.oppositeCount--; - if (wd->zfcbIbssPartnerNotify != NULL) - { - zmw_leave_critical_section(dev); - wd->zfcbIbssPartnerNotify(dev, 0, &event); - zmw_enter_critical_section(dev); - } - } - } - -done: - if ( reset == 0 ) - { - zfTimerSchedule(dev, ZM_EVENT_IBSS_MONITOR, ZM_TICK_IBSS_MONITOR); - } - - zmw_leave_critical_section(dev); -} - -void zfInitPartnerNotifyEvent(zdev_t* dev, zbuf_t* buf, struct zsPartnerNotifyEvent *event) -{ - u16_t *peerMacAddr; - - zmw_get_wlan_dev(dev); - - peerMacAddr = (u16_t *)event->peerMacAddr; - - zfMemoryCopy(event->bssid, (u8_t *)(wd->sta.bssid), 6); - peerMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET); - peerMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET + 2); - peerMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET + 4); -} - -void zfStaInitOppositeInfo(zdev_t* dev) -{ - int i; - - zmw_get_wlan_dev(dev); - - for(i=0; ista.oppositeInfo[i].valid = 0; - wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER; - } -} -#ifdef ZM_ENABLE_CENC -u16_t zfStaAddIeCenc(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - zmw_get_wlan_dev(dev); - - if (wd->sta.cencIe[1] != 0) - { - zfCopyToIntTxBuffer(dev, buf, wd->sta.cencIe, offset, wd->sta.cencIe[1]+2); - offset += (wd->sta.cencIe[1]+2); - } - return offset; -} -#endif //ZM_ENABLE_CENC -u16_t zfStaProcessAction(zdev_t* dev, zbuf_t* buf) -{ - u8_t category, actionDetails; - zmw_get_wlan_dev(dev); - - category = zmw_rx_buf_readb(dev, buf, 24); - actionDetails = zmw_rx_buf_readb(dev, buf, 25); - switch (category) - { - case 0: //Spectrum Management - switch(actionDetails) - { - case 0: //Measurement Request - break; - case 1: //Measurement Report - //ProcessActionSpectrumFrame_MeasurementReport(Adapter,pActionBody+3); - break; - case 2: //TPC request - //if (wd->sta.TPCEnable) - // zfStaUpdateDot11HTPC(dev, buf); - break; - case 3: //TPC report - //if (wd->sta.TPCEnable) - // zfStaUpdateDot11HTPC(dev, buf); - break; - case 4: //Channel Switch Announcement - if (wd->sta.DFSEnable) - zfStaUpdateDot11HDFS(dev, buf); - break; - default: - zm_debug_msg1("Action Frame contain not support action field ", actionDetails); - break; - } - break; - case ZM_WLAN_BLOCK_ACK_ACTION_FRAME: - zfAggBlockAckActionFrame(dev, buf); - break; - case 17: //Qos Management - break; - } - - return 0; -} - -/* Determine the time not send beacon , if more than some value , - re-write the beacon start address */ -void zfReWriteBeaconStartAddress(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->tickIbssSendBeacon++; // Increase 1 per 10ms . - zmw_leave_critical_section(dev); - - if ( wd->tickIbssSendBeacon == 40 ) - { -// DbgPrint("20070727"); - zfHpEnableBeacon(dev, ZM_MODE_IBSS, wd->beaconInterval, wd->dtim, (u8_t)wd->sta.atimWindow); - zmw_enter_critical_section(dev); - wd->tickIbssSendBeacon = 0; - zmw_leave_critical_section(dev); - } -} - -struct zsTkipSeed* zfStaGetRxSeed(zdev_t* dev, zbuf_t* buf) -{ - u8_t keyIndex; - u8_t da0; - - zmw_get_wlan_dev(dev); - - /* if need not check MIC, return NULL */ - if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))|| - (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) ) - { - return NULL; - } - - da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET); - - if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) == 0x80) - keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+5); /* Qos Packet*/ - else - keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+3); /* normal Packet*/ - keyIndex = (keyIndex & 0xc0) >> 6; - - return (&wd->sta.rxSeed[keyIndex]); -} - -void zfStaEnableSWEncryption(zdev_t *dev, u8_t value) -{ - zmw_get_wlan_dev(dev); - - wd->sta.SWEncryptEnable = value; - zfHpSWDecrypt(dev, 1); - zfHpSWEncrypt(dev, 1); -} - -void zfStaDisableSWEncryption(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - wd->sta.SWEncryptEnable = 0; - zfHpSWDecrypt(dev, 0); - zfHpSWEncrypt(dev, 0); -} - -u16_t zfComputeBssInfoWeightValue(zdev_t *dev, u8_t isBMode, u8_t isHT, u8_t isHT40, u8_t signalStrength) -{ - u8_t weightOfB = 0; - u8_t weightOfAGBelowThr = 0; - u8_t weightOfAGUpThr = 15; - u8_t weightOfN20BelowThr = 15; - u8_t weightOfN20UpThr = 30; - u8_t weightOfN40BelowThr = 16; - u8_t weightOfN40UpThr = 32; - - if( isBMode == 0 ) - return (signalStrength + weightOfB); // pure b mode , do not add the weight value for this AP ! - else - { - if( isHT == 0 && isHT40 == 0 ) - { // a , g , b/g mode ! add the weight value 15 for this AP if it's signal strength is more than some value ! - if( signalStrength < 18 ) // -77 dBm - return signalStrength + weightOfAGBelowThr; - else - return (signalStrength + weightOfAGUpThr); - } - else if( isHT == 1 && isHT40 == 0 ) - { // 80211n mode use 20MHz - if( signalStrength < 23 ) // -72 dBm - return (signalStrength + weightOfN20BelowThr); - else - return (signalStrength + weightOfN20UpThr); - } - else // isHT == 1 && isHT40 == 1 - { // 80211n mode use 40MHz - if( signalStrength < 16 ) // -79 dBm - return (signalStrength + weightOfN40BelowThr); - else - return (signalStrength + weightOfN40UpThr); - } - } -} - -u16_t zfStaAddIbssAdditionalIE(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - u16_t i; - - zmw_get_wlan_dev(dev); - - for (i=0; ista.ibssAdditionalIESize; i++) - { - zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ibssAdditionalIE[i]); - } - - return offset; -} diff --git a/drivers/staging/otus/80211core/coid.c b/drivers/staging/otus/80211core/coid.c deleted file mode 100644 index 229aed8f889e..000000000000 --- a/drivers/staging/otus/80211core/coid.c +++ /dev/null @@ -1,2696 +0,0 @@ -/* - * 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 : iod.c */ -/* */ -/* Abstract */ -/* This module contains OID functions. */ -/* */ -/* NOTES */ -/* None */ -/* */ -/************************************************************************/ -#include "cprecomp.h" -#include "../hal/hpreg.h" - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiWlanQueryMacAddress */ -/* Query OWN MAC address. */ -/* */ -/* INPUTS */ -/* addr : for return MAC address */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr) -{ - u16_t vapId = 0; - zmw_get_wlan_dev(dev); - - vapId = zfwGetVapId(dev); - - addr[0] = (u8_t)(wd->macAddr[0] & 0xff); - addr[1] = (u8_t)(wd->macAddr[0] >> 8); - addr[2] = (u8_t)(wd->macAddr[1] & 0xff); - addr[3] = (u8_t)(wd->macAddr[1] >> 8); - addr[4] = (u8_t)(wd->macAddr[2] & 0xff); - if (vapId == 0xffff) - addr[5] = (u8_t)(wd->macAddr[2] >> 8); - else - { -#ifdef ZM_VAPMODE_MULTILE_SSID - addr[5] = (u8_t)(wd->macAddr[2] >> 8); // Multiple SSID -#else - addr[5] = vapId + 1 + (u8_t)(wd->macAddr[2] >> 8); //VAP -#endif - } - - return; -} - -void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList) -{ - struct zsBssInfo* pBssInfo; - struct zsBssInfo* pDstBssInfo; - u8_t i; - u8_t* pMemList; - u8_t* pMemInfo; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - pMemList = (u8_t*) pBssList; - pMemInfo = pMemList + sizeof(struct zsBssList); - pBssList->head = (struct zsBssInfo*) pMemInfo; - - zmw_enter_critical_section(dev); - - pBssInfo = wd->sta.bssList.head; - pDstBssInfo = (struct zsBssInfo*) pMemInfo; - pBssList->bssCount = wd->sta.bssList.bssCount; - - for( i=0; ista.bssList.bssCount; i++ ) - { - zfMemoryCopy((u8_t*)pDstBssInfo, (u8_t*)pBssInfo, - sizeof(struct zsBssInfo)); - - if ( pBssInfo->next != NULL ) - { - pBssInfo = pBssInfo->next; - pDstBssInfo->next = pDstBssInfo + 1; - pDstBssInfo++; - } - else - { - zm_assert(i==(wd->sta.bssList.bssCount-1)); - } - } - - zmw_leave_critical_section(dev); - - zfScanMgrScanAck(dev); -} - -void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1) -{ - struct zsBssInfo* pBssInfo; - //struct zsBssInfo* pDstBssInfo; - u8_t i, j, bdrop = 0, k = 0, Same_Count = 0; - u8_t bssid[6]; - //u8_t* pMemList; - //u8_t* pMemInfo; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - bssListV1->bssCount = wd->sta.bssList.bssCount; - - pBssInfo = wd->sta.bssList.head; - ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid); - - for( i=0; ista.bssList.bssCount; i++ ) - { - bdrop = 0; - if ( zfStaIsConnected(dev) - && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) ) - { - for (j = 0; j < 6; j++) - { - if ( pBssInfo->bssid[j] != bssid[j] ) - { - break; - } - } - - if ( (j == 6) - &&((pBssInfo->ssid[1] == wd->sta.ssidLen) || (pBssInfo->ssid[1] == 0) )&& (pBssInfo->frequency == wd->frequency) ) - { - if(pBssInfo->ssid[1] == 0) - pBssInfo->ssid[1] = wd->sta.ssidLen; - - if(Same_Count == 0) - {//First meet - Same_Count++; - } - else - {//same one - bdrop = 1; - bssListV1->bssCount--; - } - - } - } - - if (bdrop == 0) - { - zfMemoryCopy((u8_t*)(&bssListV1->bssInfo[k]), (u8_t*)pBssInfo, - sizeof(struct zsBssInfo)); - - if(Same_Count == 1) - { - zfMemoryCopy(&(bssListV1->bssInfo[k].ssid[2]), wd->sta.ssid, wd->sta.ssidLen); - Same_Count++; - } - - k++; - } - - if ( pBssInfo->next != NULL ) - { - pBssInfo = pBssInfo->next; - } - else - { - zm_assert(i==(wd->sta.bssList.bssCount-1)); - } - } - - zmw_leave_critical_section(dev); - - zfScanMgrScanAck(dev); -} - -void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo) -{ - zmw_get_wlan_dev(dev); - - zfMemoryCopy((u8_t *)pBssInfo, (u8_t *)&wd->sta.ibssBssDesc, sizeof(struct zsBssInfo)); -} - -u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->sta.ibssBssIsCreator; -} - -u32_t zfiWlanQuerySupportMode(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->supportMode; -} - -u32_t zfiWlanQueryTransmitPower(zdev_t* dev) -{ - u32_t ret = 0; - - zmw_get_wlan_dev(dev); - - if (zfStaIsConnected(dev)) { - ret = wd->sta.connPowerInHalfDbm; - } else { - ret = zfHpGetTransmitPower(dev); - } - - return ret; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiWlanFlushBssList */ -/* Flush BSSID List. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2006.12 */ -/* */ -/************************************************************************/ -void zfiWlanFlushBssList(zdev_t* dev) -{ - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - /* Call zfBssInfoRefresh() twice to remove all entry */ - zfBssInfoRefresh(dev, 1); - zmw_leave_critical_section(dev); -} - -void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->ws.wlanMode = wlanMode; - zmw_leave_critical_section(dev); -} - -void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->ws.authMode = authMode; - zmw_leave_critical_section(dev); -} - -void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->ws.wepStatus = wepStatus; - zmw_leave_critical_section(dev); - -} - -void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength) -{ - u16_t i; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if ( ssidLength <= 32 ) - { - zmw_enter_critical_section(dev); - - wd->ws.ssidLen = ssidLength; - zfMemoryCopy(wd->ws.ssid, ssid, ssidLength); - - if ( ssidLength < 32 ) - { - wd->ws.ssid[ssidLength] = 0; - } - - wd->ws.probingSsidList[0].ssidLen = ssidLength; - zfMemoryCopy(wd->ws.probingSsidList[0].ssid, ssid, ssidLength); - for (i=1; iws.probingSsidList[i].ssidLen = 0; - } - - zmw_leave_critical_section(dev); - } -} - -void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - if (fragThreshold == 0) - { /* fragmentation is disabled */ - wd->fragThreshold = 32767; - } - else if (fragThreshold < 256) - { - /* Minimum fragment threshold */ - wd->fragThreshold = 256; - } - else if (fragThreshold > 2346) - { - wd->fragThreshold = 2346; - } - else - { - wd->fragThreshold = fragThreshold & 0xfffe; - } - - zmw_leave_critical_section(dev); -} - -void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->rtsThreshold = rtsThreshold; - zmw_leave_critical_section(dev); -} - -void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if ( bImmediate ) - { - zmw_enter_critical_section(dev); - wd->frequency = (u16_t) (frequency/1000); - zmw_leave_critical_section(dev); - zfCoreSetFrequency(dev, wd->frequency); - } - else - { - zmw_enter_critical_section(dev); - if( frequency == 0 ) - { // Auto select clean channel depend on wireless environment ! - wd->ws.autoSetFrequency = 0; - } - wd->ws.frequency = (u16_t) (frequency/1000); - zmw_leave_critical_section(dev); - } -} - -void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid) -{ - u16_t i; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - for (i=0; i<6; i++) - { - wd->ws.desiredBssid[i] = bssid[i]; - } - wd->ws.bDesiredBssid = TRUE; - zmw_leave_critical_section(dev); - -} - -void zfiWlanSetBeaconInterval(zdev_t* dev, - u16_t beaconInterval, - u8_t bImmediate) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if ( bImmediate ) - { - zmw_enter_critical_section(dev); - wd->beaconInterval = beaconInterval; - zmw_leave_critical_section(dev); - - /* update beacon interval here */ - } - else - { - zmw_enter_critical_section(dev); - wd->ws.beaconInterval = beaconInterval; - zmw_leave_critical_section(dev); - } -} - - -void zfiWlanSetDtimCount(zdev_t* dev, u8_t dtim) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if (dtim > 0) - { - wd->ws.dtim = dtim; - } - zmw_leave_critical_section(dev); -} - - -void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if ( bImmediate ) - { - zmw_enter_critical_section(dev); - wd->sta.atimWindow = atimWindow; - zmw_leave_critical_section(dev); - - /* atim window here */ - } - else - { - zmw_enter_critical_section(dev); - wd->ws.atimWindow = atimWindow; - zmw_leave_critical_section(dev); - } -} - - -void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if (wd->wlanMode == ZM_MODE_AP) - { - /* Hostapd Issue */ - if ((wd->ws.encryMode != ZM_AES) && (wd->ws.encryMode != ZM_TKIP)) - wd->ws.encryMode = encryMode; - } - else - wd->ws.encryMode = encryMode; - zmw_leave_critical_section(dev); -} - -void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId) -{ - zmw_get_wlan_dev(dev); - - wd->sta.keyId = keyId; -} - -u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr) -{ - u8_t isInstalled = 0; - -#if 1 -//#ifdef ZM_ENABLE_IBSS_WPA2PSK - u8_t res, peerIdx; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - res = zfStaFindOppositeByMACAddr(dev, (u16_t *)staMacAddr, &peerIdx); - if( res == 0 ) - { - isInstalled = wd->sta.oppositeInfo[peerIdx].pkInstalled; - } - zmw_leave_critical_section(dev); -//#endif -#endif - - return isInstalled; -} - -u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo) -{ - u16_t broadcast[3] = {0xffff, 0xffff, 0xffff}; - u32_t* key; - u8_t encryMode = ZM_NO_WEP; -#ifdef ZM_ENABLE_IBSS_WPA2PSK - u8_t encryType = ZM_NO_WEP; -#endif - u8_t micKey[16]; - u16_t id = 0; - u8_t vapId, i, addr[6]; - u8_t userIdx=0; - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - /* Determine opposite exist or not */ - u8_t res, peerIdx; -// u8_t userIdx=0; - - zmw_get_wlan_dev(dev); - - if ( wd->sta.ibssWpa2Psk == 1 ) - { - zmw_enter_critical_section(dev); - res = zfStaFindOppositeByMACAddr(dev, (u16_t*)keyInfo.macAddr, &peerIdx); - if( res == 0 ) - { - userIdx = peerIdx; - if ( wd->sta.oppositeInfo[userIdx].camIdx == 0xff ) - wd->sta.oppositeInfo[userIdx].camIdx = userIdx; - } - zmw_leave_critical_section(dev); - } -#else - zmw_get_wlan_dev(dev); -#endif - - if ( keyInfo.flag & ZM_KEY_FLAG_AUTHENTICATOR ) - { /* set key by authenticator */ - /* set pairwise key */ - if (keyInfo.flag & ZM_KEY_FLAG_PK) - { - /* Find STA's information */ - id = zfApFindSta(dev, keyInfo.macAddr); - if (id == 0xffff) - { - /* Can't STA in the staTable */ - return ZM_STATUS_FAILURE; - } - - wd->ap.staTable[id].iv16 = 0; - wd->ap.staTable[id].iv32 = 0; - - if (keyInfo.keyLength == 32) - { /* TKIP */ - //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0}; - - /* In the current AP mode, we set KeyRsc to zero */ - //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr, - // &(wd->ap.staTable[id].txSeed), KeyRsc); - //zfTkipInit(keyInfo.key, (u8_t*) keyInfo.macAddr, - // &(wd->ap.staTable[id].rxSeed), KeyRsc); -#ifdef ZM_ENABLE_CENC - if (keyInfo.flag & ZM_KEY_FLAG_CENC) - { - zm_debug_msg0("Set CENC pairwise Key"); - - wd->ap.staTable[id].encryMode = ZM_CENC; - - /* Reset txiv and rxiv */ - wd->ap.staTable[id].txiv[0] = 0x5c365c37; - wd->ap.staTable[id].txiv[1] = 0x5c365c36; - wd->ap.staTable[id].txiv[2] = 0x5c365c36; - wd->ap.staTable[id].txiv[3] = 0x5c365c36; - - wd->ap.staTable[id].rxiv[0] = 0x5c365c36; - wd->ap.staTable[id].rxiv[1] = 0x5c365c36; - wd->ap.staTable[id].rxiv[2] = 0x5c365c36; - wd->ap.staTable[id].rxiv[3] = 0x5c365c36; - - /* Set Key Index */ - wd->ap.staTable[id].cencKeyIdx = keyInfo.keyIndex; - - //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr, - // (u32_t*) &keyInfo.key[16]); - } - else -#endif //ZM_ENABLE_CENC - { - wd->ap.staTable[id].encryMode = ZM_TKIP; - - zfMemoryCopy(micKey, &keyInfo.key[16], 8); - zfMemoryCopy(&micKey[8], &keyInfo.key[24], 8); - - //zfCoreSetKey(dev, id+1, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr, - // (u32_t*) micKey); - - /* For fragmentation, we use software MIC */ - zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].txMicKey), &(keyInfo.key[16]), 8); - zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].rxMicKey), &(keyInfo.key[24]), 8); - - } - } - else if (keyInfo.keyLength == 16) - { /* AES */ - wd->ap.staTable[id].encryMode = ZM_AES; - } - else if (keyInfo.keyLength == 0) - { - /* Clear Key Info */ - zfApClearStaKey(dev, (u16_t *)keyInfo.macAddr); - - return ZM_STATUS_SUCCESS; - } - else - { - return ZM_STATUS_FAILURE; - } - - //zfCoreSetKey(dev, id+1, 0, wd->ap.staTable[id].encryMode, - // (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key); - zfHpSetApPairwiseKey(dev, (u16_t *)keyInfo.macAddr, - wd->ap.staTable[id].encryMode, (u32_t*) keyInfo.key, - (u32_t*) &keyInfo.key[16], id+1); - wd->ap.staTable[id].keyIdx = id + 1 + 4; - } - else if (keyInfo.flag & ZM_KEY_FLAG_GK) - { - vapId = keyInfo.vapId; - - wd->ap.iv16[vapId] = 0; - wd->ap.iv32[vapId] = 0; - - if (keyInfo.keyLength == 32) - { /* TKIP */ - //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0}; - - //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr, - // &(wd->ap.bcSeed), KeyRsc); -#ifdef ZM_ENABLE_CENC - if (keyInfo.flag & ZM_KEY_FLAG_CENC) - { - encryMode = ZM_CENC; - zm_debug_msg0("Set CENC group Key"); - - /* Reset txiv and rxiv */ - wd->ap.txiv[vapId][0] = 0x5c365c36; - wd->ap.txiv[vapId][1] = 0x5c365c36; - wd->ap.txiv[vapId][2] = 0x5c365c36; - wd->ap.txiv[vapId][3] = 0x5c365c36; - - //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr, - // (u32_t*) &keyInfo.key[16]); - key = (u32_t*) keyInfo.key; - } - else -#endif //ZM_ENABLE_CENC - { - encryMode = ZM_TKIP; - key = (u32_t *)keyInfo.key; - - /* set MIC key to HMAC */ - //zfCoreSetKey(dev, 0, 1, ZM_TKIP, broadcast, - // (u32_t*) (&keyInfo.key[16])); - //zfCoreSetKey(dev, 0, 1, ZM_TKIP, keyInfo.vapAddr, - // (u32_t*) (&keyInfo.key[16])); - - zfMicSetKey(&(keyInfo.key[16]), &(wd->ap.bcMicKey[0])); - key = (u32_t*) keyInfo.key; - } - } - else if (keyInfo.keyLength == 16) - { /* AES */ - encryMode = ZM_AES; - key = (u32_t *)keyInfo.key; - zm_debug_msg0("CWY - Set AES Group Key"); - } - else if (keyInfo.keyLength == 0) - { - /* Clear Key Info */ - zfApClearStaKey(dev, broadcast); - - /* Turn off WEP bit in the capability field */ - wd->ap.capab[vapId] &= 0xffef; - - return ZM_STATUS_SUCCESS; - } - else - { /* WEP */ - if (keyInfo.keyLength == 5) - { - encryMode = ZM_WEP64; - } - else if (keyInfo.keyLength == 13) - { - encryMode = ZM_WEP128; - } - else if (keyInfo.keyLength == 29) - { - encryMode = ZM_WEP256; - } - - key = (u32_t*) keyInfo.key; - } - - // Modification for CAM not support VAP search - //zfCoreSetKey(dev, 0, 0, encryMode, broadcast, key); - //zfCoreSetKey(dev, 0, 0, encryMode, wd->macAddr, key); - //zfCoreSetKey(dev, 0, 0, encryMode, keyInfo.vapAddr, key); - zfHpSetApGroupKey(dev, wd->macAddr, encryMode, - key, (u32_t*) &keyInfo.key[16], vapId); - - //zfiWlanSetEncryMode(dev, encryMode); - wd->ws.encryMode = encryMode; - - /* set the multicast address encryption type */ - wd->ap.encryMode[vapId] = encryMode; - - /* set the multicast key index */ - wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex; - wd->ap.bcHalKeyIdx[vapId] = vapId + 60; - - /* Turn on WEP bit in the capability field */ - wd->ap.capab[vapId] |= 0x10; - } - } - else - { /* set by supplicant */ - - if ( keyInfo.flag & ZM_KEY_FLAG_PK ) - { /* set pairwise key */ - - //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr, - // &wd->sta.txSeed, keyInfo.initIv); - //zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid, - // &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv); - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - if ( wd->sta.ibssWpa2Psk == 1 ) - { - /* unicast -- > pairwise key */ - wd->sta.oppositeInfo[userIdx].iv16 = 0; - wd->sta.oppositeInfo[userIdx].iv32 = 0; - } - else - { - wd->sta.iv16 = 0; - wd->sta.iv32 = 0; - } - - wd->sta.oppositeInfo[userIdx].pkInstalled = 1; -#else - wd->sta.iv16 = 0; - wd->sta.iv32 = 0; - - wd->sta.oppositeInfo[userIdx].pkInstalled = 1; -#endif - - if ( keyInfo.keyLength == 32 ) - { /* TKIP */ - zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr, - &wd->sta.txSeed, keyInfo.initIv); - zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid, - &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv); - -#ifdef ZM_ENABLE_CENC - if (keyInfo.flag & ZM_KEY_FLAG_CENC) - { - zm_debug_msg0("Set CENC pairwise Key"); - - wd->sta.encryMode = ZM_CENC; - - /* Reset txiv and rxiv */ - wd->sta.txiv[0] = 0x5c365c36; - wd->sta.txiv[1] = 0x5c365c36; - wd->sta.txiv[2] = 0x5c365c36; - wd->sta.txiv[3] = 0x5c365c36; - - wd->sta.rxiv[0] = 0x5c365c37; - wd->sta.rxiv[1] = 0x5c365c36; - wd->sta.rxiv[2] = 0x5c365c36; - wd->sta.rxiv[3] = 0x5c365c36; - - /* Set Key Index */ - wd->sta.cencKeyId = keyInfo.keyIndex; - - //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr, - // (u32_t*) &keyInfo.key[16]); - } - else -#endif //ZM_ENABLE_CENC - { - wd->sta.encryMode = ZM_TKIP; - - //zfCoreSetKey(dev, 0, 1, ZM_TKIP, wd->sta.bssid, - // (u32_t*) &keyInfo.key[16]); - - zfMicSetKey(&keyInfo.key[16], &wd->sta.txMicKey); - zfMicSetKey(&keyInfo.key[24], - &wd->sta.rxMicKey[keyInfo.keyIndex]); - } - } - else if ( keyInfo.keyLength == 16 ) - { /* AES */ -#ifdef ZM_ENABLE_IBSS_WPA2PSK - if ( wd->sta.ibssWpa2Psk == 1 ) - { - wd->sta.oppositeInfo[userIdx].encryMode = ZM_AES; - encryType = wd->sta.oppositeInfo[userIdx].encryMode; - } - else - { - wd->sta.encryMode = ZM_AES; - encryType = wd->sta.encryMode; - } -#else - wd->sta.encryMode = ZM_AES; -#endif - } - else - { - return ZM_STATUS_FAILURE; - } - - /* user 0 */ - //zfCoreSetKey(dev, 0, 0, wd->sta.encryMode, - // wd->sta.bssid, (u32_t*) keyInfo.key); - //zfHpSetStaPairwiseKey(dev, wd->sta.bssid, wd->sta.encryMode, - // (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]); - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) ) - { /* If not AES-CCMP and ibss network , use traditional */ - zfHpSetPerUserKey(dev, - userIdx, - keyInfo.keyIndex, // key id == 0 ( Pairwise key = 0 ) - (u8_t*)keyInfo.macAddr, // RX need Source Address ( Address 2 ) - encryType, -// wd->sta.encryMode, - (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]); - - wd->sta.oppositeInfo[userIdx].wpaState = ZM_STA_WPA_STATE_PK_OK ; - } - else - {/* Big Endian and Little Endian Compatibility */ - for (i = 0; i < 3; i++) - { - addr[2 * i] = wd->sta.bssid[i] & 0xff; - addr[2 * i + 1] = wd->sta.bssid[i] >> 8; - } - zfHpSetPerUserKey(dev, - ZM_USER_KEY_PK, // user id - 0, // key id - addr,//(u8_t *)wd->sta.bssid, - wd->sta.encryMode, - (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]); - - wd->sta.keyId = 4; - } -#else - /* Big Endian and Little Endian Compatibility */ - for (i = 0; i < 3; i++) - { - addr[2 * i] = wd->sta.bssid[i] & 0xff; - addr[2 * i + 1] = wd->sta.bssid[i] >> 8; - } - zfHpSetPerUserKey(dev, - ZM_USER_KEY_PK, // user id - 0, // key id - addr,//(u8_t *)wd->sta.bssid, - wd->sta.encryMode, - (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]); - - wd->sta.keyId = 4; -#endif - - wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK; - } - else if ( keyInfo.flag & ZM_KEY_FLAG_GK ) - { /* set group key */ - - zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid, - &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv); - - if ( keyInfo.keyLength == 32 ) - { /* TKIP */ -#ifdef ZM_ENABLE_CENC - if (keyInfo.flag & ZM_KEY_FLAG_CENC) - { - encryMode = ZM_CENC; - zm_debug_msg0("Set CENC group Key"); - - /* Reset txiv and rxiv */ - wd->sta.rxivGK[0] = 0x5c365c36; - wd->sta.rxivGK[1] = 0x5c365c36; - wd->sta.rxivGK[2] = 0x5c365c36; - wd->sta.rxivGK[3] = 0x5c365c36; - - //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr, - // (u32_t*) &keyInfo.key[16]); - key = (u32_t*) keyInfo.key; - } - else -#endif //ZM_ENABLE_CENC - { - encryMode = ZM_TKIP; - key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk; - - if ( !(keyInfo.flag & ZM_KEY_FLAG_INIT_IV) ) - { - wd->sta.rxSeed[keyInfo.keyIndex].iv16 = 0; - wd->sta.rxSeed[keyInfo.keyIndex].iv32 = 0; - } - - /* set MIC key to HMAC */ - //zfCoreSetKey(dev, 8, 1, ZM_TKIP, broadcast, - // (u32_t*) (&keyInfo.key[16])); - - zfMicSetKey(&keyInfo.key[24], - &wd->sta.rxMicKey[keyInfo.keyIndex]); - } - } - else if ( keyInfo.keyLength == 16 ) - { /* AES */ - encryMode = ZM_AES; - //key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk; - } - else - { /* WEP */ - if ( keyInfo.keyLength == 5 ) - { - encryMode = ZM_WEP64; - } - else if ( keyInfo.keyLength == 13 ) - { - encryMode = ZM_WEP128; - } - else if ( keyInfo.keyLength == 29 ) - { - encryMode = ZM_WEP256; - } - - key = (u32_t*) keyInfo.key; - } - - /* user 8 */ - //zfCoreSetKey(dev, 8, 0, encryMode, broadcast, key); - //zfHpSetStaGroupKey(dev, broadcast, encryMode, - // (u32_t*) keyInfo.key, (u32_t*) (&keyInfo.key[16])); - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) ) - {/* If not AES-CCMP and ibss network , use traditional */ - zfHpSetPerUserKey(dev, - userIdx, - keyInfo.keyIndex, // key id - // (u8_t *)broadcast, // for only 2 stations IBSS netwrl ( A2 ) - (u8_t*)keyInfo.macAddr, // for multiple ( > 2 ) stations IBSS network ( A2 ) - encryMode, - (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]); - } - else - { - zfHpSetPerUserKey(dev, - ZM_USER_KEY_GK, // user id - 0, // key id - (u8_t *)broadcast, - encryMode, - (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]); - - wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK; - } -#else - zfHpSetPerUserKey(dev, - ZM_USER_KEY_GK, // user id - 0, // key id - (u8_t *)broadcast, - encryMode, - (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]); - - wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK; -#endif - } - else - { /* legacy WEP */ - zm_debug_msg0("legacy WEP"); - - if ( keyInfo.keyIndex >= 4 ) - { - return ZM_STATUS_FAILURE; - } - - if ( keyInfo.keyLength == 5 ) - { - zm_debug_msg0("WEP 64"); - - encryMode = ZM_WEP64; - } - else if ( keyInfo.keyLength == 13 ) - { - zm_debug_msg0("WEP 128"); - - encryMode = ZM_WEP128; - } - else if ( keyInfo.keyLength == 32 ) - { - /* TKIP */ - #if 0 - // Don't reset the IV since some AP would fail in IV check and drop our connection - if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK ) - { - wd->sta.iv16 = 0; - wd->sta.iv32 = 0; - } - #endif - - encryMode = ZM_TKIP; - - zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid, - &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv); - zfMicSetKey(&keyInfo.key[24], - &wd->sta.rxMicKey[keyInfo.keyIndex]); - } - else if ( keyInfo.keyLength == 16 ) - { - /* AES */ - #if 0 - // Don't reset the IV since some AP would fail in IV check and drop our connection - if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK ) - { - /* broadcast -- > group key */ - /* Only initialize when set our default key ! */ - wd->sta.iv16 = 0; - wd->sta.iv32 = 0; - } - #endif - - encryMode = ZM_AES; - } - else if ( keyInfo.keyLength == 29 ) - { - zm_debug_msg0("WEP 256"); - - encryMode = ZM_WEP256; - //zfCoreSetKey(dev, 64, 1, wd->sta.encryMode, - // wd->sta.bssid, (u32_t*) (&keyInfo.key[16])); - } - else - { - return ZM_STATUS_FAILURE; - } - - { - u8_t i; - - zm_debug_msg0("key = "); - for(i = 0; i < keyInfo.keyLength; i++) - { - zm_debug_msg2("", keyInfo.key[i]); - } - } - - if ( keyInfo.flag & ZM_KEY_FLAG_DEFAULT_KEY ) - { - //for WEP default key 1~3 and ATOM platform--CWYang(+) - vapId = 0; - wd->ap.bcHalKeyIdx[vapId] = keyInfo.keyIndex; - wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex; - wd->sta.keyId = keyInfo.keyIndex; - } - - if(encryMode == ZM_TKIP) - { - if(wd->TKIP_Group_KeyChanging == 0x1) - { - zm_debug_msg0("Countermeasure : Cancel Old Timer "); - zfTimerCancel(dev, ZM_EVENT_SKIP_COUNTERMEASURE); - } - else - { - zm_debug_msg0("Countermeasure : Create New Timer "); - } - - wd->TKIP_Group_KeyChanging = 0x1; - zfTimerSchedule(dev, ZM_EVENT_SKIP_COUNTERMEASURE, 150); - } - - - - //------------------------------------------------------------------------ - - /* use default key */ - //zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyInfo.keyIndex, 0, - // wd->sta.encryMode, wd->sta.bssid, (u32_t*) keyInfo.key); - - if ( encryMode == ZM_TKIP || - encryMode == ZM_AES ) - { - zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode, - (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]); - -#ifdef ZM_ENABLE_IBSS_WPA2PSK - if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) ) - {/* If not AES-CCMP and ibss network , use traditional */ - wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK; - } - else - { - if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK) - wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK; - else - { - wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK; - wd->sta.encryMode = encryMode; - wd->ws.encryMode = encryMode; - } - } -#else - if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK) - wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK; - else if ( wd->sta.wpaState == ZM_STA_WPA_STATE_INIT ) - { - wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK; - wd->sta.encryMode = encryMode; - wd->ws.encryMode = encryMode; - } -#endif - } - else - { - zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode, - (u32_t*) keyInfo.key, NULL); - - /* Save key for software WEP */ - zfMemoryCopy(wd->sta.wepKey[keyInfo.keyIndex], keyInfo.key, - keyInfo.keyLength); - - /* TODO: Check whether we need to save the SWEncryMode */ - wd->sta.SWEncryMode[keyInfo.keyIndex] = encryMode; - - wd->sta.encryMode = encryMode; - wd->ws.encryMode = encryMode; - } - } - } - -// wd->sta.flagKeyChanging = 1; - return ZM_STATUS_SUCCESS; -} - -/* PSEUDO test */ -u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo) -{ - //u16_t broadcast[3] = {0xffff, 0xffff, 0xffff}; - //u32_t* key; - u8_t micKey[16]; - - zmw_get_wlan_dev(dev); - - switch (keyInfo.keyLength) - { - case 5: - wd->sta.encryMode = ZM_WEP64; - /* use default key */ - zfCoreSetKey(dev, 64, 0, ZM_WEP64, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key); - break; - - case 13: - wd->sta.encryMode = ZM_WEP128; - /* use default key */ - zfCoreSetKey(dev, 64, 0, ZM_WEP128, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key); - break; - - case 29: - wd->sta.encryMode = ZM_WEP256; - /* use default key */ - zfCoreSetKey(dev, 64, 1, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) (&keyInfo.key[16])); - zfCoreSetKey(dev, 64, 0, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key); - break; - - case 16: - wd->sta.encryMode = ZM_AES; - //zfCoreSetKey(dev, 0, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key); - zfCoreSetKey(dev, 64, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key); - break; - - case 32: -#ifdef ZM_ENABLE_CENC - if (keyInfo.flag & ZM_KEY_FLAG_CENC) - { - u16_t boardcastAddr[3] = {0xffff, 0xffff, 0xffff}; - u16_t Addr_a[] = { 0x0000, 0x0080, 0x0901}; - u16_t Addr_b[] = { 0x0000, 0x0080, 0x0902}; - /* CENC test: user0,1 and user2 for boardcast */ - wd->sta.encryMode = ZM_CENC; - zfCoreSetKey(dev, 0, 1, ZM_CENC, (u16_t *)Addr_a, (u32_t*) (&keyInfo.key[16])); - zfCoreSetKey(dev, 0, 0, ZM_CENC, (u16_t *)Addr_a, (u32_t*) keyInfo.key); - - zfCoreSetKey(dev, 1, 1, ZM_CENC, (u16_t *)Addr_b, (u32_t*) (&keyInfo.key[16])); - zfCoreSetKey(dev, 1, 0, ZM_CENC, (u16_t *)Addr_b, (u32_t*) keyInfo.key); - - zfCoreSetKey(dev, 2, 1, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) (&keyInfo.key[16])); - zfCoreSetKey(dev, 2, 0, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) keyInfo.key); - - /* Initialize PN sequence */ - wd->sta.txiv[0] = 0x5c365c36; - wd->sta.txiv[1] = 0x5c365c36; - wd->sta.txiv[2] = 0x5c365c36; - wd->sta.txiv[3] = 0x5c365c36; - } - else -#endif //ZM_ENABLE_CENC - { - wd->sta.encryMode = ZM_TKIP; - zfCoreSetKey(dev, 64, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) micKey); - zfCoreSetKey(dev, 64, 0, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key); - } - break; - default: - wd->sta.encryMode = ZM_NO_WEP; - } - - return ZM_STATUS_SUCCESS; -} - -void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode) -{ -#if 0 - zmw_get_wlan_dev(dev); - - wd->sta.powerSaveMode = mode; - - /* send null data with PwrBit to inform AP */ - if ( mode > ZM_STA_PS_NONE ) - { - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - zfSendNullData(dev, 1); - } - - /* device into PS mode */ - zfPSDeviceSleep(dev); - } -#endif - - zfPowerSavingMgrSetMode(dev, mode); -} - -void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac) -{ - zmw_get_wlan_dev(dev); - - wd->macAddr[0] = mac[0]; - wd->macAddr[1] = mac[1]; - wd->macAddr[2] = mac[2]; - - zfHpSetMacAddress(dev, mac, 0); -} - -u8_t zfiWlanQueryWlanMode(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->wlanMode; -} - -u8_t zfiWlanQueryAdapterState(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->state; -} - -u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper) -{ - u8_t authMode; - - zmw_get_wlan_dev(dev); - - if ( bWrapper ) - { - authMode = wd->ws.authMode; - } - else - { - //authMode = wd->sta.authMode; - authMode = wd->sta.currentAuthMode; - } - - return authMode; -} - -u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper) -{ - u8_t wepStatus; - - zmw_get_wlan_dev(dev); - - if ( bWrapper ) - { - wepStatus = wd->ws.wepStatus; - } - else - { - wepStatus = wd->sta.wepStatus; - } - - return wepStatus; -} - -void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength) -{ - u16_t vapId = 0; - zmw_get_wlan_dev(dev); - - if (wd->wlanMode == ZM_MODE_AP) - { - vapId = zfwGetVapId(dev); - - if (vapId == 0xffff) - { - *pSsidLength = wd->ap.ssidLen[0]; - zfMemoryCopy(ssid, wd->ap.ssid[0], wd->ap.ssidLen[0]); - } - else - { - *pSsidLength = wd->ap.ssidLen[vapId + 1]; - zfMemoryCopy(ssid, wd->ap.ssid[vapId + 1], wd->ap.ssidLen[vapId + 1]); - } - } - else - { - *pSsidLength = wd->sta.ssidLen; - zfMemoryCopy(ssid, wd->sta.ssid, wd->sta.ssidLen); - } -} - -u16_t zfiWlanQueryFragThreshold(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->fragThreshold; -} - -u16_t zfiWlanQueryRtsThreshold(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->rtsThreshold; -} - -u32_t zfiWlanQueryFrequency(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return (wd->frequency*1000); -} - -/*********************************************************** - * Function: zfiWlanQueryCurrentFrequency - * Return value: - * - 0 : no validate current frequency - * - (>0): current frequency depend on "qmode" - * Input: - * - qmode: - * 0: return value depend on the support mode, this - qmode is use to solve the bug #31223 - * 1: return the actually current frequency - ***********************************************************/ -u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode) -{ - u32_t frequency; - - zmw_get_wlan_dev(dev); - - switch (qmode) - { - case 0: - if (wd->sta.currentFrequency > 3000) - { - if (wd->supportMode & ZM_WIRELESS_MODE_5) - { - frequency = wd->sta.currentFrequency; - } - else if (wd->supportMode & ZM_WIRELESS_MODE_24) - { - frequency = zfChGetFirst2GhzChannel(dev); - } - else - { - frequency = 0; - } - } - else - { - if (wd->supportMode & ZM_WIRELESS_MODE_24) - { - frequency = wd->sta.currentFrequency; - } - else if (wd->supportMode & ZM_WIRELESS_MODE_5) - { - frequency = zfChGetLast5GhzChannel(dev); - } - else - { - frequency = 0; - } - } - break; - - case 1: - frequency = wd->sta.currentFrequency; - break; - - default: - frequency = 0; - } - - return (frequency*1000); -} - -u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t freq) -{ - u8_t i; - u16_t frequency = (u16_t) (freq/1000); - u32_t ret = 0; - - zmw_get_wlan_dev(dev); - - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) - { - if ( wd->regulationTable.allowChannel[i].channel == frequency ) - { - ret = wd->regulationTable.allowChannel[i].channelFlags; - } - } - - return ret; -} - -/* BandWidth 0=>20 1=>40 */ -/* ExtOffset 0=>20 1=>high control 40 3=>low control 40 */ -void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset) -{ - zmw_get_wlan_dev(dev); - - *bandWidth = wd->BandWidth40; - *extOffset = wd->ExtOffset; -} - -u8_t zfiWlanQueryCWMode(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->cwm.cw_mode; -} - -u32_t zfiWlanQueryCWEnable(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->cwm.cw_enable; -} - -void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid) -{ - u8_t addr[6]; - - zmw_get_wlan_dev(dev); - - ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, addr); - zfMemoryCopy(bssid, addr, 6); -} - -u16_t zfiWlanQueryBeaconInterval(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->beaconInterval; -} - -u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - wd->sta.rxBeaconTotal += wd->sta.rxBeaconCount; - - return wd->sta.rxBeaconTotal; -} - -u16_t zfiWlanQueryAtimWindow(zdev_t* dev) -{ - u16_t atimWindow; - - zmw_get_wlan_dev(dev); - - atimWindow = wd->sta.atimWindow; - - return atimWindow; -} - -u8_t zfiWlanQueryEncryMode(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - if (wd->wlanMode == ZM_MODE_AP) - return wd->ap.encryMode[0]; - else - return wd->sta.encryMode; -} - -u16_t zfiWlanQueryCapability(zdev_t* dev) -{ - u16_t capability; - - zmw_get_wlan_dev(dev); - - capability = wd->sta.capability[0] + - (((u16_t) wd->sta.capability[1]) << 8); - - return capability; - -} - -u16_t zfiWlanQueryAid(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->sta.aid; -} - -void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength) -{ - u8_t i, j=0; - - zmw_get_wlan_dev(dev); - - for( i=0; i<4; i++ ) - { - if ( wd->bRate & (0x1 << i) ) - { - rateArray[j] = zg11bRateTbl[i] + - ((wd->bRateBasic & (0x1<gRate & (0x1 << i) ) - { - rateArray[j] = zg11gRateTbl[i] + - ((wd->gRateBasic & (0x1<sta.rsnIe[1] + 2; - zfMemoryCopy(ie, wd->sta.rsnIe, len); - *pLength = len; -} - -void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength) -{ - u8_t len; - - zmw_get_wlan_dev(dev); - - len = wd->sta.wpaIe[1] + 2; - zfMemoryCopy(ie, wd->sta.wpaIe, len); - *pLength = len; - -} - -u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - switch( wd->sta.currentAuthMode ) - { - case ZM_AUTH_MODE_WPA2PSK: - case ZM_AUTH_MODE_WPA2: - if ( wd->sta.rsnIe[7] == 2 ) - { - return ZM_TKIP; - } - else - { - return ZM_AES; - } - break; - - case ZM_AUTH_MODE_WPAPSK: - case ZM_AUTH_MODE_WPA: - if ( wd->sta.rsnIe[11] == 2 ) - { - return ZM_TKIP; - } - else - { - return ZM_AES; - } - break; - - default: - return wd->sta.encryMode; - } -} - -u8_t zfiWlanQueryHTMode(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - // 0:Legancy, 1:N - return wd->sta.EnableHT; -} - -u8_t zfiWlanQueryBandWidth40(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - // 0:20M, 1:40M - return wd->BandWidth40; -} - -u16_t zfiWlanQueryRegionCode(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->regulationTable.regionCode; -} -void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length) -{ - u16_t vapId = 0; - zmw_get_wlan_dev(dev); - - if (wd->wlanMode == ZM_MODE_AP) // AP Mode - { - vapId = zfwGetVapId(dev); - - if (vapId == 0xffff) - vapId = 0; - else - vapId++; - - zm_assert(Length < ZM_MAX_WPAIE_SIZE); - if (Length < ZM_MAX_WPAIE_SIZE) - { - wd->ap.wpaLen[vapId] = Length; - zfMemoryCopy(wd->ap.wpaIe[vapId], ie, wd->ap.wpaLen[vapId]); - } - - } - else - { - wd->sta.wpaLen = Length; - zfMemoryCopy(wd->sta.wpaIe, ie, wd->sta.wpaLen); - } - //zfiWlanSetWpaSupport(dev, 1); - if (wd->wlanMode == ZM_MODE_AP) // AP Mode - { - wd->ap.wpaSupport[vapId] = 1; - } - else - { - wd->sta.wpaSupport = 1; - } - -} - -void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport) -{ - u16_t vapId = 0; - zmw_get_wlan_dev(dev); - - if (wd->wlanMode == ZM_MODE_AP) // AP Mode - { - vapId = zfwGetVapId(dev); - - if (vapId == 0xffff) - vapId = 0; - else - vapId++; - - wd->ap.wpaSupport[vapId] = WpaSupport; - } - else - { - wd->sta.wpaSupport = WpaSupport; - } - -} - -void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode) -{ - zmw_get_wlan_dev(dev); - - wd->sta.bProtectionMode = mode; - if (wd->sta.bProtectionMode == TRUE) - { - zfHpSetSlotTime(dev, 0); - } - else - { - zfHpSetSlotTime(dev, 1); - } - - zm_msg1_mm(ZM_LV_1, "wd->protectionMode=", wd->sta.bProtectionMode); -} - -void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet, - u32_t nRateSet) -{ - zmw_get_wlan_dev(dev); - - wd->ws.bRateBasic = bRateSet; - wd->ws.gRateBasic = gRateSet; - wd->ws.nRateBasic = nRateSet; -} - -void zfiWlanSetBGMode(zdev_t* dev, u8_t mode) -{ - zmw_get_wlan_dev(dev); - - wd->ws.bgMode = mode; -} - -void zfiWlanSetpreambleType(zdev_t* dev, u8_t type) -{ - zmw_get_wlan_dev(dev); - - wd->ws.preambleType = type; -} - -u8_t zfiWlanQuerypreambleType(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->ws.preambleType; -} - -u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->sta.powerSaveMode; -} - -u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid) -{ - u32_t i; - - zmw_get_wlan_dev(dev); - - for(i=0; ista.pmkidInfo.bssidCount; i++) - { - if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid, - (u8_t*) bssid, 6) ) - { - /* matched */ - break; - } - } - - if ( i < wd->sta.pmkidInfo.bssidCount ) - { - /* overwrite the original one */ - zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16); - } - else - { - if ( i < ZM_PMKID_MAX_BSS_CNT ) - { - wd->sta.pmkidInfo.bssidInfo[i].bssid[0] = bssid[0]; - wd->sta.pmkidInfo.bssidInfo[i].bssid[1] = bssid[1]; - wd->sta.pmkidInfo.bssidInfo[i].bssid[2] = bssid[2]; - - zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16); - wd->sta.pmkidInfo.bssidCount++; - } - } - - return 0; -} - -u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len) -{ - //struct zsPmkidInfo* pPmkidInfo = ( struct zsPmkidInfo* ) buf; - u32_t size; - - zmw_get_wlan_dev(dev); - - size = sizeof(u32_t) + - wd->sta.pmkidInfo.bssidCount * sizeof(struct zsPmkidBssidInfo); - - if ( len < size ) - { - return wd->sta.pmkidInfo.bssidCount; - } - - zfMemoryCopy(buf, (u8_t*) &wd->sta.pmkidInfo, (u16_t) size); - - return 0; -} - -void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList) -{ - struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pList; - u8_t i; - u8_t bAllMulticast = 0; - //u32_t value; - - zmw_get_wlan_dev(dev); - - wd->sta.multicastList.size = size; - for(i=0; ista.multicastList.macAddr[i].addr, - pMacList[i].addr, 6); - } - - if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST ) - bAllMulticast = 1; - zfHpSetMulticastList(dev, size, pList, bAllMulticast); - -} - -void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId) -{ - u16_t fakeMacAddr[3] = {0, 0, 0}; - u32_t fakeKey[4] = {0, 0, 0, 0}; - - zmw_get_wlan_dev(dev); - - if ( keyType == 0 ) - { - /* remove WEP key */ - zm_debug_msg0("remove WEP key"); - zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0, - ZM_NO_WEP, fakeMacAddr, fakeKey); - wd->sta.encryMode = ZM_NO_WEP; - } - else if ( keyType == 1 ) - { - /* remove pairwise key */ - zm_debug_msg0("remove pairwise key"); - zfHpRemoveKey(dev, ZM_USER_KEY_PK); - wd->sta.encryMode = ZM_NO_WEP; - } - else - { - /* remove group key */ - zm_debug_msg0("remove group key"); - zfHpRemoveKey(dev, ZM_USER_KEY_GK); - } -} - - -void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry) -{ - zmw_get_wlan_dev(dev); - - zfMemoryCopy((u8_t*) pEntry, (u8_t*) &wd->regulationTable, - sizeof(struct zsRegulationTable)); -} - -/* parameter "time" is specified in ms */ -void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time) -{ - zmw_get_wlan_dev(dev); - - zm_debug_msg1("scan time (ms) = ", time); - - wd->sta.activescanTickPerChannel = time / ZM_MS_PER_TICK; -} - -void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable) -{ - zmw_get_wlan_dev(dev); - - wd->sta.bAutoReconnect = enable; - //wd->sta.bAutoReconnectEnabled = enable; -} - -void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo) -{ - zmw_get_wlan_dev(dev); - - wd->ws.staWmeEnabled = enable & 0x3; - if ((enable & 0x2) != 0) - { - wd->ws.staWmeQosInfo = uapsdInfo & 0x6f; - } - else - { - wd->ws.staWmeQosInfo = 0; - } -} - -void zfiWlanSetApWme(zdev_t* dev, u8_t enable) -{ - zmw_get_wlan_dev(dev); - - wd->ws.apWmeEnabled = enable; -} - -u8_t zfiWlanQuerywmeEnable(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->ws.staWmeEnabled; -} - -void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen, - u16_t entry) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - - if ((ssidLen <= 32) && (entry < ZM_MAX_PROBE_HIDDEN_SSID_SIZE)) - { - zmw_enter_critical_section(dev); - wd->ws.probingSsidList[entry].ssidLen = ssidLen; - zfMemoryCopy(wd->ws.probingSsidList[entry].ssid, ssid, ssidLen); - zmw_leave_critical_section(dev); - } - - return; -} - -void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode) -{ - zmw_get_wlan_dev(dev); - - wd->sta.disableProbingWithSsid = mode; - - return; -} - -void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable) -{ - zmw_get_wlan_dev(dev); - - wd->ws.dropUnencryptedPkts = enable; -} - -void zfiWlanSetStaRxSecurityCheckCb(zdev_t* dev, zfpStaRxSecurityCheckCb pStaRxSecurityCheckCb) -{ - zmw_get_wlan_dev(dev); - - wd->sta.pStaRxSecurityCheckCb = pStaRxSecurityCheckCb; -} - -void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly) -{ - zmw_get_wlan_dev(dev); - - wd->ws.ibssJoinOnly = joinOnly; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiConfigWdsPort */ -/* Configure WDS port. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* wdsPortId : WDS port ID, start from 0 */ -/* flag : 0=>disable WDS port, 1=>enable WDS port */ -/* wdsAddr : WDS neighbor MAC address */ -/* encType : encryption type for WDS port */ -/* wdsKey : encryption key for WDS port */ -/* */ -/* OUTPUTS */ -/* Error code */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.6 */ -/* */ -/************************************************************************/ -u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr, - u16_t encType, u32_t* wdsKey) -{ - u16_t addr[3]; - u32_t key[4]; - - zmw_get_wlan_dev(dev); - - if (wdsPortId >= ZM_MAX_WDS_SUPPORT) - { - return ZM_ERR_WDS_PORT_ID; - } - - if (flag == 1) - { - /* Enable WDS port */ - wd->ap.wds.macAddr[wdsPortId][0] = wdsAddr[0]; - wd->ap.wds.macAddr[wdsPortId][1] = wdsAddr[1]; - wd->ap.wds.macAddr[wdsPortId][2] = wdsAddr[2]; - - wd->ap.wds.wdsBitmap |= (1 << wdsPortId); - wd->ap.wds.encryMode[wdsPortId] = (u8_t) encType; - - zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, (u8_t) encType, wdsAddr, wdsKey); - } - else - { - /* Disable WDS port */ - addr[0] = addr[1] = addr[2] = 0; - key[0] = key[1] = key[2] = key[3] = 0; - wd->ap.wds.wdsBitmap &= (~(1 << wdsPortId)); - zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, ZM_NO_WEP, addr, key); - } - - return ZM_SUCCESS; -} -#ifdef ZM_ENABLE_CENC -/* CENC */ -void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId) -{ - //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); - u32_t txiv[4]; - zmw_get_wlan_dev(dev); - - /* convert little endian to big endian for 32 bits */ - txiv[3] = wd->ap.txiv[vapId][0]; - txiv[2] = wd->ap.txiv[vapId][1]; - txiv[1] = wd->ap.txiv[vapId][2]; - txiv[0] = wd->ap.txiv[vapId][3]; - - zfMemoryCopy(gsn, (u8_t*)txiv, 16); -} -#endif //ZM_ENABLE_CENC -//CWYang(+) -void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer) -{ - zmw_get_wlan_dev(dev); - - /*Change Signal Strength/Quality Value to Human Sense Here*/ - - buffer[0] = wd->SignalStrength; - buffer[1] = wd->SignalQuality; -} - -/* OS-XP */ -u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType) -{ - return zfStaAddIeWpaRsn(dev, buf, offset, frameType); -} - -/* zfiDebugCmd */ -/* cmd value-description */ -/* 0 schedule timer */ -/* 1 cancel timer */ -/* 2 clear timer */ -/* 3 test timer */ -/* 4 */ -/* 5 */ -/* 6 checksum test 0/1 */ -/* 7 enableProtectionMode */ -/* 8 rx packet content dump 0/1 */ - -u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value) -{ - u16_t event; - u32_t tick; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - - zmw_enter_critical_section(dev); - - if ( cmd == 0 ) - { /* schedule timer */ - event = (u16_t) ((value >> 16) & 0xffff); - tick = value & 0xffff; - zfTimerSchedule(dev, event, tick); - } - else if ( cmd == 1 ) - { /* cancel timer */ - event = (u16_t) (value & 0xffff); - zfTimerCancel(dev, event); - } - else if ( cmd == 2 ) - { /* clear timer */ - zfTimerClear(dev); - } - else if ( cmd == 3 ) - { /* test timer */ - zfTimerSchedule(dev, 1, 500); - zfTimerSchedule(dev, 2, 1000); - zfTimerSchedule(dev, 3, 1000); - zfTimerSchedule(dev, 4, 1000); - zfTimerSchedule(dev, 5, 1500); - zfTimerSchedule(dev, 6, 2000); - zfTimerSchedule(dev, 7, 2200); - zfTimerSchedule(dev, 6, 2500); - zfTimerSchedule(dev, 8, 2800); - } - else if ( cmd == 4) - { - zfTimerSchedule(dev, 1, 500); - zfTimerSchedule(dev, 2, 1000); - zfTimerSchedule(dev, 3, 1000); - zfTimerSchedule(dev, 4, 1000); - zfTimerSchedule(dev, 5, 1500); - zfTimerSchedule(dev, 6, 2000); - zfTimerSchedule(dev, 7, 2200); - zfTimerSchedule(dev, 6, 2500); - zfTimerSchedule(dev, 8, 2800); - zfTimerCancel(dev, 1); - zfTimerCancel(dev, 3); - zfTimerCancel(dev, 6); - } - else if ( cmd == 5 ) - { - wd->sta.keyId = (u8_t) value; - } - else if ( cmd == 6 ) - { - /* 0: normal 1: always set TCP/UDP checksum zero */ - wd->checksumTest = value; - } - else if ( cmd == 7 ) - { - wd->enableProtectionMode = value; - zm_msg1_mm(ZM_LV_1, "wd->enableProtectionMode=", wd->enableProtectionMode); - } - else if ( cmd == 8 ) - { - /* rx packet content dump */ - if (value) - { - wd->rxPacketDump = 1; - } - else - { - wd->rxPacketDump = 0; - } - } - - - zmw_leave_critical_section(dev); - - return 0; -} - -#ifdef ZM_ENABLE_CENC -u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv, - u8_t *key, u8_t *mic) -{ - struct zsKeyInfo keyInfo; - u8_t cencKey[32]; - u8_t i; - u16_t macAddr[3]; - - zmw_get_wlan_dev(dev); - - for (i = 0; i < 16; i++) - cencKey[i] = key[i]; - for (i = 0; i < 16; i++) - cencKey[i + 16] = mic[i]; - keyInfo.key = cencKey; - keyInfo.keyLength = 32; - keyInfo.keyIndex = keyid; - keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_PK; - for (i = 0; i < 3; i++) - macAddr[i] = wd->sta.bssid[i]; - keyInfo.macAddr = macAddr; - - zfiWlanSetKey(dev, keyInfo); - - /* Reset txiv and rxiv */ - //wd->sta.txiv[0] = txiv[0]; - //wd->sta.txiv[1] = txiv[1]; - //wd->sta.txiv[2] = txiv[2]; - //wd->sta.txiv[3] = txiv[3]; - // - //wd->sta.rxiv[0] = rxiv[0]; - //wd->sta.rxiv[1] = rxiv[1]; - //wd->sta.rxiv[2] = rxiv[2]; - //wd->sta.rxiv[3] = rxiv[3]; - - return 0; -} - -u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv, - u8_t *key, u8_t *mic) -{ - struct zsKeyInfo keyInfo; - u8_t cencKey[32]; - u8_t i; - u16_t macAddr[6] = {0xffff, 0xffff, 0xffff}; - - zmw_get_wlan_dev(dev); - - for (i = 0; i < 16; i++) - cencKey[i] = key[i]; - for (i = 0; i < 16; i++) - cencKey[i + 16] = mic[i]; - keyInfo.key = cencKey; - keyInfo.keyLength = 32; - keyInfo.keyIndex = keyid; - keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_GK; - keyInfo.vapId = 0; - for (i = 0; i < 3; i++) - keyInfo.vapAddr[i] = wd->macAddr[i]; - keyInfo.macAddr = macAddr; - - zfiWlanSetKey(dev, keyInfo); - - /* Reset txiv and rxiv */ - wd->sta.rxivGK[0] = ((rxiv[3] >> 24) & 0xFF) - + (((rxiv[3] >> 16) & 0xFF) << 8) - + (((rxiv[3] >> 8) & 0xFF) << 16) - + ((rxiv[3] & 0xFF) << 24); - wd->sta.rxivGK[1] = ((rxiv[2] >> 24) & 0xFF) - + (((rxiv[2] >> 16) & 0xFF) << 8) - + (((rxiv[2] >> 8) & 0xFF) << 16) - + ((rxiv[2] & 0xFF) << 24); - wd->sta.rxivGK[2] = ((rxiv[1] >> 24) & 0xFF) - + (((rxiv[1] >> 16) & 0xFF) << 8) - + (((rxiv[1] >> 8) & 0xFF) << 16) - + ((rxiv[1] & 0xFF) << 24); - wd->sta.rxivGK[3] = ((rxiv[0] >> 24) & 0xFF) - + (((rxiv[0] >> 16) & 0xFF) << 8) - + (((rxiv[0] >> 8) & 0xFF) << 16) - + ((rxiv[0] & 0xFF) << 24); - - wd->sta.authMode = ZM_AUTH_MODE_CENC; - wd->sta.currentAuthMode = ZM_AUTH_MODE_CENC; - - return 0; -} -#endif //ZM_ENABLE_CENC - -u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode) -{ - u8_t i; - - zmw_get_wlan_dev(dev); - - wd->sta.b802_11D = mode; - if (mode) //Enable 802.11d - { - wd->regulationTable.regionCode = NO_ENUMRD; - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) - wd->regulationTable.allowChannel[i].channelFlags |= ZM_REG_FLAG_CHANNEL_PASSIVE; - } - else //Disable - { - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) - wd->regulationTable.allowChannel[i].channelFlags &= ~ZM_REG_FLAG_CHANNEL_PASSIVE; - } - - return 0; -} - -u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode) -{ - zmw_get_wlan_dev(dev); - - //zm_debug_msg0("CWY - Enable 802.11h DFS"); - - // TODO : DFS Enable in 5250 to 5350 MHz and 5470 to 5725 MHz . - //if ( Adapter->ZD80211HSupport && - // Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 && - // ((ChannelNo >=52 && ChannelNo <= 64) || //5250~5350 MHZ - // (ChannelNo >=100 && ChannelNo <= 140))) //5470~5725 MHZ - //{ - // Adapter->ZD80211HSetting.DFSEnable=TRUE; - //} - //else - //{ - // Adapter->ZD80211HSetting.DFSEnable=FALSE; - //} - - wd->sta.DFSEnable = mode; - if (mode) - wd->sta.capability[1] |= ZM_BIT_0; - else - wd->sta.capability[1] &= (~ZM_BIT_0); - - return 0; -} - -u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode) -{ - zmw_get_wlan_dev(dev); - - // TODO : TPC Enable in 5150~5350 MHz and 5470~5725MHz. - //if ( Adapter->ZD80211HSupport && - // Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 && - // ((ChannelNo == 36 || ChannelNo == 40 || ChannelNo == 44 || ChannelNo == 48) || //5150~5250 MHZ , Not Japan - // (ChannelNo >=52 && ChannelNo <= 64) || //5250~5350 MHZ - // (ChannelNo >=100 && ChannelNo <= 140))) //5470~5725 MHZ - //{ - // Adapter->ZD80211HSetting.TPCEnable=TRUE; - //} - //else - //{ - // Adapter->ZD80211HSetting.TPCEnable=FALSE; - //} - - wd->sta.TPCEnable = mode; - if (mode) - wd->sta.capability[1] |= ZM_BIT_0; - else - wd->sta.capability[1] &= (~ZM_BIT_0); - - return 0; -} - -u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode) -{ - zmw_get_wlan_dev(dev); - - wd->aniEnable = mode; - if (mode) - zfHpAniAttach(dev); - - return 0; -} - -#ifdef ZM_OS_LINUX_FUNC -void zfiWlanShowTally(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - zm_msg1_mm(ZM_LV_0, "Hw_UnderrunCnt = ", wd->commTally.Hw_UnderrunCnt); - zm_msg1_mm(ZM_LV_0, "Hw_TotalRxFrm = ", wd->commTally.Hw_TotalRxFrm); - zm_msg1_mm(ZM_LV_0, "Hw_CRC32Cnt = ", wd->commTally.Hw_CRC32Cnt); - zm_msg1_mm(ZM_LV_0, "Hw_CRC16Cnt = ", wd->commTally.Hw_CRC16Cnt); - zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI = ", wd->commTally.Hw_DecrypErr_UNI); - zm_msg1_mm(ZM_LV_0, "Hw_RxFIFOOverrun = ", wd->commTally.Hw_RxFIFOOverrun); - zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul = ", wd->commTally.Hw_DecrypErr_Mul); - zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt = ", wd->commTally.Hw_RetryCnt); - zm_msg1_mm(ZM_LV_0, "Hw_TotalTxFrm = ", wd->commTally.Hw_TotalTxFrm); - zm_msg1_mm(ZM_LV_0, "Hw_RxTimeOut = ", wd->commTally.Hw_RxTimeOut); - zm_msg1_mm(ZM_LV_0, "Tx_MPDU = ", wd->commTally.Tx_MPDU); - zm_msg1_mm(ZM_LV_0, "BA_Fail = ", wd->commTally.BA_Fail); - zm_msg1_mm(ZM_LV_0, "Hw_Tx_AMPDU = ", wd->commTally.Hw_Tx_AMPDU); - zm_msg1_mm(ZM_LV_0, "Hw_Tx_MPDU = ", wd->commTally.Hw_Tx_MPDU); - - zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU = ", wd->commTally.Hw_RxMPDU); - zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU = ", wd->commTally.Hw_RxDropMPDU); - zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU = ", wd->commTally.Hw_RxDelMPDU); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError = ", wd->commTally.Hw_RxPhyMiscError); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError = ", wd->commTally.Hw_RxPhyXRError); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError = ", wd->commTally.Hw_RxPhyOFDMError); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError = ", wd->commTally.Hw_RxPhyCCKError); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError = ", wd->commTally.Hw_RxPhyHTError); - zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", wd->commTally.Hw_RxPhyTotalCount); - - if (!((wd->commTally.Tx_MPDU == 0) && (wd->commTally.BA_Fail == 0))) - { - zm_debug_msg_p("BA Fail Ratio(%) = ", wd->commTally.BA_Fail * 100, - (wd->commTally.BA_Fail + wd->commTally.Tx_MPDU)); - } - - if (!((wd->commTally.Hw_Tx_MPDU == 0) && (wd->commTally.Hw_Tx_AMPDU == 0))) - { - zm_debug_msg_p("Avg Agg Number = ", - wd->commTally.Hw_Tx_MPDU, wd->commTally.Hw_Tx_AMPDU); - } -} -#endif - -void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->maxTxPower2 = power2; - wd->maxTxPower5 = power5; - zmw_leave_critical_section(dev); -} - -void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5) -{ - zmw_get_wlan_dev(dev); - - *power2 = wd->maxTxPower2; - *power5 = wd->maxTxPower5; -} - -void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->connectMode = mode; - zmw_leave_critical_section(dev); -} - -void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->supportMode = mode; - zmw_leave_critical_section(dev); -} - -void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode) -{ - zmw_get_wlan_dev(dev); - - wd->ws.adhocMode = mode; -} - -u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper) -{ - u32_t adhocMode; - - zmw_get_wlan_dev(dev); - - if ( bWrapper ) - { - adhocMode = wd->ws.adhocMode; - } - else - { - adhocMode = wd->wfc.bIbssGMode; - } - - return adhocMode; -} - - -u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length) -{ - u8_t buf[5]; - zmw_get_wlan_dev(dev); - - if (length == 4) - { - buf[2] = wd->ws.countryIsoName[0] = countryIsoName[2]; - buf[3] = wd->ws.countryIsoName[1] = countryIsoName[1]; - buf[4] = wd->ws.countryIsoName[2] = countryIsoName[0]; - } - else if (length == 3) - { - buf[2] = wd->ws.countryIsoName[0] = countryIsoName[1]; - buf[3] = wd->ws.countryIsoName[1] = countryIsoName[0]; - buf[4] = wd->ws.countryIsoName[2] = '\0'; - } - else - { - return 1; - } - - return zfHpGetRegulationTablefromISO(dev, buf, length); -} - - -const char* zfiWlanQueryCountryIsoName(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->ws.countryIsoName; -} - - - -void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if (CCS) - { - /* Reset Regulation Table by Country Code */ - zfHpGetRegulationTablefromCountry(dev, Code); - } - else - { - /* Reset Regulation Table by Region Code */ - zfHpGetRegulationTablefromRegionCode(dev, Code); - } - - if (bfirstChannel) { - zmw_enter_critical_section(dev); - wd->frequency = zfChGetFirstChannel(dev, NULL); - zmw_leave_critical_section(dev); - zfCoreSetFrequency(dev, wd->frequency); - } -} - - -const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode) -{ - return zfHpGetisoNamefromregionCode(dev, regionCode); -} - -u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel) -{ - return zfChNumToFreq(dev, channel, 0); -} - -u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq) -{ - u8_t is5GBand = 0; - - return zfChFreqToNum(freq, &is5GBand); -} - -void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag) -{ - zfHpDisableDfsChannel(dev, disableFlag); - return; -} - -void zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag) -{ - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->ledStruct.LEDCtrlType = type; - wd->ledStruct.LEDCtrlFlagFromReg = flag; - zmw_leave_critical_section(dev); -} - -void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled) -{ - zmw_get_wlan_dev(dev); - - wd->sta.leapEnabled = leapEnabled; -} - -u32_t zfiWlanQueryHwCapability(zdev_t* dev) -{ - return zfHpCapability(dev); -} - -u32_t zfiWlanQueryReceivedPacket(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->sta.ReceivedPktRatePerSecond; -} - -void zfiWlanCheckSWEncryption(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - if (wd->sta.SWEncryptEnable != 0) - { - zfHpSWDecrypt(dev, 1); - } -} - -u16_t zfiWlanQueryAllowChannels(zdev_t* dev, u16_t *channels) -{ - u16_t ii; - zmw_get_wlan_dev(dev); - - for (ii = 0; ii < wd->regulationTable.allowChannelCnt; ii++) - { - channels[ii] = wd->regulationTable.allowChannel[ii].channel; - } - - return wd->regulationTable.allowChannelCnt; -} - -void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val) -{ - zmw_get_wlan_dev(dev); - - wd->dynamicSIFSEnable = val; - - zm_debug_msg1("wd->dynamicSIFSEnable = ", wd->dynamicSIFSEnable) -} - -u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - return wd->sta.multicastList.size; -} - -void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList) -{ - struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pMCList; - u8_t i; - - zmw_get_wlan_dev(dev); - - for ( i=0; ista.multicastList.size; i++ ) - { - zfMemoryCopy(pMacList[i].addr, wd->sta.multicastList.macAddr[i].addr, 6); - } -} - -void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter) -{ - u8_t bAllMulticast = 0; - u32_t oldFilter; - - zmw_get_wlan_dev(dev); - - oldFilter = wd->sta.osRxFilter; - - wd->sta.osRxFilter = PacketFilter; - - if ((oldFilter & ZM_PACKET_TYPE_ALL_MULTICAST) != - (wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST)) - { - if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST ) - bAllMulticast = 1; - zfHpSetMulticastList(dev, wd->sta.multicastList.size, - (u8_t*)wd->sta.multicastList.macAddr, bAllMulticast); - } -} - -u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr) -{ - u8_t i; - u8_t bIsInMCListAddr = 0; - - zmw_get_wlan_dev(dev); - - for ( i=0; ista.multicastList.size; i++ ) - { - if ( zfwMemoryIsEqual((u8_t*)dstMacAddr, (u8_t*)wd->sta.multicastList.macAddr[i].addr, 6) ) - { - bIsInMCListAddr = 1; - break; - } - } - - return bIsInMCListAddr; -} - -void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode) -{ - zmw_get_wlan_dev(dev); - - wd->sta.bSafeMode = safeMode; - - if ( safeMode ) - zfStaEnableSWEncryption(dev, 1); - else - zfStaDisableSWEncryption(dev); -} - -void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize, u8_t* ibssAdditionalIE) -{ - zmw_get_wlan_dev(dev); - - if ( ibssAdditionalIESize ) - { - wd->sta.ibssAdditionalIESize = ibssAdditionalIESize; - zfMemoryCopy(wd->sta.ibssAdditionalIE, ibssAdditionalIE, (u16_t)ibssAdditionalIESize); - } - else - wd->sta.ibssAdditionalIESize = 0; -} diff --git a/drivers/staging/otus/80211core/cprecomp.h b/drivers/staging/otus/80211core/cprecomp.h deleted file mode 100644 index 1670bfc22587..000000000000 --- a/drivers/staging/otus/80211core/cprecomp.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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 - diff --git a/drivers/staging/otus/80211core/cpsmgr.c b/drivers/staging/otus/80211core/cpsmgr.c deleted file mode 100644 index 32313beba78d..000000000000 --- a/drivers/staging/otus/80211core/cpsmgr.c +++ /dev/null @@ -1,730 +0,0 @@ -/* - * 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) -{ -#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; - - offset = zfFindElement(dev, buf, ZM_WLAN_EID_TIM); - if (offset != 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 */ - diff --git a/drivers/staging/otus/80211core/cscanmgr.c b/drivers/staging/otus/80211core/cscanmgr.c deleted file mode 100644 index be7d8ebe82ba..000000000000 --- a/drivers/staging/otus/80211core/cscanmgr.c +++ /dev/null @@ -1,533 +0,0 @@ -/* - * 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) -{ - 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; -} diff --git a/drivers/staging/otus/80211core/ctkip.c b/drivers/staging/otus/80211core/ctkip.c deleted file mode 100644 index ca0740227be4..000000000000 --- a/drivers/staging/otus/80211core/ctkip.c +++ /dev/null @@ -1,599 +0,0 @@ -/* - * 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; - 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; ippk[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; -} diff --git a/drivers/staging/otus/80211core/ctxrx.c b/drivers/staging/otus/80211core/ctxrx.c deleted file mode 100644 index 135167d23d0f..000000000000 --- a/drivers/staging/otus/80211core/ctxrx.c +++ /dev/null @@ -1,4115 +0,0 @@ -/* - * 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 : htr.c */ -/* */ -/* Abstract */ -/* This module contains Tx and Rx functions. */ -/* */ -/* NOTES */ -/* None */ -/* */ -/************************************************************************/ -#include "cprecomp.h" - -u16_t zfWlanRxValidate(zdev_t* dev, zbuf_t* buf); -u16_t zfWlanRxFilter(zdev_t* dev, zbuf_t* buf); - - - -const u8_t zgSnapBridgeTunnel[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8 }; -const u8_t zgSnap8021h[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00 }; -/* Table for converting IP DSCP P2-P0 bits to 802.11e Access Category */ -const u8_t zcUpToAc[8] = {0, 1, 1, 0, 2, 2, 3, 3}; //WMM default -//const u8_t zcUpToAc[8] = {0, 1, 1, 0, 0, 0, 0, 0}; //For 2 TxQ -//const u8_t zcUpToAc[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //For single TxQ -const u8_t zcMaxspToPktNum[4] = {8, 2, 4, 6}; - -u8_t zfGetEncryModeFromRxStatus(struct zsAdditionInfo* addInfo) -{ - u8_t securityByte; - u8_t encryMode; - - securityByte = (addInfo->Tail.Data.SAIndex & 0xc0) >> 4; /* byte4 */ - securityByte |= (addInfo->Tail.Data.DAIndex & 0xc0) >> 6; /* byte5 */ - - switch( securityByte ) - { - case ZM_NO_WEP: - case ZM_WEP64: - case ZM_WEP128: - case ZM_WEP256: -#ifdef ZM_ENABLE_CENC - case ZM_CENC: -#endif //ZM_ENABLE_CENC - case ZM_TKIP: - case ZM_AES: - - encryMode = securityByte; - break; - - default: - - if ( (securityByte & 0xf8) == 0x08 ) - { - // decrypted by software - } - - encryMode = ZM_NO_WEP; - break; - } - - return encryMode; -} - -void zfGetRxIvIcvLength(zdev_t* dev, zbuf_t* buf, u8_t vap, u16_t* pIvLen, - u16_t* pIcvLen, struct zsAdditionInfo* addInfo) -{ - u16_t wdsPort; - u8_t encryMode; - - zmw_get_wlan_dev(dev); - - *pIvLen = 0; - *pIcvLen = 0; - - encryMode = zfGetEncryModeFromRxStatus(addInfo); - - if ( wd->wlanMode == ZM_MODE_AP ) - { - if (vap < ZM_MAX_AP_SUPPORT) - { - if (( wd->ap.encryMode[vap] == ZM_WEP64 ) || - ( wd->ap.encryMode[vap] == ZM_WEP128 ) || - ( wd->ap.encryMode[vap] == ZM_WEP256 )) - { - *pIvLen = 4; - *pIcvLen = 4; - } - else - { - u16_t id; - u16_t addr[3]; - - addr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET); - addr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2); - addr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4); - - /* Find STA's information */ - id = zfApFindSta(dev, addr); - if (id != 0xffff) - { - if (wd->ap.staTable[id].encryMode == ZM_TKIP) - { - *pIvLen = 8; - *pIcvLen = 4; - } - else if (wd->ap.staTable[id].encryMode == ZM_AES) - { - *pIvLen = 8; - *pIcvLen = 8; // AES MIC - //*pIcvLen = 0; - } -#ifdef ZM_ENABLE_CENC - else if (wd->ap.staTable[id].encryMode == ZM_CENC) - { - *pIvLen = 18; - *pIcvLen= 16; - } -#endif //ZM_ENABLE_CENC - } - } - /* WDS port checking */ - wdsPort = vap - 0x20; - if (wdsPort >= ZM_MAX_WDS_SUPPORT) - { - wdsPort = 0; - } - - switch (wd->ap.wds.encryMode[wdsPort]) - { - case ZM_WEP64: - case ZM_WEP128: - case ZM_WEP256: - *pIvLen = 4; - *pIcvLen = 4; - break; - case ZM_TKIP: - *pIvLen = 8; - *pIcvLen = 4; - break; - case ZM_AES: - *pIvLen = 8; - *pIcvLen = 0; - break; -#ifdef ZM_ENABLE_CENC - case ZM_CENC: - *pIvLen = 18; - *pIcvLen = 16; - break; -#endif //ZM_ENABLE_CENC - }/* end of switch */ - } - } - else if ( wd->wlanMode == ZM_MODE_PSEUDO) - { - /* test: 6518 for QA auto test */ - switch (encryMode) - { - case ZM_WEP64: - case ZM_WEP128: - case ZM_WEP256: - *pIvLen = 4; - *pIcvLen = 4; - break; - case ZM_TKIP: - *pIvLen = 8; - *pIcvLen = 4; - break; - case ZM_AES: - *pIvLen = 8; - *pIcvLen = 0; - break; -#ifdef ZM_ENABLE_CENC - case ZM_CENC: - *pIvLen = 18; - *pIcvLen = 16; -#endif //ZM_ENABLE_CENC - }/* end of switch */ - } - else - { - if ( (encryMode == ZM_WEP64)|| - (encryMode == ZM_WEP128)|| - (encryMode == ZM_WEP256) ) - { - *pIvLen = 4; - *pIcvLen = 4; - } - else if ( encryMode == ZM_TKIP ) - { - *pIvLen = 8; - *pIcvLen = 4; - } - else if ( encryMode == ZM_AES ) - { - *pIvLen = 8; - *pIcvLen = 8; // AES MIC - } -#ifdef ZM_ENABLE_CENC - else if ( encryMode == ZM_CENC) - { - *pIvLen = 18; - *pIcvLen= 16; - } -#endif //ZM_ENABLE_CENC - } -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAgingDefragList */ -/* Force flushing whole defrag list or aging the buffer */ -/* in the defrag list. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* flushFlag : 1=>flushing, 0=>Aging */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2007.1 */ -/* */ -/************************************************************************/ -void zfAgingDefragList(zdev_t* dev, u16_t flushFlag) -{ - u16_t i, j; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - for(i=0; idefragTable.defragEntry[i].fragCount != 0 ) - { - if (((wd->tick - wd->defragTable.defragEntry[i].tick) > - (ZM_DEFRAG_AGING_TIME_SEC * ZM_TICK_PER_SECOND)) - || (flushFlag != 0)) - { - zm_msg1_rx(ZM_LV_2, "Aging defrag list :", i); - /* Free the buffers in the defrag list */ - for (j=0; jdefragTable.defragEntry[i].fragCount; j++) - { - zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[j], 0); - } - } - } - wd->defragTable.defragEntry[i].fragCount = 0; - } - - zmw_leave_critical_section(dev); - - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAddFirstFragToDefragList */ -/* Add first fragment to defragment list, the first empty entry */ -/* will be selected. If the list is full, sequentially select */ -/* one entry for replacement. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : first fragment buffer */ -/* addr : address of first fragment buffer */ -/* seqNum : sequence of first fragment buffer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2007.1 */ -/* */ -/************************************************************************/ -void zfAddFirstFragToDefragList(zdev_t* dev, zbuf_t* buf, u8_t* addr, u16_t seqNum) -{ - u16_t i, j; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - /* Find an empty one in defrag list */ - for(i=0; idefragTable.defragEntry[i].fragCount == 0 ) - { - break; - } - } - - /* If full, sequentially replace existing one */ - if (i == ZM_MAX_DEFRAG_ENTRIES) - { - i = wd->defragTable.replaceNum++ & (ZM_MAX_DEFRAG_ENTRIES-1); - /* Free the buffers in the defrag list to be replaced */ - for (j=0; jdefragTable.defragEntry[i].fragCount; j++) - { - zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[j], 0); - } - } - - wd->defragTable.defragEntry[i].fragCount = 1; - wd->defragTable.defragEntry[i].fragment[0] = buf; - wd->defragTable.defragEntry[i].seqNum = seqNum; - wd->defragTable.defragEntry[i].tick = wd->tick; - - for (j=0; j<6; j++) - { - wd->defragTable.defragEntry[i].addr[j] = addr[j]; - } - - zmw_leave_critical_section(dev); - - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfAddFragToDefragList */ -/* Add middle or last fragment to defragment list. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : first fragment buffer */ -/* addr : address of fragment buffer */ -/* seqNum : sequence fragment buffer */ -/* fragNum : fragment number of fragment buffer */ -/* moreFrag : more frag bit of fragment buffer */ -/* addInfo : addition info of fragment buffer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2007.1 */ -/* */ -/************************************************************************/ -zbuf_t* zfAddFragToDefragList(zdev_t* dev, zbuf_t* buf, u8_t* addr, - u16_t seqNum, u8_t fragNum, u8_t moreFrag, - struct zsAdditionInfo* addInfo) -{ - u16_t i, j, k; - zbuf_t* returnBuf = NULL; - u16_t defragDone = 0; - u16_t lenErr = 0; - u16_t startAddr, fragHead, frameLen, ivLen, icvLen; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - /* Find frag in the defrag list */ - for(i=0; idefragTable.defragEntry[i].fragCount != 0 ) - { - /* Compare address */ - for (j=0; j<6; j++) - { - if (addr[j] != wd->defragTable.defragEntry[i].addr[j]) - { - break; - } - } - if (j == 6) - { - /* Compare sequence and fragment number */ - if (seqNum == wd->defragTable.defragEntry[i].seqNum) - { - if ((fragNum == wd->defragTable.defragEntry[i].fragCount) - && (fragNum < 8)) - { - /* Add frag frame to defrag list */ - wd->defragTable.defragEntry[i].fragment[fragNum] = buf; - wd->defragTable.defragEntry[i].fragCount++; - defragDone = 1; - - if (moreFrag == 0) - { - /* merge all fragment if more data bit is cleared */ - returnBuf = wd->defragTable.defragEntry[i].fragment[0]; - startAddr = zfwBufGetSize(dev, returnBuf); - /* skip WLAN header 24(Data) or 26(QoS Data) */ - fragHead = 24 + ((zmw_rx_buf_readh(dev, returnBuf, 0) & 0x80) >> 6); - zfGetRxIvIcvLength(dev, returnBuf, 0, &ivLen, &icvLen, addInfo); - fragHead += ivLen; /* skip IV */ - for(k=1; kdefragTable.defragEntry[i].fragCount; k++) - { - frameLen = zfwBufGetSize(dev, - wd->defragTable.defragEntry[i].fragment[k]); - if ((startAddr+frameLen-fragHead) < 1560) - { - zfRxBufferCopy(dev, returnBuf, wd->defragTable.defragEntry[i].fragment[k], - startAddr, fragHead, frameLen-fragHead); - startAddr += (frameLen-fragHead); - } - else - { - lenErr = 1; - } - zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[k], 0); - } - - wd->defragTable.defragEntry[i].fragCount = 0; - zfwBufSetSize(dev, returnBuf, startAddr); - } - break; - } - } - } - } - } - - zmw_leave_critical_section(dev); - - if (lenErr == 1) - { - zfwBufFree(dev, returnBuf, 0); - return NULL; - } - if (defragDone == 0) - { - zfwBufFree(dev, buf, 0); - return NULL; - } - - return returnBuf; -} - - -/* return value = NULL => save or free this frame */ -zbuf_t* zfDefragment(zdev_t* dev, zbuf_t* buf, u8_t* pbIsDefrag, - struct zsAdditionInfo* addInfo) -{ - u8_t fragNum; - u16_t seqNum; - u8_t moreFragBit; - u8_t addr[6]; - u16_t i; - zmw_get_wlan_dev(dev); - - ZM_BUFFER_TRACE(dev, buf) - - *pbIsDefrag = FALSE; - seqNum = zmw_buf_readh(dev, buf, 22); - fragNum = (u8_t)(seqNum & 0xf); - moreFragBit = (zmw_buf_readb(dev, buf, 1) & ZM_BIT_2) >> 2; - - if ((fragNum == 0) && (moreFragBit == 0)) - { - /* Not part of a fragmentation */ - - return buf; - } - else - { - wd->commTally.swRxFragmentCount++; - seqNum = seqNum >> 4; - for (i=0; i<6; i++) - { - addr[i] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+i); - } - - if (fragNum == 0) - { - /* more frag = 1 */ - /* First part of a fragmentation */ - zm_msg1_rx(ZM_LV_2, "First Frag, seq=", seqNum); - zfAddFirstFragToDefragList(dev, buf, addr, seqNum); - buf = NULL; - } - else - { - /* Middle or last part of a fragmentation */ - zm_msg1_rx(ZM_LV_2, "Frag seq=", seqNum); - zm_msg1_rx(ZM_LV_2, "Frag moreFragBit=", moreFragBit); - buf = zfAddFragToDefragList(dev, buf, addr, seqNum, fragNum, moreFragBit, addInfo); - if (buf != NULL) - { - *pbIsDefrag = TRUE; - } - } - } - - return buf; -} - - -#if ZM_PROTOCOL_RESPONSE_SIMULATION -u16_t zfSwap(u16_t num) -{ - return ((num >> 8) + ((num & 0xff) << 8)); -} - - -void zfProtRspSim(zdev_t* dev, zbuf_t* buf) -{ - u16_t ethType; - u16_t arpOp; - u16_t prot; - u16_t temp; - u16_t i; - u16_t dip[2]; - u16_t dstPort; - u16_t srcPort; - - ethType = zmw_rx_buf_readh(dev, buf, 12); - zm_msg2_rx(ZM_LV_2, "ethType=", ethType); - - /* ARP */ - if (ethType == 0x0608) - { - arpOp = zmw_rx_buf_readh(dev, buf, 20); - dip[0] = zmw_rx_buf_readh(dev, buf, 38); - dip[1] = zmw_rx_buf_readh(dev, buf, 40); - zm_msg2_rx(ZM_LV_2, "arpOp=", arpOp); - zm_msg2_rx(ZM_LV_2, "ip0=", dip[0]); - zm_msg2_rx(ZM_LV_2, "ip1=", dip[1]); - - //ARP request to 192.168.1.15 - if ((arpOp == 0x0100) && (dip[0] == 0xa8c0) && (dip[1] == 0x0f01)) { - zm_msg0_rx(ZM_LV_2, "ARP"); - /* ARP response */ - zmw_rx_buf_writeh(dev, buf, 20, 0x0200); - - /* dst hardware address */ - - /* src hardware address */ - //zmw_rx_buf_writeh(dev, buf, 6, 0xa000); - //zmw_rx_buf_writeh(dev, buf, 8, 0x0000); - //zmw_rx_buf_writeh(dev, buf, 10, 0x0000); - - /* dst ip address */ - for (i=0; i<5; i++) - { - temp = zmw_rx_buf_readh(dev, buf, 22+(i*2)); - zmw_rx_buf_writeh(dev, buf, 32+(i*2), temp); - } - - /* src hardware address */ - zmw_rx_buf_writeh(dev, buf, 22, 0xa000); - zmw_rx_buf_writeh(dev, buf, 24, 0x0000); - zmw_rx_buf_writeh(dev, buf, 26, 0x0000); - - /* src ip address */ - zmw_rx_buf_writeh(dev, buf, 28, 0xa8c0); - zmw_rx_buf_writeh(dev, buf, 30, 0x0f01); - } - } - /* ICMP */ - else if (ethType == 0x0008) - { - zm_msg0_rx(ZM_LV_2, "IP"); - prot = zmw_rx_buf_readb(dev, buf, 23); - dip[0] = zmw_rx_buf_readh(dev, buf, 30); - dip[1] = zmw_rx_buf_readh(dev, buf, 32); - zm_msg2_rx(ZM_LV_2, "prot=", prot); - zm_msg2_rx(ZM_LV_2, "ip0=", dip[0]); - zm_msg2_rx(ZM_LV_2, "ip1=", dip[1]); - - /* PING request to 192.168.1.15 */ - if ((prot == 0x1) && (dip[0] == 0xa8c0) && (dip[1] == 0x0f01)) - { - zm_msg0_rx(ZM_LV_2, "ICMP"); - /* change dst */ - for (i=0; i<3; i++) - { - temp = zmw_rx_buf_readh(dev, buf, 6+(i*2)); - zmw_rx_buf_writeh(dev, buf, i*2, temp); - } - /* change src */ - zmw_rx_buf_writeh(dev, buf, 6, 0xa000); - zmw_rx_buf_writeh(dev, buf, 8, 0x0000); - zmw_rx_buf_writeh(dev, buf, 10, 0x0000); - - /* exchange src ip and dst ip */ - for (i=0; i<2; i++) - { - temp = zmw_rx_buf_readh(dev, buf, 26+(i*2)); - zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp); - } - zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0); - zmw_rx_buf_writeh(dev, buf, 28, 0x0f01); - - /* change icmp type to echo reply */ - zmw_rx_buf_writeb(dev, buf, 34, 0x0); - - /* update icmp checksum */ - temp = zmw_rx_buf_readh(dev, buf, 36); - temp += 8; - zmw_rx_buf_writeh(dev, buf, 36, temp); - } - else if (prot == 0x6) - { - zm_msg0_rx(ZM_LV_2, "TCP"); - srcPort = zmw_rx_buf_readh(dev, buf, 34); - dstPort = zmw_rx_buf_readh(dev, buf, 36); - zm_msg2_rx(ZM_LV_2, "Src Port=", srcPort); - zm_msg2_rx(ZM_LV_2, "Dst Port=", dstPort); - if ((dstPort == 0x1500) || (srcPort == 0x1500)) - { - zm_msg0_rx(ZM_LV_2, "FTP"); - - /* change dst */ - for (i=0; i<3; i++) - { - temp = zmw_rx_buf_readh(dev, buf, 6+(i*2)); - zmw_rx_buf_writeh(dev, buf, i*2, temp); - } - /* change src */ - zmw_rx_buf_writeh(dev, buf, 6, 0xa000); - zmw_rx_buf_writeh(dev, buf, 8, 0x0000); - zmw_rx_buf_writeh(dev, buf, 10, 0x0000); - - /* exchange src ip and dst ip */ - for (i=0; i<2; i++) - { - temp = zmw_rx_buf_readh(dev, buf, 26+(i*2)); - zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp); - } - zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0); - zmw_rx_buf_writeh(dev, buf, 28, 0x0f01); -#if 0 - /* Patch src port */ - temp = zmw_rx_buf_readh(dev, buf, 34); - temp = zfSwap(zfSwap(temp) + 1); - zmw_rx_buf_writeh(dev, buf, 34, temp); - temp = zmw_rx_buf_readh(dev, buf, 38); - temp = zfSwap(zfSwap(temp) + 1); - zmw_rx_buf_writeh(dev, buf, 38, temp); - - /* Patch checksum */ - temp = zmw_rx_buf_readh(dev, buf, 50); - temp = zfSwap(temp); - temp = ~temp; - temp += 2; - temp = ~temp; - temp = zfSwap(temp); - zmw_rx_buf_writeh(dev, buf, 50, temp); -#endif - } - - } - else if (prot == 0x11) - { - /* change dst */ - for (i=0; i<3; i++) - { - temp = zmw_rx_buf_readh(dev, buf, 6+(i*2)); - zmw_rx_buf_writeh(dev, buf, i*2, temp); - } - /* change src */ - zmw_rx_buf_writeh(dev, buf, 6, 0xa000); - zmw_rx_buf_writeh(dev, buf, 8, 0x0000); - zmw_rx_buf_writeh(dev, buf, 10, 0x0000); - - zm_msg0_rx(ZM_LV_2, "UDP"); - srcPort = zmw_rx_buf_readh(dev, buf, 34); - dstPort = zmw_rx_buf_readh(dev, buf, 36); - zm_msg2_rx(ZM_LV_2, "Src Port=", srcPort); - zm_msg2_rx(ZM_LV_2, "Dst Port=", dstPort); - - /* exchange src ip and dst ip */ - for (i=0; i<2; i++) - { - temp = zmw_rx_buf_readh(dev, buf, 26+(i*2)); - zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp); - } - zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0); - zmw_rx_buf_writeh(dev, buf, 28, 0x0f01); - - /* exchange port */ - zmw_rx_buf_writeh(dev, buf, 34, srcPort+1); - zmw_rx_buf_writeh(dev, buf, 36, dstPort); - - /* checksum = 0 */ - zmw_rx_buf_writeh(dev, buf, 40, 0); - } - - } - else if (ethType == 0x0060) /* =>0x0060 is port */ - { - /* change src for Evl tool loop back receive */ - zmw_rx_buf_writeh(dev, buf, 6, 0xa000); - zmw_rx_buf_writeh(dev, buf, 8, 0x0000); - zmw_rx_buf_writeh(dev, buf, 10, 0x0000); - } - -} -#endif - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiTxSendEth */ -/* Called to native 802.11 management frames */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer pointer */ -/* port : WLAN port, 0=>standard, 0x1-0x7=>VAP, 0x20-0x25=>WDS */ -/* */ -/* OUTPUTS */ -/* error code */ -/* */ -/* AUTHOR */ -/* Ray ZyDAS Technology Corporation 2005.5 */ -/* */ -/************************************************************************/ -u16_t zfiTxSend80211Mgmt(zdev_t* dev, zbuf_t* buf, u16_t port) -{ - u16_t err; - //u16_t addrTblSize = 0; - //struct zsAddrTbl addrTbl; - u16_t hlen; - u16_t header[(24+25+1)/2]; - int i; - - for(i=0;i<12;i++) - { - header[i] = zmw_buf_readh(dev, buf, i); - } - hlen = 24; - - zfwBufRemoveHead(dev, buf, 24); - - err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0, - ZM_EXTERNAL_ALLOC_BUF, 0, 0); - if (err != ZM_SUCCESS) - { - goto zlError; - } - - return 0; - -zlError: - - zfwBufFree(dev, buf, 0); - return 0; -} - -u8_t zfiIsTxQueueFull(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if ((((wd->vtxqHead[0] + 1) & ZM_VTXQ_SIZE_MASK) != wd->vtxqTail[0]) ) - { - zmw_leave_critical_section(dev); - return 0; - } - else - { - zmw_leave_critical_section(dev); - return 1; - } -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiTxSendEth */ -/* Called to transmit Ethernet frame from upper layer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer pointer */ -/* port : WLAN port, 0=>standard, 0x1-0x7=>VAP, 0x20-0x25=>WDS */ -/* */ -/* OUTPUTS */ -/* error code */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2005.5 */ -/* */ -/************************************************************************/ -u16_t zfiTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port) -{ - u16_t err, ret; - - zmw_get_wlan_dev(dev); - - ZM_PERFORMANCE_TX_MSDU(dev, wd->tick); - zm_msg1_tx(ZM_LV_2, "zfiTxSendEth(), port=", port); - /* Return error if port is disabled */ - err = zfTxPortControl(dev, buf, port); - if (err == ZM_PORT_DISABLED) - { - err = ZM_ERR_TX_PORT_DISABLED; - goto zlError; - } - -#if 1 - if ((wd->wlanMode == ZM_MODE_AP) && (port < 0x20)) - { - /* AP : Buffer frame for power saving STA */ - ret = zfApBufferPsFrame(dev, buf, port); - if (ret == 1) - { - return ZM_SUCCESS; - } - } - else -#endif - if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) - { - if ( zfPowerSavingMgrIsSleeping(dev) ) - { - /*check ZM_ENABLE_POWER_SAVE flag*/ - zfPowerSavingMgrWakeup(dev); - } - } -#ifdef ZM_ENABLE_IBSS_PS - /* IBSS power-saving mode */ - else if ( wd->wlanMode == ZM_MODE_IBSS ) - { - if ( zfStaIbssPSQueueData(dev, buf) ) - { - return ZM_SUCCESS; - } - } -#endif - -#if 1 - //if ( wd->bQoSEnable ) - if (1) - { - /* Put to VTXQ[ac] */ - ret = zfPutVtxq(dev, buf); - - /* Push VTXQ[ac] */ - zfPushVtxq(dev); - } - else - { - ret = zfTxSendEth(dev, buf, port, ZM_EXTERNAL_ALLOC_BUF, 0); - } - - return ret; -#else - return zfTxSendEth(dev, buf, port, ZM_EXTERNAL_ALLOC_BUF, 0); -#endif - -zlError: - zm_msg2_tx(ZM_LV_1, "Tx Comp err=", err); - - zfwBufFree(dev, buf, err); - return err; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfTxSendEth */ -/* Called to transmit Ethernet frame from upper layer. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : buffer pointer */ -/* port : WLAN port, 0=>standard, 0x10-0x17=>VAP, 0x20-0x25=>WDS */ -/* */ -/* OUTPUTS */ -/* error code */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2005.5 */ -/* */ -/************************************************************************/ -u16_t zfTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port, u16_t bufType, u16_t flag) -{ - //u16_t addrTblSize; - //struct zsAddrTbl addrTbl; - u16_t removeLen; - u16_t header[(8+30+2+18)/2]; /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */ - u16_t headerLen; - u16_t mic[8/2]; - u16_t micLen; - u16_t snap[8/2]; - u16_t snapLen; - u16_t fragLen; - u16_t frameLen; - u16_t fragNum; - struct zsFrag frag; - u16_t i, j, id; - u16_t offset; - u16_t da[3]; - u16_t sa[3]; - u8_t up; - u8_t qosType, keyIdx = 0; - u16_t fragOff; - u16_t newFlag; - u8_t tkipFrameOffset = 0; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - newFlag = flag & 0xff00; - flag = flag & 0xff; - - zm_msg1_tx(ZM_LV_2, "zfTxSendEth(), port=", port); - - /* Get IP TOS for QoS AC and IP frag offset */ - zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff); - - //EOSP bit - if (newFlag & 0x100) - { - up |= 0x10; - } - -#ifdef ZM_ENABLE_NATIVE_WIFI - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - /* DA */ - da[0] = zmw_tx_buf_readh(dev, buf, 16); - da[1] = zmw_tx_buf_readh(dev, buf, 18); - da[2] = zmw_tx_buf_readh(dev, buf, 20); - /* SA */ - sa[0] = zmw_tx_buf_readh(dev, buf, 10); - sa[1] = zmw_tx_buf_readh(dev, buf, 12); - sa[2] = zmw_tx_buf_readh(dev, buf, 14); - } - else if ( wd->wlanMode == ZM_MODE_IBSS ) - { - /* DA */ - da[0] = zmw_tx_buf_readh(dev, buf, 4); - da[1] = zmw_tx_buf_readh(dev, buf, 6); - da[2] = zmw_tx_buf_readh(dev, buf, 8); - /* SA */ - sa[0] = zmw_tx_buf_readh(dev, buf, 10); - sa[1] = zmw_tx_buf_readh(dev, buf, 12); - sa[2] = zmw_tx_buf_readh(dev, buf, 14); - } - else if ( wd->wlanMode == ZM_MODE_AP ) - { - /* DA */ - da[0] = zmw_tx_buf_readh(dev, buf, 4); - da[1] = zmw_tx_buf_readh(dev, buf, 6); - da[2] = zmw_tx_buf_readh(dev, buf, 8); - /* SA */ - sa[0] = zmw_tx_buf_readh(dev, buf, 16); - sa[1] = zmw_tx_buf_readh(dev, buf, 18); - sa[2] = zmw_tx_buf_readh(dev, buf, 20); - } - else - { - // - } -#else - /* DA */ - da[0] = zmw_tx_buf_readh(dev, buf, 0); - da[1] = zmw_tx_buf_readh(dev, buf, 2); - da[2] = zmw_tx_buf_readh(dev, buf, 4); - /* SA */ - sa[0] = zmw_tx_buf_readh(dev, buf, 6); - sa[1] = zmw_tx_buf_readh(dev, buf, 8); - sa[2] = zmw_tx_buf_readh(dev, buf, 10); -#endif - //Decide Key Index in ATOM, No meaning in OTUS--CWYang(m) - if (wd->wlanMode == ZM_MODE_AP) - { - keyIdx = wd->ap.bcHalKeyIdx[port]; - id = zfApFindSta(dev, da); - if (id != 0xffff) - { - switch (wd->ap.staTable[id].encryMode) - { - case ZM_AES: - case ZM_TKIP: -#ifdef ZM_ENABLE_CENC - case ZM_CENC: -#endif //ZM_ENABLE_CENC - keyIdx = wd->ap.staTable[id].keyIdx; - break; - } - } - } - else - { - switch (wd->sta.encryMode) - { - case ZM_WEP64: - case ZM_WEP128: - case ZM_WEP256: - keyIdx = wd->sta.keyId; - break; - case ZM_AES: - case ZM_TKIP: - if ((da[0] & 0x1)) - keyIdx = 5; - else - keyIdx = 4; - break; -#ifdef ZM_ENABLE_CENC - case ZM_CENC: - keyIdx = wd->sta.cencKeyId; - break; -#endif //ZM_ENABLE_CENC - } - } - - /* Create SNAP */ - removeLen = zfTxGenWlanSnap(dev, buf, snap, &snapLen); - //zm_msg1_tx(ZM_LV_0, "fragOff=", fragOff); - - -/* ********************************************************************************************** */ -/* Add 20071025 Mxzeng */ -/* ********************************************************************************************** */ -/* ---------------------------------------------------------------------------------------------- */ -/* Ethernet : frameLen = zfwBufGetSize(dev, buf); */ -/* ---+--6--+--6--+--2--+-----20-----+-------------------------+------ Variable -------+--------- */ -/* | DA | SA | Type| IP Header | TCP(20) UDP(12) ICMP(8) | Application Payload L | */ -/* ---+-----+-----+-----+------------+-------------------------+-----------------------+--------- */ -/* MSDU = 6 + 6 + 2 + ( Network Layer header ) + ( Transport Layer header ) + L */ -/* */ -/* MSDU - DA - SA : frameLen -= removeLen; */ -/* ---+--2--+-----20-----+-------------------------+------ Variable -------+--------------------- */ -/* | Type| IP Header | TCP(20) UDP(12) ICMP(8) | Application Payload L | */ -/* ---+-----+------------+-------------------------+-----------------------+--------------------- */ -/* */ -/* MPDU : frameLen + mpduLengthOffset ; */ -/* -+---2---+----2---+-6-+-6-+--6--+---2----+--1--+--1-+---1---+-------3------+-frameLen-+---4--+- */ -/* | frame |duration| DA|SA |BSSID|sequence|SNAP |SNAP|Control| RFC 1042 | | FCS | */ -/* |Control| | | | | number |DSAP |SSAP| | encapsulation| | | */ -/* -+-------+--------+---+---+-----+--------+-----+----+-------+--------------+----------+------+- */ -/* ----------------------------------------------------------------------------------------------- */ - - if ( wd->sta.encryMode == ZM_TKIP ) - tkipFrameOffset = 8; - - fragLen = wd->fragThreshold + tkipFrameOffset; // Fragmentation threshold for MPDU Lengths - frameLen = zfwBufGetSize(dev, buf); // MSDU Lengths - frameLen -= removeLen; // MSDU Lengths - DA - SA - - /* #1st create MIC Length manually */ - micLen = 0; - - /* Access Category */ - if (wd->wlanMode == ZM_MODE_AP) - { - zfApGetStaQosType(dev, da, &qosType); - if (qosType == 0) - { - up = 0; - } - } - else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) - { - if (wd->sta.wmeConnected == 0) - { - up = 0; - } - } - else - { - /* TODO : STA QoS control field */ - up = 0; - } - - /* #2nd Assign sequence number */ - zmw_enter_critical_section(dev); - frag.seq[0] = ((wd->seq[zcUpToAc[up&0x7]]++) << 4); - zmw_leave_critical_section(dev); - - /* #3rd Pass the total payload to generate MPDU length ! */ - frag.buf[0] = buf; - frag.bufType[0] = bufType; - frag.flag[0] = (u8_t)flag; - fragNum = 1; - - headerLen = zfTxGenWlanHeader(dev, frag.buf[0], header, frag.seq[0], - frag.flag[0], snapLen+micLen, removeLen, port, da, sa, - up, &micLen, snap, snapLen, NULL); - - //zm_debug_msg1("#1 headerLen = ", headerLen); - - /* #4th Check the HeaderLen and determine whether the MPDU Lengths bigger than Fragmentation threshold */ - /* If MPDU Lengths large than fragmentation threshold --> headerLen = 0 */ - if( headerLen != 0 ) - { - zf80211FrameSend(dev, frag.buf[0], header, snapLen, da, sa, up, - headerLen, snap, mic, micLen, removeLen, frag.bufType[0], - zcUpToAc[up&0x7], keyIdx); - } - else //if( headerLen == 0 ) // Need to be fragmented - { - u16_t mpduLengthOffset; - u16_t pseudSnapLen = 0; - - mpduLengthOffset = header[0] - frameLen; // For fragmentation threshold ! - - micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic); // Get snap and mic information - - fragLen = fragLen - mpduLengthOffset; - - //zm_debug_msg1("#2 frameLen = ", frameLen); - //zm_debug_msg1("#3 fragThreshold = ", fragLen); - - /* fragmentation */ - if (frameLen >= fragLen) - { - //copy fragLen to frag - i = 0; - while( frameLen > 0 ) - { - frag.buf[i] = zfwBufAllocate(dev, fragLen+32); - if (frag.buf[i] != NULL) - { - frag.bufType[i] = ZM_INTERNAL_ALLOC_BUF; - frag.seq[i] = frag.seq[0] + i; - offset = removeLen + i*fragLen; - - /* Consider the offset if we consider snap length to the other fragmented frame */ - if ( i >= 1 ) - offset = offset + pseudSnapLen*(i-1); - - if (frameLen > fragLen + pseudSnapLen) - { - frag.flag[i] = flag | 0x4; /* More data */ - /* First fragment */ - if (i == 0) - { - /* Add SNAP */ - for (j=0; j>1)]); - } - zfTxBufferCopy(dev, frag.buf[i], buf, snapLen, offset, fragLen); - zfwBufSetSize(dev, frag.buf[i], snapLen+fragLen); - - /* Add pseud snap length to the other fragmented frame */ - pseudSnapLen = snapLen; - - frameLen -= fragLen; - } - /* Intermediate Fragment */ - else - { - //zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, fragLen); - //zfwBufSetSize(dev, frag.buf[i], fragLen); - - zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, fragLen+pseudSnapLen ); - zfwBufSetSize(dev, frag.buf[i], fragLen+pseudSnapLen); - - frameLen -= (fragLen+pseudSnapLen); - } - //frameLen -= fragLen; - } - else - { - /* Last fragment */ - zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, frameLen); - /* Add MIC if need */ - if ( micLen ) - { - zfCopyToRxBuffer(dev, frag.buf[i], (u8_t*) mic, frameLen, micLen); - } - zfwBufSetSize(dev, frag.buf[i], frameLen+micLen); - frameLen = 0; - frag.flag[i] = (u8_t)flag; /* No more data */ - } - i++; - } - else - { - break; - } - - // Please pay attention to the index of the buf !!! - // If write to null buf , the OS will crash !!! - zfwCopyBufContext(dev, buf, frag.buf[i-1]); - } - fragNum = i; - snapLen = micLen = removeLen = 0; - - zfwBufFree(dev, buf, 0); - } - - for (i=0; istandard, 10-17=>Virtual AP, 20-25=>WDS */ -/* */ -/* OUTPUTS */ -/* ZM_PORT_ENABLED or ZM_PORT_DISABLE */ -/* */ -/* AUTHOR */ -/* Signature ZyDAS Technology Corporation 2005.4 */ -/* */ -/************************************************************************/ -u16_t zfTxPortControl(zdev_t* dev, zbuf_t* buf, u16_t port) -{ - zmw_get_wlan_dev(dev); - - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - if ( wd->sta.adapterState == ZM_STA_STATE_DISCONNECT ) - { - zm_msg0_tx(ZM_LV_3, "Packets dropped due to disconnect state"); - return ZM_PORT_DISABLED; - } - } - - return ZM_PORT_ENABLED; -} - - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfIdlRecv */ -/* Do frame validation and filtering then pass to zfwRecv80211(). */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : received 802.11 frame buffer. */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo) -{ - u16_t ret = 0; - u16_t bssid[3]; - struct agg_tid_rx *tid_rx; - zmw_get_wlan_dev(dev); - - ZM_BUFFER_TRACE(dev, buf) - - /* tally */ - wd->commTally.DriverRxFrmCnt++; - - bssid[0] = zmw_buf_readh(dev, buf, 16); - bssid[1] = zmw_buf_readh(dev, buf, 18); - bssid[2] = zmw_buf_readh(dev, buf, 20); - - /* Validate Rx frame */ - ret = zfWlanRxValidate(dev, buf); - if (ret != ZM_SUCCESS) - { - zm_msg1_rx(ZM_LV_1, "Rx invalid:", ret); - goto zlError; - } - -#ifdef ZM_ENABLE_AGGREGATION - //#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION - /* - * add by honda - */ - tid_rx = zfAggRxEnabled(dev, buf); - if (tid_rx && wd->reorder) - { - zfAggRx(dev, buf, addInfo, tid_rx); - - return; - } - /* - * end of add by honda - */ - //#endif -#endif - - /* Filter Rx frame */ - ret = zfWlanRxFilter(dev, buf); - if (ret != ZM_SUCCESS) - { - zm_msg1_rx(ZM_LV_1, "Rx duplicated:", ret); - goto zlError; - } - - /* Discard error frame except mic failure */ - if ((addInfo->Tail.Data.ErrorIndication & 0x3f) != 0) - { - if ( wd->XLinkMode && ((addInfo->Tail.Data.ErrorIndication & 0x3f)==0x10) && - zfCompareWithBssid(dev, bssid) ) - { - // Bypass frames !!! - } - else - { - goto zlError; - } - } - - - /* OTUS command-8212 dump rx packet */ - if (wd->rxPacketDump) - { - zfwDumpBuf(dev, buf); - } - - /* Call zfwRecv80211() wrapper function to deliver Rx packet */ - /* to driver framework. */ - - if (wd->zfcbRecv80211 != NULL) - { - wd->zfcbRecv80211(dev, buf, addInfo); //CWYang(m) - } - else - { - zfiRecv80211(dev, buf, addInfo); - } - return; - -zlError: - zm_msg1_rx(ZM_LV_1, "Free packet, error code:", ret); - - wd->commTally.DriverDiscardedFrm++; - - /* Free Rx buffer */ - zfwBufFree(dev, buf, 0); - - return; -} - - -void zfShowRxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - u8_t packetType, keyType, code, identifier, type, flags; - u16_t packetLen, keyInfo, keyLen, keyDataLen, length, Op_Code; - u32_t replayCounterH, replayCounterL, vendorId, VendorType; - - /* EAPOL packet type */ - packetType = zmw_rx_buf_readb(dev, buf, offset+1); // 0: EAP-Packet - // 1: EAPOL-Start - // 2: EAPOL-Logoff - // 3: EAPOL-Key - // 4: EAPOL-Encapsulated-ASF-Alert - - /* EAPOL frame format */ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ - /* ----------------------------------------------- */ - /* PAE Ethernet Type (0x888e) */ - /* ----------------------------------------------- 2 */ - /* Protocol Version | Type */ - /* ----------------------------------------------- 4 */ - /* Length */ - /* ----------------------------------------------- 6 */ - /* Packet Body */ - /* ----------------------------------------------- N */ - - /* EAPOL body length */ - packetLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+2)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+3); - - if( packetType == 0 ) - { // EAP-Packet - - /* EAP-Packet Code */ - code = zmw_rx_buf_readb(dev, buf, offset+4); // 1 : Request - // 2 : Response - // 3 : Success - // 4 : Failure - // An EAP packet of the type of Success and Failure has no Data field, and has a length of 4. - - /* EAP Packet format */ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ - /* ----------------------------------------------- */ - /* Code | Identifier */ - /* ----------------------------------------------- 2 */ - /* Length */ - /* ----------------------------------------------- 4 */ - /* Data */ - /* ----------------------------------------------- N */ - - zm_debug_msg0("EAP-Packet"); - zm_debug_msg1("Packet Length = ", packetLen); - zm_debug_msg1("EAP-Packet Code = ", code); - - if( code == 1 ) - { - zm_debug_msg0("EAP-Packet Request"); - - /* EAP-Packet Identifier */ - identifier = zmw_rx_buf_readb(dev, buf, offset+5); - /* EAP-Packet Length */ - length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+7); - /* EAP-Packet Type */ - type = zmw_rx_buf_readb(dev, buf, offset+8); // 1 : Identity - // 2 : Notification - // 3 : Nak (Response Only) - // 4 : MD5-Challenge - // 5 : One Time Password (OTP) - // 6 : Generic Token Card (GTC) - // 254 : (Expanded Types)Wi-Fi Protected Setup - // 255 : Experimental Use - - /* The data field in an EAP packet of the type of Request or Response is in the format shown bellowing */ - /* 0 1 2 3 4 5 6 7 N */ - /* ----------------------------------------------- */ - /* Type | Type Data */ - /* ----------------------------------------------- */ - - zm_debug_msg1("EAP-Packet Identifier = ", identifier); - zm_debug_msg1("EAP-Packet Length = ", length); - zm_debug_msg1("EAP-Packet Type = ", type); - - if( type == 1 ) - { - zm_debug_msg0("EAP-Packet Request Identity"); - } - else if( type == 2 ) - { - zm_debug_msg0("EAP-Packet Request Notification"); - } - else if( type == 4 ) - { - zm_debug_msg0("EAP-Packet Request MD5-Challenge"); - } - else if( type == 5 ) - { - zm_debug_msg0("EAP-Packet Request One Time Password"); - } - else if( type == 6 ) - { - zm_debug_msg0("EAP-Packet Request Generic Token Card"); - } - else if( type == 254 ) - { - zm_debug_msg0("EAP-Packet Request Wi-Fi Protected Setup"); - - /* 0 1 2 3 */ - /* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */ - /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/ - /*| Type | Vendor-Id |*/ - /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/ - /*| Vendor-Type |*/ - /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/ - /*| Vendor data... */ - /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - - /* EAP-Packet Vendor ID */ - vendorId = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 16) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+11); - /* EAP-Packet Vendor Type */ - VendorType = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+12)) << 24) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 16) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+15); - /* EAP-Packet Op Code */ - Op_Code = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+16)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+17); - /* EAP-Packet Flags */ - flags = zmw_rx_buf_readb(dev, buf, offset+18); - - zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId); - zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType); - zm_debug_msg1("EAP-Packet Op Code = ", Op_Code); - zm_debug_msg1("EAP-Packet Flags = ", flags); - } - } - else if( code == 2 ) - { - zm_debug_msg0("EAP-Packet Response"); - - /* EAP-Packet Identifier */ - identifier = zmw_rx_buf_readb(dev, buf, offset+5); - /* EAP-Packet Length */ - length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+7); - /* EAP-Packet Type */ - type = zmw_rx_buf_readb(dev, buf, offset+8); - - zm_debug_msg1("EAP-Packet Identifier = ", identifier); - zm_debug_msg1("EAP-Packet Length = ", length); - zm_debug_msg1("EAP-Packet Type = ", type); - - if( type == 1 ) - { - zm_debug_msg0("EAP-Packet Response Identity"); - } - else if( type == 2 ) - { - zm_debug_msg0("EAP-Packet Request Notification"); - } - else if( type == 3 ) - { - zm_debug_msg0("EAP-Packet Request Nak"); - } - else if( type == 4 ) - { - zm_debug_msg0("EAP-Packet Request MD5-Challenge"); - } - else if( type == 5 ) - { - zm_debug_msg0("EAP-Packet Request One Time Password"); - } - else if( type == 6 ) - { - zm_debug_msg0("EAP-Packet Request Generic Token Card"); - } - else if( type == 254 ) - { - zm_debug_msg0("EAP-Packet Response Wi-Fi Protected Setup"); - - /* EAP-Packet Vendor ID */ - vendorId = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 16) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+11); - /* EAP-Packet Vendor Type */ - VendorType = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+12)) << 24) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 16) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+15); - /* EAP-Packet Op Code */ - Op_Code = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+16)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+17); - /* EAP-Packet Flags */ - flags = zmw_rx_buf_readb(dev, buf, offset+18); - - zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId); - zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType); - zm_debug_msg1("EAP-Packet Op Code = ", Op_Code); - zm_debug_msg1("EAP-Packet Flags = ", flags); - } - } - else if( code == 3 ) - { - zm_debug_msg0("EAP-Packet Success"); - - /* EAP-Packet Identifier */ - identifier = zmw_rx_buf_readb(dev, buf, offset+5); - /* EAP-Packet Length */ - length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+7); - - zm_debug_msg1("EAP-Packet Identifier = ", identifier); - zm_debug_msg1("EAP-Packet Length = ", length); - } - else if( code == 4 ) - { - zm_debug_msg0("EAP-Packet Failure"); - - /* EAP-Packet Identifier */ - identifier = zmw_rx_buf_readb(dev, buf, offset+5); - /* EAP-Packet Length */ - length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+7); - - zm_debug_msg1("EAP-Packet Identifier = ", identifier); - zm_debug_msg1("EAP-Packet Length = ", length); - } - } - else if( packetType == 1 ) - { // EAPOL-Start - zm_debug_msg0("EAPOL-Start"); - } - else if( packetType == 2 ) - { // EAPOL-Logoff - zm_debug_msg0("EAPOL-Logoff"); - } - else if( packetType == 3 ) - { // EAPOL-Key - /* EAPOL-Key type */ - keyType = zmw_rx_buf_readb(dev, buf, offset+4); - /* EAPOL-Key information */ - keyInfo = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+5)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+6); - /* EAPOL-Key length */ - keyLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+7)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+8); - /* EAPOL-Key replay counter (high double word) */ - replayCounterH = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 24) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 16) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+11)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+12); - /* EAPOL-Key replay counter (low double word) */ - replayCounterL = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 24) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 16) + - (((u32_t) zmw_rx_buf_readb(dev, buf, offset+15)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+16); - /* EAPOL-Key data length */ - keyDataLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+97)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+98); - - zm_debug_msg0("EAPOL-Key"); - zm_debug_msg1("packet length = ", packetLen); - - if ( keyType == 254 ) - { - zm_debug_msg0("key type = 254 (SSN key descriptor)"); - } - else - { - zm_debug_msg2("key type = 0x", keyType); - } - - zm_debug_msg2("replay counter(L) = ", replayCounterL); - - zm_debug_msg2("key information = ", keyInfo); - - if ( keyInfo & ZM_BIT_3 ) - { - zm_debug_msg0(" - pairwise key"); - } - else - { - zm_debug_msg0(" - group key"); - } - - if ( keyInfo & ZM_BIT_6 ) - { - zm_debug_msg0(" - Tx key installed"); - } - else - { - zm_debug_msg0(" - Tx key not set"); - } - - if ( keyInfo & ZM_BIT_7 ) - { - zm_debug_msg0(" - Ack needed"); - } - else - { - zm_debug_msg0(" - Ack not needed"); - } - - if ( keyInfo & ZM_BIT_8 ) - { - zm_debug_msg0(" - MIC set"); - } - else - { - zm_debug_msg0(" - MIC not set"); - } - - if ( keyInfo & ZM_BIT_9 ) - { - zm_debug_msg0(" - packet encrypted"); - } - else - { - zm_debug_msg0(" - packet not encrypted"); - } - - zm_debug_msg1("keyLen = ", keyLen); - zm_debug_msg1("keyDataLen = ", keyDataLen); - } - else if( packetType == 4 ) - { - zm_debug_msg0("EAPOL-Encapsulated-ASF-Alert"); - } -} - -void zfShowTxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset) -{ - u8_t packetType, keyType, code, identifier, type, flags; - u16_t packetLen, keyInfo, keyLen, keyDataLen, length, Op_Code; - u32_t replayCounterH, replayCounterL, vendorId, VendorType; - - zm_debug_msg1("EAPOL Packet size = ", zfwBufGetSize(dev, buf)); - - /* EAPOL packet type */ - // 0: EAP-Packet - // 1: EAPOL-Start - // 2: EAPOL-Logoff - // 3: EAPOL-Key - // 4: EAPOL-Encapsulated-ASF-Alert - - /* EAPOL frame format */ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ - /* ----------------------------------------------- */ - /* PAE Ethernet Type (0x888e) */ - /* ----------------------------------------------- 2 */ - /* Protocol Version | Type */ - /* ----------------------------------------------- 4 */ - /* Length */ - /* ----------------------------------------------- 6 */ - /* Packet Body */ - /* ----------------------------------------------- N */ - - packetType = zmw_tx_buf_readb(dev, buf, offset+1); - /* EAPOL body length */ - packetLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+2)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+3); - - if( packetType == 0 ) - { // EAP-Packet - /* EAP-Packet Code */ - code = zmw_tx_buf_readb(dev, buf, offset+4); // 1 : Request - // 2 : Response - // 3 : Success - // 4 : Failure - - // An EAP packet of the type of Success and Failure has no Data field, and has a length of 4. - - /* EAP Packet format */ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ - /* ----------------------------------------------- */ - /* Code | Identifier */ - /* ----------------------------------------------- 2 */ - /* Length */ - /* ----------------------------------------------- 4 */ - /* Data */ - /* ----------------------------------------------- N */ - - zm_debug_msg0("EAP-Packet"); - zm_debug_msg1("Packet Length = ", packetLen); - zm_debug_msg1("EAP-Packet Code = ", code); - - if( code == 1 ) - { - zm_debug_msg0("EAP-Packet Request"); - - /* EAP-Packet Identifier */ - identifier = zmw_tx_buf_readb(dev, buf, offset+5); - /* EAP-Packet Length */ - length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+7); - /* EAP-Packet Type */ - type = zmw_tx_buf_readb(dev, buf, offset+8); // 1 : Identity - // 2 : Notification - // 3 : Nak (Response Only) - // 4 : MD5-Challenge - // 5 : One Time Password (OTP) - // 6 : Generic Token Card (GTC) - // 254 : (Expanded Types)Wi-Fi Protected Setup - // 255 : Experimental Use - - /* The data field in an EAP packet of the type of Request or Response is in the format shown bellowing */ - /* 0 1 2 3 4 5 6 7 N */ - /* ----------------------------------------------- */ - /* Type | Type Data */ - /* ----------------------------------------------- */ - - zm_debug_msg1("EAP-Packet Identifier = ", identifier); - zm_debug_msg1("EAP-Packet Length = ", length); - zm_debug_msg1("EAP-Packet Type = ", type); - - if( type == 1 ) - { - zm_debug_msg0("EAP-Packet Request Identity"); - } - else if( type == 2 ) - { - zm_debug_msg0("EAP-Packet Request Notification"); - } - else if( type == 4 ) - { - zm_debug_msg0("EAP-Packet Request MD5-Challenge"); - } - else if( type == 5 ) - { - zm_debug_msg0("EAP-Packet Request One Time Password"); - } - else if( type == 6 ) - { - zm_debug_msg0("EAP-Packet Request Generic Token Card"); - } - else if( type == 254 ) - { - zm_debug_msg0("EAP-Packet Request Wi-Fi Protected Setup"); - - /* 0 1 2 3 */ - /* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */ - /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/ - /*| Type | Vendor-Id |*/ - /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/ - /*| Vendor-Type |*/ - /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/ - /*| Vendor data... */ - /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - - /* EAP-Packet Vendor ID */ - vendorId = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 16) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+11); - /* EAP-Packet Vendor Type */ - VendorType = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+12)) << 24) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 16) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+15); - /* EAP-Packet Op Code */ - Op_Code = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+16)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+17); - /* EAP-Packet Flags */ - flags = zmw_tx_buf_readb(dev, buf, offset+18); - - zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId); - zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType); - zm_debug_msg1("EAP-Packet Op Code = ", Op_Code); - zm_debug_msg1("EAP-Packet Flags = ", flags); - } - } - else if( code == 2 ) - { - zm_debug_msg0("EAP-Packet Response"); - - /* EAP-Packet Identifier */ - identifier = zmw_tx_buf_readb(dev, buf, offset+5); - /* EAP-Packet Length */ - length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+7); - /* EAP-Packet Type */ - type = zmw_tx_buf_readb(dev, buf, offset+8); - - zm_debug_msg1("EAP-Packet Identifier = ", identifier); - zm_debug_msg1("EAP-Packet Length = ", length); - zm_debug_msg1("EAP-Packet Type = ", type); - - if( type == 1 ) - { - zm_debug_msg0("EAP-Packet Response Identity"); - } - else if( type == 2 ) - { - zm_debug_msg0("EAP-Packet Request Notification"); - } - else if( type == 3 ) - { - zm_debug_msg0("EAP-Packet Request Nak"); - } - else if( type == 4 ) - { - zm_debug_msg0("EAP-Packet Request MD5-Challenge"); - } - else if( type == 5 ) - { - zm_debug_msg0("EAP-Packet Request One Time Password"); - } - else if( type == 6 ) - { - zm_debug_msg0("EAP-Packet Request Generic Token Card"); - } - else if( type == 254 ) - { - zm_debug_msg0("EAP-Packet Response Wi-Fi Protected Setup"); - - /* EAP-Packet Vendor ID */ - vendorId = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 16) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+11); - /* EAP-Packet Vendor Type */ - VendorType = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+12)) << 24) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 16) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+15); - /* EAP-Packet Op Code */ - Op_Code = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+16)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+17); - /* EAP-Packet Flags */ - flags = zmw_tx_buf_readb(dev, buf, offset+18); - - zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId); - zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType); - zm_debug_msg1("EAP-Packet Op Code = ", Op_Code); - zm_debug_msg1("EAP-Packet Flags = ", flags); - } - } - else if( code == 3 ) - { - zm_debug_msg0("EAP-Packet Success"); - - /* EAP-Packet Identifier */ - identifier = zmw_rx_buf_readb(dev, buf, offset+5); - /* EAP-Packet Length */ - length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) + - zmw_rx_buf_readb(dev, buf, offset+7); - - zm_debug_msg1("EAP-Packet Identifier = ", identifier); - zm_debug_msg1("EAP-Packet Length = ", length); - } - else if( code == 4 ) - { - zm_debug_msg0("EAP-Packet Failure"); - - /* EAP-Packet Identifier */ - identifier = zmw_tx_buf_readb(dev, buf, offset+5); - /* EAP-Packet Length */ - length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+7); - - zm_debug_msg1("EAP-Packet Identifier = ", identifier); - zm_debug_msg1("EAP-Packet Length = ", length); - } - } - else if( packetType == 1 ) - { // EAPOL-Start - zm_debug_msg0("EAPOL-Start"); - } - else if( packetType == 2 ) - { // EAPOL-Logoff - zm_debug_msg0("EAPOL-Logoff"); - } - else if( packetType == 3 ) - { // EAPOL-Key - /* EAPOL-Key type */ - keyType = zmw_tx_buf_readb(dev, buf, offset+4); - /* EAPOL-Key information */ - keyInfo = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+5)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+6); - /* EAPOL-Key length */ - keyLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+7)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+8); - /* EAPOL-Key replay counter (high double word) */ - replayCounterH = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 24) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 16) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+11)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+12); - /* EAPOL-Key replay counter (low double word) */ - replayCounterL = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 24) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 16) + - (((u32_t) zmw_tx_buf_readb(dev, buf, offset+15)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+16); - /* EAPOL-Key data length */ - keyDataLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+97)) << 8) + - zmw_tx_buf_readb(dev, buf, offset+98); - - zm_debug_msg0("EAPOL-Key"); - zm_debug_msg1("packet length = ", packetLen); - - if ( keyType == 254 ) - { - zm_debug_msg0("key type = 254 (SSN key descriptor)"); - } - else - { - zm_debug_msg2("key type = 0x", keyType); - } - - zm_debug_msg2("replay counter(L) = ", replayCounterL); - - zm_debug_msg2("key information = ", keyInfo); - - if ( keyInfo & ZM_BIT_3 ) - { - zm_debug_msg0(" - pairwise key"); - } - else - { - zm_debug_msg0(" - group key"); - } - - if ( keyInfo & ZM_BIT_6 ) - { - zm_debug_msg0(" - Tx key installed"); - } - else - { - zm_debug_msg0(" - Tx key not set"); - } - - if ( keyInfo & ZM_BIT_7 ) - { - zm_debug_msg0(" - Ack needed"); - } - else - { - zm_debug_msg0(" - Ack not needed"); - } - - if ( keyInfo & ZM_BIT_8 ) - { - zm_debug_msg0(" - MIC set"); - } - else - { - zm_debug_msg0(" - MIC not set"); - } - - if ( keyInfo & ZM_BIT_9 ) - { - zm_debug_msg0(" - packet encrypted"); - } - else - { - zm_debug_msg0(" - packet not encrypted"); - } - - zm_debug_msg1("keyLen = ", keyLen); - zm_debug_msg1("keyDataLen = ", keyDataLen); - } - else if( packetType == 4 ) - { - zm_debug_msg0("EAPOL-Encapsulated-ASF-Alert"); - } -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiRecv80211 */ -/* Called to receive 802.11 frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : received 802.11 frame buffer. */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2005.5 */ -/* */ -/************************************************************************/ -void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo) -{ - u8_t snapCase=0, encryMode; - u16_t frameType, typeLengthField; - u16_t frameCtrl; - u16_t frameSubtype; - u16_t ret; - u16_t len; - u8_t bIsDefrag = 0; - u16_t offset, tailLen; - u8_t vap = 0; - u16_t da[3], sa[3]; - u16_t ii; - u8_t uapsdTrig = 0; - zbuf_t* psBuf; -#ifdef ZM_ENABLE_NATIVE_WIFI - u8_t i; -#endif - - zmw_get_wlan_dev(dev); - - ZM_BUFFER_TRACE(dev, buf) - - //zm_msg2_rx(ZM_LV_2, "zfiRecv80211(), buf=", buf); - - //zm_msg2_rx(ZM_LV_0, "h[0]=", zmw_rx_buf_readh(dev, buf, 0)); - //zm_msg2_rx(ZM_LV_0, "h[2]=", zmw_rx_buf_readh(dev, buf, 2)); - //zm_msg2_rx(ZM_LV_0, "h[4]=", zmw_rx_buf_readh(dev, buf, 4)); - - frameCtrl = zmw_rx_buf_readb(dev, buf, 0); - frameType = frameCtrl & 0xf; - frameSubtype = frameCtrl & 0xf0; - -#if 0 // Move to ProcessBeacon to judge if there's a new peer station - if ( (wd->wlanMode == ZM_MODE_IBSS)&& - (wd->sta.ibssPartnerStatus != ZM_IBSS_PARTNER_ALIVE) ) - { - zfStaIbssMonitoring(dev, buf); - } -#endif - - /* If data frame */ - if (frameType == ZM_WLAN_DATA_FRAME) - { - wd->sta.TotalNumberOfReceivePackets++; - wd->sta.TotalNumberOfReceiveBytes += zfwBufGetSize(dev, buf); - //zm_debug_msg1("Receive packets = ", wd->sta.TotalNumberOfReceivePackets); - - //zm_msg0_rx(ZM_LV_0, "Rx data"); - if (wd->wlanMode == ZM_MODE_AP) - { - ret = zfApUpdatePsBit(dev, buf, &vap, &uapsdTrig); - if (ret != ZM_SUCCESS) - { - zfwBufFree(dev, buf, 0); - return; - } - - if (((uapsdTrig&0xf) != 0) && ((frameSubtype & 0x80) != 0)) - { - u8_t ac = zcUpToAc[zmw_buf_readb(dev, buf, 24)&0x7]; - u8_t pktNum; - u8_t mb; - u16_t flag; - u8_t src[6]; - - //printk("QoS ctrl=%d\n", zmw_buf_readb(dev, buf, 24)); - //printk("UAPSD trigger, ac=%d\n", ac); - - if (((0x8>>ac) & uapsdTrig) != 0) - { - pktNum = zcMaxspToPktNum[(uapsdTrig>>4) & 0x3]; - - for (ii=0; ii<6; ii++) - { - src[ii] = zmw_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+ii); - } - - for (ii=0; iiap.uapsdQ)) != NULL) - psBuf = zfQueueGetWithMac(dev, wd->ap.uapsdQ, src, &mb); - if (psBuf != NULL) - { - if ((ii+1) == pktNum) - { - //EOSP anyway - flag = 0x100 | (mb<<5); - } - else - { - if (mb != 0) - { - //more data, not EOSP - flag = 0x20; - } - else - { - //no more data, EOSP - flag = 0x100; - } - } - zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, flag); - } - - if ((psBuf == NULL) || (mb == 0)) - { - if ((ii == 0) && (psBuf == NULL)) - { - zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_QOS_NULL, (u16_t*)src, 0, 0, 0); - } - break; - } - } - } - } - - } - else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - u16_t frameCtrlMSB; - u8_t bssid[6]; - - /* Check Is RIFS frame and decide to enable RIFS or not */ - if( wd->sta.EnableHT ) - zfCheckIsRIFSFrame(dev, buf, frameSubtype); - - if ( zfPowerSavingMgrIsSleeping(dev) || wd->sta.psMgr.tempWakeUp == 1) - { - frameCtrlMSB = zmw_rx_buf_readb(dev, buf, 1); - - /* check more data */ - if ( frameCtrlMSB & ZM_BIT_5 ) - { - //if rx frame's AC is not delivery-enabled - if ((wd->sta.qosInfo&0xf) != 0xf) - { - u8_t rxAc = 0; - if ((frameSubtype & 0x80) != 0) - { - rxAc = zcUpToAc[zmw_buf_readb(dev, buf, 24)&0x7]; - } - - if (((0x8>>rxAc) & wd->sta.qosInfo) == 0) - { - zfSendPSPoll(dev); - wd->sta.psMgr.tempWakeUp = 0; - } - } - } - } - /*increase beacon count when receive vaild data frame from AP*/ - ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid); - - if (zfStaIsConnected(dev)&& - zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6)) - { - wd->sta.rxBeaconCount++; - } - } - - zm_msg1_rx(ZM_LV_2, "Rx VAP=", vap); - - /* handle IV, EXT-IV, ICV, and EXT-ICV */ - zfGetRxIvIcvLength(dev, buf, vap, &offset, &tailLen, addInfo); - - zfStaIbssPSCheckState(dev, buf); - //QoS data frame - if ((frameSubtype & 0x80) == 0x80) - { - offset += 2; - } - - len = zfwBufGetSize(dev, buf); - /* remove ICV */ - if (tailLen > 0) - { - if (len > tailLen) - { - len -= tailLen; - zfwBufSetSize(dev, buf, len); - } - } - - /* Filter NULL data */ - if (((frameSubtype&0x40) != 0) || ((len = zfwBufGetSize(dev, buf))<=24)) - { - zm_msg1_rx(ZM_LV_1, "Free Rx NULL data, len=", len); - zfwBufFree(dev, buf, 0); - return; - } - - /* check and handle defragmentation */ - if ( wd->sta.bSafeMode && (wd->sta.wepStatus == ZM_ENCRYPTION_AES) && wd->sta.SWEncryptEnable ) - { - zm_msg0_rx(ZM_LV_1, "Bypass defragmentation packets in safe mode"); - } - else - { - buf = zfDefragment(dev, buf, &bIsDefrag, addInfo); - if (buf == NULL) - { - /* In this case, the buffer has been freed in zfDefragment */ - return; - } - } - - ret = ZM_MIC_SUCCESS; - - /* If SW WEP/TKIP are not turned on */ - if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_DECRY_EN) == 0 && - (wd->sta.SWEncryptEnable & ZM_SW_WEP_DECRY_EN) == 0) - { - encryMode = zfGetEncryModeFromRxStatus(addInfo); - - /* check if TKIP */ - if ( encryMode == ZM_TKIP ) - { - if ( bIsDefrag ) - { - ret = zfMicRxVerify(dev, buf); - } - else - { - /* check MIC failure bit */ - if ( ZM_RX_STATUS_IS_MIC_FAIL(addInfo) ) - { - ret = ZM_MIC_FAILURE; - } - } - - if ( ret == ZM_MIC_FAILURE ) - { - u8_t Unicast_Pkt = 0x0; - - if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0) - { - wd->commTally.swRxUnicastMicFailCount++; - Unicast_Pkt = 0x1; - }/* - else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff) - { - wd->commTally.swRxMulticastMicFailCount++; - }*/ - else - { - wd->commTally.swRxMulticastMicFailCount++; - } - if ( wd->wlanMode == ZM_MODE_AP ) - { - u16_t idx; - u8_t addr[6]; - - for (idx=0; idx<6; idx++) - { - addr[idx] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+idx); - } - - if (wd->zfcbApMicFailureNotify != NULL) - { - wd->zfcbApMicFailureNotify(dev, addr, buf); - } - } - else - { - if(Unicast_Pkt) - { - zm_debug_msg0("Countermeasure : Unicast_Pkt "); - } - else - { - zm_debug_msg0("Countermeasure : Non-Unicast_Pkt "); - } - - if((wd->TKIP_Group_KeyChanging == 0x0) || (Unicast_Pkt == 0x1)) - { - zm_debug_msg0("Countermeasure : Do MIC Check "); - zfStaMicFailureHandling(dev, buf); - } - else - { - zm_debug_msg0("Countermeasure : SKIP MIC Check due to Group Keychanging "); - } - } - /* Discard MIC failed frame */ - zfwBufFree(dev, buf, 0); - return; - } - } - } - else - { - u8_t IsEncryFrame; - - /* TODO: Check whether WEP bit is turned on in MAC header */ - encryMode = ZM_NO_WEP; - - IsEncryFrame = (zmw_rx_buf_readb(dev, buf, 1) & 0x40); - - if (IsEncryFrame) - { - /* Software decryption for TKIP */ - if (wd->sta.SWEncryptEnable & ZM_SW_TKIP_DECRY_EN) - { - u16_t iv16; - u16_t iv32; - u8_t RC4Key[16]; - u16_t IvOffset; - struct zsTkipSeed *rxSeed; - - IvOffset = offset + ZM_SIZE_OF_WLAN_DATA_HEADER; - - rxSeed = zfStaGetRxSeed(dev, buf); - - if (rxSeed == NULL) - { - zm_debug_msg0("rxSeed is NULL"); - - /* Discard this frame */ - zfwBufFree(dev, buf, 0); - return; - } - - iv16 = (zmw_rx_buf_readb(dev, buf, IvOffset) << 8) + zmw_rx_buf_readb(dev, buf, IvOffset+2); - iv32 = zmw_rx_buf_readb(dev, buf, IvOffset+4) + - (zmw_rx_buf_readb(dev, buf, IvOffset+5) << 8) + - (zmw_rx_buf_readb(dev, buf, IvOffset+6) << 16) + - (zmw_rx_buf_readb(dev, buf, IvOffset+7) << 24); - - /* TKIP Key Mixing */ - zfTkipPhase1KeyMix(iv32, rxSeed); - zfTkipPhase2KeyMix(iv16, rxSeed); - zfTkipGetseeds(iv16, RC4Key, rxSeed); - - /* Decrypt Data */ - ret = zfTKIPDecrypt(dev, buf, IvOffset+ZM_SIZE_OF_IV+ZM_SIZE_OF_EXT_IV, 16, RC4Key); - - if (ret == ZM_ICV_FAILURE) - { - zm_debug_msg0("TKIP ICV fail"); - - /* Discard ICV failed frame */ - zfwBufFree(dev, buf, 0); - return; - } - - /* Remove ICV from buffer */ - zfwBufSetSize(dev, buf, len-4); - - /* Check MIC */ - ret = zfMicRxVerify(dev, buf); - - if (ret == ZM_MIC_FAILURE) - { - if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0) - { - wd->commTally.swRxUnicastMicFailCount++; - } - else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff) - { - wd->commTally.swRxMulticastMicFailCount++; - } - else - { - wd->commTally.swRxMulticastMicFailCount++; - } - if ( wd->wlanMode == ZM_MODE_AP ) - { - u16_t idx; - u8_t addr[6]; - - for (idx=0; idx<6; idx++) - { - addr[idx] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+idx); - } - - if (wd->zfcbApMicFailureNotify != NULL) - { - wd->zfcbApMicFailureNotify(dev, addr, buf); - } - } - else - { - zfStaMicFailureHandling(dev, buf); - } - - zm_debug_msg0("MIC fail"); - /* Discard MIC failed frame */ - zfwBufFree(dev, buf, 0); - return; - } - - encryMode = ZM_TKIP; - offset += ZM_SIZE_OF_IV + ZM_SIZE_OF_EXT_IV; - } - else if(wd->sta.SWEncryptEnable & ZM_SW_WEP_DECRY_EN) - { - u16_t IvOffset; - u8_t keyLen = 5; - u8_t iv[3]; - u8_t keyIdx; - - IvOffset = offset + ZM_SIZE_OF_WLAN_DATA_HEADER; - - /* Retrieve IV */ - iv[0] = zmw_rx_buf_readb(dev, buf, IvOffset); - iv[1] = zmw_rx_buf_readb(dev, buf, IvOffset+1); - iv[2] = zmw_rx_buf_readb(dev, buf, IvOffset+2); - - keyIdx = ((zmw_rx_buf_readb(dev, buf, IvOffset+3) >> 6) & 0x03); - - IvOffset += ZM_SIZE_OF_IV; - - if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP64) - { - keyLen = 5; - } - else if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP128) - { - keyLen = 13; - } - else if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP256) - { - keyLen = 29; - } - - zfWEPDecrypt(dev, buf, IvOffset, keyLen, wd->sta.wepKey[keyIdx], iv); - - if (ret == ZM_ICV_FAILURE) - { - zm_debug_msg0("WEP ICV fail"); - - /* Discard ICV failed frame */ - zfwBufFree(dev, buf, 0); - return; - } - - encryMode = wd->sta.SWEncryMode[keyIdx]; - - /* Remove ICV from buffer */ - zfwBufSetSize(dev, buf, len-4); - - offset += ZM_SIZE_OF_IV; - } - } - } - -#ifdef ZM_ENABLE_CENC - //else if ( encryMode == ZM_CENC ) /* check if CENC */ - if ( encryMode == ZM_CENC ) - { - u32_t rxIV[4]; - - rxIV[0] = (zmw_rx_buf_readh(dev, buf, 28) << 16) - + zmw_rx_buf_readh(dev, buf, 26); - rxIV[1] = (zmw_rx_buf_readh(dev, buf, 32) << 16) - + zmw_rx_buf_readh(dev, buf, 30); - rxIV[2] = (zmw_rx_buf_readh(dev, buf, 36) << 16) - + zmw_rx_buf_readh(dev, buf, 34); - rxIV[3] = (zmw_rx_buf_readh(dev, buf, 40) << 16) - + zmw_rx_buf_readh(dev, buf, 38); - - //zm_debug_msg2("rxIV[0] = 0x", rxIV[0]); - //zm_debug_msg2("rxIV[1] = 0x", rxIV[1]); - //zm_debug_msg2("rxIV[2] = 0x", rxIV[2]); - //zm_debug_msg2("rxIV[3] = 0x", rxIV[3]); - - /* destination address*/ - da[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET); - da[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+2); - da[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+4); - - if ( wd->wlanMode == ZM_MODE_AP ) - { - } - else - { - if ((da[0] & 0x1)) - { //multicast frame - /* Accumlate the PN sequence */ - wd->sta.rxivGK[0] ++; - - if (wd->sta.rxivGK[0] == 0) - { - wd->sta.rxivGK[1]++; - } - - if (wd->sta.rxivGK[1] == 0) - { - wd->sta.rxivGK[2]++; - } - - if (wd->sta.rxivGK[2] == 0) - { - wd->sta.rxivGK[3]++; - } - - if (wd->sta.rxivGK[3] == 0) - { - wd->sta.rxivGK[0] = 0; - wd->sta.rxivGK[1] = 0; - wd->sta.rxivGK[2] = 0; - } - - //zm_debug_msg2("wd->sta.rxivGK[0] = 0x", wd->sta.rxivGK[0]); - //zm_debug_msg2("wd->sta.rxivGK[1] = 0x", wd->sta.rxivGK[1]); - //zm_debug_msg2("wd->sta.rxivGK[2] = 0x", wd->sta.rxivGK[2]); - //zm_debug_msg2("wd->sta.rxivGK[3] = 0x", wd->sta.rxivGK[3]); - - if ( !((wd->sta.rxivGK[0] == rxIV[0]) - && (wd->sta.rxivGK[1] == rxIV[1]) - && (wd->sta.rxivGK[2] == rxIV[2]) - && (wd->sta.rxivGK[3] == rxIV[3]))) - { - u8_t PacketDiscard = 0; - /* Discard PN Code Error frame */ - if (rxIV[0] < wd->sta.rxivGK[0]) - { - PacketDiscard = 1; - } - if (wd->sta.rxivGK[0] > 0xfffffff0) - { //boundary case - if ((rxIV[0] < 0xfffffff0) - && (((0xffffffff - wd->sta.rxivGK[0]) + rxIV[0]) > 16)) - { - PacketDiscard = 1; - } - } - else - { //normal case - if ((rxIV[0] - wd->sta.rxivGK[0]) > 16) - { - PacketDiscard = 1; - } - } - // sync sta pn code with ap because of losting some packets - wd->sta.rxivGK[0] = rxIV[0]; - wd->sta.rxivGK[1] = rxIV[1]; - wd->sta.rxivGK[2] = rxIV[2]; - wd->sta.rxivGK[3] = rxIV[3]; - if (PacketDiscard) - { - zm_debug_msg0("Discard PN Code lost too much multicast frame"); - zfwBufFree(dev, buf, 0); - return; - } - } - } - else - { //unicast frame - /* Accumlate the PN sequence */ - wd->sta.rxiv[0] += 2; - - if (wd->sta.rxiv[0] == 0 || wd->sta.rxiv[0] == 1) - { - wd->sta.rxiv[1]++; - } - - if (wd->sta.rxiv[1] == 0) - { - wd->sta.rxiv[2]++; - } - - if (wd->sta.rxiv[2] == 0) - { - wd->sta.rxiv[3]++; - } - - if (wd->sta.rxiv[3] == 0) - { - wd->sta.rxiv[0] = 0; - wd->sta.rxiv[1] = 0; - wd->sta.rxiv[2] = 0; - } - - //zm_debug_msg2("wd->sta.rxiv[0] = 0x", wd->sta.rxiv[0]); - //zm_debug_msg2("wd->sta.rxiv[1] = 0x", wd->sta.rxiv[1]); - //zm_debug_msg2("wd->sta.rxiv[2] = 0x", wd->sta.rxiv[2]); - //zm_debug_msg2("wd->sta.rxiv[3] = 0x", wd->sta.rxiv[3]); - - if ( !((wd->sta.rxiv[0] == rxIV[0]) - && (wd->sta.rxiv[1] == rxIV[1]) - && (wd->sta.rxiv[2] == rxIV[2]) - && (wd->sta.rxiv[3] == rxIV[3]))) - { - zm_debug_msg0("PN Code mismatch, lost unicast frame, sync pn code to recv packet"); - // sync sta pn code with ap because of losting some packets - wd->sta.rxiv[0] = rxIV[0]; - wd->sta.rxiv[1] = rxIV[1]; - wd->sta.rxiv[2] = rxIV[2]; - wd->sta.rxiv[3] = rxIV[3]; - /* Discard PN Code Error frame */ - //zm_debug_msg0("Discard PN Code mismatch unicast frame"); - //zfwBufFree(dev, buf, 0); - //return; - } - } - } - } -#endif //ZM_ENABLE_CENC - - /* for tally */ - if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0) - { - /* for ACU to display RxRate */ - zfWlanUpdateRxRate(dev, addInfo); - - wd->commTally.rxUnicastFrm++; - wd->commTally.rxUnicastOctets += (len-24); - } - else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff) - { - wd->commTally.rxBroadcastFrm++; - wd->commTally.rxBroadcastOctets += (len-24); - } - else - { - wd->commTally.rxMulticastFrm++; - wd->commTally.rxMulticastOctets += (len-24); - } - wd->ledStruct.rxTraffic++; - - if ((frameSubtype & 0x80) == 0x80) - { - /* if QoS control bit-7 is 1 => A-MSDU frame */ - if ((zmw_rx_buf_readh(dev, buf, 24) & 0x80) != 0) - { - zfDeAmsdu(dev, buf, vap, encryMode); - return; - } - } - - // Remove MIC of TKIP - if ( encryMode == ZM_TKIP ) - { - zfwBufSetSize(dev, buf, zfwBufGetSize(dev, buf) - 8); - } - - /* Convert 802.11 and SNAP header to ethernet header */ - if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)|| - (wd->wlanMode == ZM_MODE_IBSS) ) - { - /* destination address*/ - da[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET); - da[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+2); - da[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+4); - - /* check broadcast frame */ - if ( (da[0] == 0xffff) && (da[1] == 0xffff) && (da[2] == 0xffff) ) - { - // Ap send broadcast frame to the DUT ! - } - /* check multicast frame */ - /* TODO : Remove these code, hardware should be able to block */ - /* multicast frame on the multicast address list */ - /* or bypass all multicast packet by flag bAllMulticast */ - else if ((da[0] & 0x01) && (wd->sta.bAllMulticast == 0)) - { - for(ii=0; iista.multicastList.size; ii++) - { - if ( zfMemoryIsEqual(wd->sta.multicastList.macAddr[ii].addr, - (u8_t*) da, 6)) - { - break; - } - } - - if ( ii == wd->sta.multicastList.size ) - { /* not found */ - zm_debug_msg0("discard unknown multicast frame"); - - zfwBufFree(dev, buf, 0); - return; - } - } - -#ifdef ZM_ENABLE_NATIVE_WIFI //Native Wifi : 1, Ethernet format : 0 - //To remove IV - if (offset > 0) - { - for (i=12; i>0; i--) - { - zmw_rx_buf_writeh(dev, buf, ((i-1)*2)+offset, - zmw_rx_buf_readh(dev, buf, (i-1)*2)); - } - zfwBufRemoveHead(dev, buf, offset); - } -#else - - if (zfRxBufferEqualToStr(dev, buf, zgSnapBridgeTunnel, - 24+offset, 6)) - { - snapCase = 1; - } - else if ( zfRxBufferEqualToStr(dev, buf, zgSnap8021h, - 24+offset, 6) ) - { - typeLengthField = - (((u16_t) zmw_rx_buf_readb(dev, buf, 30+offset)) << 8) + - zmw_rx_buf_readb(dev, buf, 31+offset); - - //zm_debug_msg2("tpyeLengthField = ", typeLengthField); - - //8137 : IPX, 80F3 : Appletalk - if ( (typeLengthField != 0x8137)&& - (typeLengthField != 0x80F3) ) - { - snapCase = 2; - } - - if ( typeLengthField == 0x888E ) - { - zfShowRxEAPOL(dev, buf, 32); - } - } - else - { - //zfwDumpBuf(dev, buf); - } - - /* source address */ - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - /* SA = Address 3 */ - sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET); - sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2); - sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4); - } - else - { - /* SA = Address 2 */ - sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET); - sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2); - sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4); - } - - if ( snapCase ) - { - /* SA */ - zmw_rx_buf_writeh(dev, buf, 24+offset, sa[0]); - zmw_rx_buf_writeh(dev, buf, 26+offset, sa[1]); - zmw_rx_buf_writeh(dev, buf, 28+offset, sa[2]); - - /* DA = Address 1 */ - zmw_rx_buf_writeh(dev, buf, 18+offset, da[0]); - zmw_rx_buf_writeh(dev, buf, 20+offset, da[1]); - zmw_rx_buf_writeh(dev, buf, 22+offset, da[2]); - zfwBufRemoveHead(dev, buf, 18+offset); - } - else - { - /* SA */ - zmw_rx_buf_writeh(dev, buf, 16+offset, sa[0]); - zmw_rx_buf_writeh(dev, buf, 18+offset, sa[1]); - zmw_rx_buf_writeh(dev, buf, 20+offset, sa[2]); - - /* DA = Address 1 */ - zmw_rx_buf_writeh(dev, buf, 10+offset, da[0]); - zmw_rx_buf_writeh(dev, buf, 12+offset, da[1]); - zmw_rx_buf_writeh(dev, buf, 14+offset, da[2]); - zfwBufRemoveHead(dev, buf, 10+offset); - /* Ethernet payload length */ - typeLengthField = zfwBufGetSize(dev, buf) - 14; - zmw_rx_buf_writeh(dev, buf, 12, (typeLengthField<<8)+(typeLengthField>>8)); - } -#endif // ZM_ENABLE_NATIVE_WIFI - } - else if (wd->wlanMode == ZM_MODE_AP) - { - //if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3) - if (vap < ZM_MAX_AP_SUPPORT) - /* AP mode */ - { -#ifdef ZM_ENABLE_NATIVE_WIFI //Native Wifi : 1, Ethernet format : 0 - //To remove IV - if (offset > 0) - { - for (i=12; i>0; i--) - { - zmw_rx_buf_writeh(dev, buf, ((i-1)*2)+offset, - zmw_rx_buf_readh(dev, buf, (i-1)*2)); - } - zfwBufRemoveHead(dev, buf, offset); - } -#else - /* SA = Address 2 */ - zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A2_OFFSET)); - zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A2_OFFSET+2)); - zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A2_OFFSET+4)); - /* DA = Address 3 */ - /* Seq : Read 20 write 22, read 18 write 20, read 16 write 18 */ - /* sequence must not be inverted */ - zmw_rx_buf_writeh(dev, buf, 22+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A3_OFFSET+4)); - zmw_rx_buf_writeh(dev, buf, 20+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A3_OFFSET+2)); - zmw_rx_buf_writeh(dev, buf, 18+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A3_OFFSET)); - zfwBufRemoveHead(dev, buf, 18+offset); -#endif // ZM_ENABLE_NATIVE_WIFI - #if 1 - ret = zfIntrabssForward(dev, buf, vap); - if (ret == 1) - { - /* Free Rx buffer if intra-BSS unicast frame */ - zm_msg0_rx(ZM_LV_2, "Free intra-BSS unicast frame"); - zfwBufFree(dev, buf, 0); - return; - } - #endif - } - else - /* WDS mode */ - { - zm_msg0_rx(ZM_LV_2, "Rx WDS data"); - - /* SA = Address 4 */ - zmw_rx_buf_writeh(dev, buf, 30+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A4_OFFSET)); - zmw_rx_buf_writeh(dev, buf, 32+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A4_OFFSET+2)); - zmw_rx_buf_writeh(dev, buf, 34+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A4_OFFSET+4)); - /* DA = Address 3 */ - /* Seq : Read 20 write 22, read 18 write 20, read 16 write 18 */ - /* sequence must not be inverted */ - zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A3_OFFSET+4)); - zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A3_OFFSET+2)); - zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A3_OFFSET)); - zfwBufRemoveHead(dev, buf, 24+offset); - } - } - else if (wd->wlanMode == ZM_MODE_PSEUDO) - { - /* WDS test: remove add4 */ - if (wd->enableWDS) - { - offset += 6; - } - - /* SA = Address 2 */ - zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A2_OFFSET)); - zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A2_OFFSET+2)); - zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A2_OFFSET+4)); - /* DA = Address 1 */ - zmw_rx_buf_writeh(dev, buf, 18+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A1_OFFSET)); - zmw_rx_buf_writeh(dev, buf, 20+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A1_OFFSET+2)); - zmw_rx_buf_writeh(dev, buf, 22+offset, zmw_rx_buf_readh(dev, buf, - ZM_WLAN_HEADER_A1_OFFSET+4)); - zfwBufRemoveHead(dev, buf, 18+offset); - } - else - { - zm_assert(0); - } - - /* Call zfwRecvEth() to notify upper layer */ - //zm_msg2_rx(ZM_LV_2, "Call zfwRecvEth(), buf=", buf); - //zfwDumpBuf(dev, buf); - - #if ZM_PROTOCOL_RESPONSE_SIMULATION == 1 - zfProtRspSim(dev, buf); - #endif - //zfwDumpBuf(dev, buf); - - /* tally */ - wd->commTally.NotifyNDISRxFrmCnt++; - - if (wd->zfcbRecvEth != NULL) - { - wd->zfcbRecvEth(dev, buf, vap); - ZM_PERFORMANCE_RX_MSDU(dev, wd->tick) - } - } - /* if management frame */ - else if (frameType == ZM_WLAN_MANAGEMENT_FRAME) - { - zm_msg2_rx(ZM_LV_2, "Rx management,FC=", frameCtrl); - /* Call zfProcessManagement() to handle management frame */ - zfProcessManagement(dev, buf, addInfo); //CWYang(m) - zfwBufFree(dev, buf, 0); - } - /* PsPoll */ - else if ((wd->wlanMode == ZM_MODE_AP) && (frameCtrl == 0xa4)) - { - zm_msg0_rx(ZM_LV_0, "Rx PsPoll"); - zfApProcessPsPoll(dev, buf); - zfwBufFree(dev, buf, 0); - } - else - { - zm_msg0_rx(ZM_LV_1, "Rx discard!!"); - wd->commTally.DriverDiscardedFrm++; - - zfwBufFree(dev, buf, 0); - } - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfWlanRxValidate */ -/* Validate Rx frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : received 802.11 frame buffer. */ -/* */ -/* OUTPUTS */ -/* Error code */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfWlanRxValidate(zdev_t* dev, zbuf_t* buf) -{ - u16_t frameType; - u16_t frameCtrl; - u16_t frameLen; - u16_t ret; - u8_t frameSubType; - - zmw_get_wlan_dev(dev); - - frameCtrl = zmw_rx_buf_readh(dev, buf, 0); - frameType = frameCtrl & 0xC; - frameSubType = (frameCtrl & 0xF0) >> 4; - - frameLen = zfwBufGetSize(dev, buf); - - /* Accept Data/Management frame with protocol version = 0 */ - if ((frameType == 0x8) || (frameType == 0x0)) - { - - /* TODO : check rx status => erro bit */ - - /* Check Minimum Length with Wep */ - if ((frameCtrl & 0x4000) != 0) - { - /* Minimum Length = */ - /* PLCP(5)+Header(24)+IV(4)+ICV(4)+CRC(4)+RxStatus(8) */ - if (frameLen < 32) - { - return ZM_ERR_MIN_RX_ENCRYPT_FRAME_LENGTH; - } - } - else if ( frameSubType == 0x5 || frameSubType == 0x8 ) - { - /* Minimum Length = PLCP(5)+MACHeader(24)+Timestamp(8)+BeaconInterval(2)+Cap(2)+CRC(4)+RxStatus(8) */ - if (frameLen < 36) - { - return ZM_ERR_MIN_RX_FRAME_LENGTH; - } - } - else - { - /* Minimum Length = PLCP(5)+MACHeader(24)+CRC(4)+RxStatus(8) */ - if (frameLen < 24) - { - return ZM_ERR_MIN_RX_FRAME_LENGTH; - } - } - - /* Check if frame Length > ZM_WLAN_MAX_RX_SIZE. */ - if (frameLen > ZM_WLAN_MAX_RX_SIZE) - { - return ZM_ERR_MAX_RX_FRAME_LENGTH; - } - } - else if ((frameCtrl&0xff) == 0xa4) - { - /* PsPoll */ - //zm_msg0_rx(ZM_LV_0, "rx pspoll"); - } - else if ((frameCtrl&0xff) == ZM_WLAN_FRAME_TYPE_BAR) - { - if (wd->sta.enableDrvBA == 1) - { - zfAggRecvBAR(dev, buf); - } - - return ZM_ERR_RX_BAR_FRAME; - } - else - { - return ZM_ERR_RX_FRAME_TYPE; - } - - if ( wd->wlanMode == ZM_MODE_AP ) - { - } - else if ( wd->wlanMode != ZM_MODE_PSEUDO ) - { - ret = zfStaRxValidateFrame(dev, buf); - if (ret != ZM_SUCCESS) - { - //zm_debug_msg1("discard frame, code = ", ret); - return ret; - } - } - - return ZM_SUCCESS; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfWlanRxFilter */ -/* Filter duplicated frame. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : received 802.11 frame buffer. */ -/* */ -/* OUTPUTS */ -/* Error code */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u16_t zfWlanRxFilter(zdev_t* dev, zbuf_t* buf) -{ - u16_t src[3]; - u16_t dst0; - u16_t frameType; - u16_t seq; - u16_t offset; - u16_t index; - u16_t col; - u16_t i; - u8_t up = 0; /* User priority */ - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - ZM_BUFFER_TRACE(dev, buf) - - /* RX PREFIX */ - offset = 0; - - frameType = zmw_rx_buf_readh(dev, buf, offset); - - // Don't divide 2^4 because we don't want the fragmentation pkt to be treated as - // duplicated frames - seq = zmw_rx_buf_readh(dev, buf, offset+22); - dst0 = zmw_rx_buf_readh(dev, buf, offset+4); - src[0] = zmw_rx_buf_readh(dev, buf, offset+10); - src[1] = zmw_rx_buf_readh(dev, buf, offset+12); - src[2] = zmw_rx_buf_readh(dev, buf, offset+14); - - /* QoS data frame */ - if ((frameType & 0x88) == 0x88) - { - up = zmw_rx_buf_readb(dev, buf, offset+24); - up &= 0x7; - } - - index = (src[2]+up) & (ZM_FILTER_TABLE_ROW-1); - - /* TBD : filter frame with source address == own MAC address */ - if ((wd->macAddr[0] == src[0]) && (wd->macAddr[1] == src[1]) - && (wd->macAddr[2] == src[2])) - { - //zm_msg0_rx(ZM_LV_0, "Rx filter=>src is own MAC"); - wd->trafTally.rxSrcIsOwnMac++; -#if 0 - return ZM_ERR_RX_SRC_ADDR_IS_OWN_MAC; -#endif - } - - zm_msg2_rx(ZM_LV_2, "Rx seq=", seq); - - /* Filter unicast frame only */ - if ((dst0 & 0x1) == 0) - { - zmw_enter_critical_section(dev); - - for(i=0; irxFilterTbl[i][index].addr[0] == src[0]) - && (wd->rxFilterTbl[i][index].addr[1] == src[1]) - && (wd->rxFilterTbl[i][index].addr[2] == src[2]) - && (wd->rxFilterTbl[i][index].up == up)) - { - if (((frameType&0x800)==0x800) - &&(wd->rxFilterTbl[i][index].seq==seq)) - { - zmw_leave_critical_section(dev); - /* hit : duplicated frame */ - zm_msg0_rx(ZM_LV_1, "Rx filter hit=>duplicated"); - wd->trafTally.rxDuplicate++; - return ZM_ERR_RX_DUPLICATE; - } - else - { - /* hit : not duplicated frame, update sequence number */ - wd->rxFilterTbl[i][index].seq = seq; - zmw_leave_critical_section(dev); - zm_msg0_rx(ZM_LV_2, "Rx filter hit"); - return ZM_SUCCESS; - } - } - } /* for(i=0; itick & (ZM_FILTER_TABLE_COL-1)); - wd->rxFilterTbl[col][index].addr[0] = src[0]; - wd->rxFilterTbl[col][index].addr[1] = src[1]; - wd->rxFilterTbl[col][index].addr[2] = src[2]; - wd->rxFilterTbl[col][index].seq = seq; - wd->rxFilterTbl[col][index].up = up; - - zmw_leave_critical_section(dev); - } /* if ((dst0 & 0x1) == 0) */ - - return ZM_SUCCESS; -} - - - -u16_t zfTxGenWlanTail(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t snaplen, - u16_t* mic) -{ - struct zsMicVar* pMicKey; - u16_t i, length, payloadOffset; - u8_t bValue, qosType = 0; - u8_t snapByte[12]; - - zmw_get_wlan_dev(dev); - - if ( wd->wlanMode == ZM_MODE_AP ) - { - pMicKey = zfApGetTxMicKey(dev, buf, &qosType); - - if ( pMicKey == NULL ) - { - return 0; - } - } - else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - pMicKey = zfStaGetTxMicKey(dev, buf); - - if ( pMicKey == NULL ) - { - return 0; - } - } - else - { - return 0; - } - - length = zfwBufGetSize(dev, buf); - - zfMicClear(pMicKey); - - /* append DA and SA */ -#ifdef ZM_ENABLE_NATIVE_WIFI - for(i=16; i<22; i++) - { // VISTA DA - bValue = zmw_tx_buf_readb(dev, buf, i); - zfMicAppendByte(bValue, pMicKey); - } - for(i=10; i<16; i++) - { // VISTA SA - bValue = zmw_tx_buf_readb(dev, buf, i); - zfMicAppendByte(bValue, pMicKey); - } -#else - for(i=0; i<12; i++) - { - bValue = zmw_tx_buf_readb(dev, buf, i); - zfMicAppendByte(bValue, pMicKey); - } -#endif - - /* append for alignment */ - if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - { - if (wd->sta.wmeConnected != 0) - zfMicAppendByte(zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1) >> 5, pMicKey); - else - zfMicAppendByte(0, pMicKey); - } - else if ( wd->wlanMode == ZM_MODE_AP ) - { - if (qosType == 1) - zfMicAppendByte(zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1) >> 5, pMicKey); - else - zfMicAppendByte(0, pMicKey); - } - else - { - /* TODO : Qos Software MIC in IBSS Mode */ - zfMicAppendByte(0, pMicKey); - } - zfMicAppendByte(0, pMicKey); - zfMicAppendByte(0, pMicKey); - zfMicAppendByte(0, pMicKey); - - if ( snaplen == 0 ) - { - payloadOffset = ZM_80211_FRAME_IP_OFFSET; - } - else - { - payloadOffset = ZM_80211_FRAME_TYPE_OFFSET; - - for(i=0; i<(snaplen>>1); i++) - { - snapByte[i*2] = (u8_t) (snap[i] & 0xff); - snapByte[i*2+1] = (u8_t) ((snap[i] >> 8) & 0xff); - } - - for(i=0; i= 34) //Minimum IPv4 packet size, 14(Ether header)+20(IPv4 header) - { - etherType = (((u16_t)zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_TYPE_OFFSET))<<8) - + zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_TYPE_OFFSET + 1); - - /* protocol type = IP */ - if (etherType == 0x0800) - { - ipv = zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET) >> 4; - if (ipv == 0x4) //IPv4 - { - tos = zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1); - *up = (tos >> 5); - *fragOff = zmw_tx_buf_readh(dev, buf, ZM_80211_FRAME_IP_OFFSET + 6); - } - /* TODO : handle VLAN tag and IPv6 packet */ - } - } - return; -} - -#ifdef ZM_ENABLE_NATIVE_WIFI -u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen) -{ - snap[0] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 0); - snap[1] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 2); - snap[2] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 4); - *snaplen = 6; - - return ZM_80211_FRAME_HEADER_LEN + *snaplen; -} -#else -u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen) -{ - u16_t removed; - u16_t etherType; - u16_t len; - - len = zfwBufGetSize(dev, buf); - if (len < 14) //Minimum Ethernet packet size, 14(Ether header) - { - /* TODO : Assert? */ - *snaplen = 0; - return 0; - } - - /* Generate RFC1042 header */ - etherType = (((u16_t)zmw_tx_buf_readb(dev, buf, 12))<<8) - + zmw_tx_buf_readb(dev, buf, 13); - - //zm_debug_msg2("ethernet type or length = ", etherType); - - if (etherType > 1500) - { - /* ETHERNET format */ - removed = 12; - snap[0] = 0xaaaa; - snap[1] = 0x0003; - if ((etherType ==0x8137) || (etherType == 0x80f3)) - { - /* Bridge Tunnel */ - snap[2] = 0xF800; - } - else - { - /* RFC 1042 */ - snap[2] = 0x0000; - } - *snaplen = 6; - - if ( etherType == 0x888E ) - { - zfShowTxEAPOL(dev, buf, 14); - } - } - else - { - /* 802.3 format */ - removed = 14; - *snaplen = 0; - } - - return removed; -} -#endif - -u8_t zfIsVtxqEmpty(zdev_t* dev) -{ - u8_t isEmpty = TRUE; - u8_t i; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - if (wd->vmmqHead != wd->vmmqTail) - { - isEmpty = FALSE; - goto check_done; - } - - for(i=0; i < 4; i++) - { - if (wd->vtxqHead[i] != wd->vtxqTail[i]) - { - isEmpty = FALSE; - goto check_done; - } - } - -check_done: - zmw_leave_critical_section(dev); - return isEmpty; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfPutVtxq */ -/* Put Tx buffer to virtual TxQ */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : Tx buffer pointer */ -/* */ -/* OUTPUTS */ -/* ZM_SUCCESS or error code */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.6 */ -/* */ -/************************************************************************/ -u16_t zfPutVtxq(zdev_t* dev, zbuf_t* buf) -{ - u8_t ac; - u8_t up; - u16_t fragOff; -#ifdef ZM_AGG_TALLY - struct aggTally *agg_tal; -#endif -#ifdef ZM_ENABLE_AGGREGATION - #ifndef ZM_BYPASS_AGGR_SCHEDULING - u16_t ret; - u16_t tid; - #endif -#endif - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff); - - if ( wd->zfcbClassifyTxPacket != NULL ) - { - ac = wd->zfcbClassifyTxPacket(dev, buf); - } - else - { - ac = zcUpToAc[up&0x7] & 0x3; - } - - /* - * add by honda - * main A-MPDU aggregation function - */ -#ifdef ZM_AGG_TALLY - agg_tal = &wd->agg_tal; - agg_tal->got_packets_sum++; - -#endif - -#ifdef ZM_ENABLE_AGGREGATION - #ifndef ZM_BYPASS_AGGR_SCHEDULING - tid = up&0x7; - if(wd->enableAggregation==0) - { - if( (wd->wlanMode == ZM_MODE_AP) || - (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) || - (wd->wlanMode == ZM_MODE_PSEUDO) ) { - // (infrastructure_mode && connect_to_11n_ap) || (ap_mode && is_11n_ap) - //ret = zfAggPutVtxq(dev, buf); - - - ret = zfAggTx(dev, buf, tid); - if (ZM_SUCCESS == ret) - { - //zfwBufFree(dev, buf, ZM_SUCCESS); - - return ZM_SUCCESS; - } - if (ZM_ERR_EXCEED_PRIORITY_THRESHOLD == ret) - { - wd->commTally.txQosDropCount[ac]++; - zfwBufFree(dev, buf, ZM_SUCCESS); - - zm_msg1_tx(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac); - - return ZM_ERR_EXCEED_PRIORITY_THRESHOLD; - } - if (ZM_ERR_TX_BUFFER_UNAVAILABLE == ret) - { - /* - * do nothing - * continue following procession, put into VTXQ - * return ZM_SUCCESS; - */ - } - } - } - #endif -#endif - /* - * end of add by honda - */ - - /* First Ip frag */ - if ((fragOff & 0xff3f) == 0x0020) - { - /* Don't let ip frag in if VTXQ unable to hold */ - /* whole ip frag burst(assume 20 frag) */ - zmw_enter_critical_section(dev); - if (((wd->vtxqHead[ac] - wd->vtxqTail[ac])& ZM_VTXQ_SIZE_MASK) - > (ZM_VTXQ_SIZE-20)) - { - wd->qosDropIpFrag[ac] = 1; - } - else - { - wd->qosDropIpFrag[ac] = 0; - } - zmw_leave_critical_section(dev); - - if (wd->qosDropIpFrag[ac] == 1) - { - //zm_debug_msg2("vtQ full, drop buf = ", buf); - wd->commTally.txQosDropCount[ac]++; - zfwBufFree(dev, buf, ZM_SUCCESS); - zm_msg1_tx(ZM_LV_1, "Packet discarded, first ip frag, ac=", ac); - //VTXQ[] can not hold whold ip frag burst(assume 20 frags) - return ZM_ERR_EXCEED_PRIORITY_THRESHOLD; - } - } - else if ((fragOff & 0xff3f) == 0) - { - wd->qosDropIpFrag[ac] = 0; - } - - if (((fragOff &= 0xff1f) != 0) && (wd->qosDropIpFrag[ac] == 1)) - { - wd->commTally.txQosDropCount[ac]++; - zfwBufFree(dev, buf, ZM_SUCCESS); - zm_msg1_tx(ZM_LV_1, "Packet discarded, ip frag, ac=", ac); - //Discard following ip frags - return ZM_ERR_EXCEED_PRIORITY_THRESHOLD; - } - - zmw_enter_critical_section(dev); - if (((wd->vtxqHead[ac] + 1) & ZM_VTXQ_SIZE_MASK) != wd->vtxqTail[ac]) - { - wd->vtxq[ac][wd->vtxqHead[ac]] = buf; - wd->vtxqHead[ac] = ((wd->vtxqHead[ac] + 1) & ZM_VTXQ_SIZE_MASK); - zmw_leave_critical_section(dev); - return ZM_SUCCESS; - } - else - { - zmw_leave_critical_section(dev); - - wd->commTally.txQosDropCount[ac]++; - zfwBufFree(dev, buf, ZM_SUCCESS); - zm_msg1_tx(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac); - return ZM_ERR_EXCEED_PRIORITY_THRESHOLD; //VTXQ[] Full - } -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfGetVtxq */ -/* Get Tx buffer from virtual TxQ */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* Tx buffer pointer */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.6 */ -/* */ -/************************************************************************/ -zbuf_t* zfGetVtxq(zdev_t* dev, u8_t ac) -{ - zbuf_t* buf; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - ac &= 0x3; - zmw_enter_critical_section(dev); - if (wd->vtxqHead[ac] != wd->vtxqTail[ac]) - { - buf = wd->vtxq[ac][wd->vtxqTail[ac]]; - wd->vtxqTail[ac] = ((wd->vtxqTail[ac] + 1) & ZM_VTXQ_SIZE_MASK); - zmw_leave_critical_section(dev); - return buf; - } - else - { - zmw_leave_critical_section(dev); - return 0; //VTXQ[] empty - } -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfPutVmmq */ -/* Put Tx buffer to virtual MmQ */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* buf : Tx buffer pointer */ -/* */ -/* OUTPUTS */ -/* ZM_SUCCESS or error code */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.12 */ -/* */ -/************************************************************************/ -u16_t zfPutVmmq(zdev_t* dev, zbuf_t* buf) -{ - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if (((wd->vmmqHead + 1) & ZM_VMMQ_SIZE_MASK) != wd->vmmqTail) - { - wd->vmmq[wd->vmmqHead] = buf; - wd->vmmqHead = ((wd->vmmqHead + 1) & ZM_VMMQ_SIZE_MASK); - zmw_leave_critical_section(dev); - return ZM_SUCCESS; - } - else - { - zmw_leave_critical_section(dev); - - zfwBufFree(dev, buf, ZM_SUCCESS); - zm_msg0_mm(ZM_LV_0, "Packet discarded, VMmQ full"); - return ZM_ERR_VMMQ_FULL; //VTXQ[] Full - } -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfGetVmmq */ -/* Get Tx buffer from virtual MmQ */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* Tx buffer pointer */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.12 */ -/* */ -/************************************************************************/ -zbuf_t* zfGetVmmq(zdev_t* dev) -{ - zbuf_t* buf; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if (wd->vmmqHead != wd->vmmqTail) - { - buf = wd->vmmq[wd->vmmqTail]; - wd->vmmqTail = ((wd->vmmqTail + 1) & ZM_VMMQ_SIZE_MASK); - zmw_leave_critical_section(dev); - return buf; - } - else - { - zmw_leave_critical_section(dev); - return 0; //VTXQ[] empty - } -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfPushVtxq */ -/* Service Virtual TxQ (weighted round robin) */ -/* Get Tx buffer form virtual TxQ and put to hardware TxD queue */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.6 */ -/* */ -/************************************************************************/ -void zfPushVtxq(zdev_t* dev) -{ - zbuf_t* buf; - u16_t i; - u16_t txed; - u32_t freeTxd; - u16_t err; - u16_t skipFlag = 0; - zmw_get_wlan_dev(dev); - zmw_declare_for_critical_section(); - - - - //zm_debug_msg1("zfHpGetFreeTxdCount = ", zfHpGetFreeTxdCount(dev)); - - if (wd->halState == ZM_HAL_STATE_INIT) - { - if (!wd->modeMDKEnable) - { - zm_debug_msg0("HAL is not ready for Tx"); - } - return; - } - else if (wd->sta.DFSDisableTx) - { - zm_debug_msg0("return because 802.11h DFS Disable Tx"); - return; - } - else if (wd->sta.flagFreqChanging != 0) - { - //Hold until RF frequency changed - return; - } - else if (( wd->sta.flagKeyChanging ) && ( wd->wlanMode != ZM_MODE_AP )) - { - return; - } -#ifdef ZM_ENABLE_POWER_SAVE - else if ( zfPowerSavingMgrIsSleeping(dev) ) - { - //zm_debug_msg0("Packets queued since the MAC is in power-saving mode\n"); - return; - } -#endif - - zmw_enter_critical_section(dev); - if (wd->vtxqPushing != 0) - { - skipFlag = 1; - } - else - { - wd->vtxqPushing = 1; - } - zmw_leave_critical_section(dev); - - if (skipFlag == 1) - { - return; - } - - while (1) - { - txed = 0; - - /* 2006.12.20, Serve Management queue */ - while( zfHpGetFreeTxdCount(dev) > 0 ) - { - buf = zfGetVmmq(dev); - if (buf != 0) - { - txed = 1; - //zm_debug_msg2("send buf = ", buf); - err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0, - ZM_INTERNAL_ALLOC_BUF, 0, 0xff); - if (err != ZM_SUCCESS) - { - zfwBufFree(dev, buf, 0); - } - } - else - { - break; - } - } - if ((wd->sta.bScheduleScan) || ((wd->sta.bChannelScan == TRUE) && (zfStaIsConnected(dev)))) - { - //Hold until Scan Stop - wd->vtxqPushing = 0; - return; - } - -#ifdef ZM_ENABLE_AGGREGATION - #ifndef ZM_BYPASS_AGGR_SCHEDULING - if( (wd->wlanMode == ZM_MODE_AP) || - (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) || - (wd->wlanMode == ZM_MODE_PSEUDO) ) { - - zfAggTxScheduler(dev, 0); - - if (txed == 0) { - wd->vtxqPushing = 0; - return; - } - else { - continue; - } - } - #endif -#endif - - /* Service VTxQ[3] */ - for (i=0; i<4; i++) - { - freeTxd = zfHpGetFreeTxdCount(dev); - if (freeTxd >= 3) - { - buf = zfGetVtxq(dev, 3); - if (buf != 0) - { - txed = 1; - //zm_debug_msg2("send buf = ", buf); - zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0); - ZM_PERFORMANCE_TX_MPDU(dev, wd->tick); - } - } - else - { - break; - } - } - - /* Service VTxQ[2] */ - for (i=0; i<3; i++) - { - freeTxd = zfHpGetFreeTxdCount(dev); - if (freeTxd >= (zfHpGetMaxTxdCount(dev)*1/4)) - { - buf = zfGetVtxq(dev, 2); - if (buf != 0) - { - txed = 1; - zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0); - ZM_PERFORMANCE_TX_MPDU(dev, wd->tick); - } - if (wd->sta.ac0PriorityHigherThanAc2 == 1) - { - buf = zfGetVtxq(dev, 0); - if (buf != 0) - { - txed = 1; - zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0); - ZM_PERFORMANCE_TX_MPDU(dev, wd->tick); - } - } - } - else - { - break; - } - } - - /* Service VTxQ[0] */ - for (i=0; i<2; i++) - { - freeTxd = zfHpGetFreeTxdCount(dev); - if (freeTxd >= (zfHpGetMaxTxdCount(dev)*2/4)) - { - buf = zfGetVtxq(dev, 0); - if (buf != 0) - { - txed = 1; - zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0); - ZM_PERFORMANCE_TX_MPDU(dev, wd->tick); - } - } - else - { - break; - } - - } - - /* Service VTxQ[1] */ - freeTxd = zfHpGetFreeTxdCount(dev); - if (freeTxd >= (zfHpGetMaxTxdCount(dev)*3/4)) - { - buf = zfGetVtxq(dev, 1); - if (buf != 0) - { - txed = 1; - zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0); - ZM_PERFORMANCE_TX_MPDU(dev, wd->tick); - } - } - - /* All VTxQs are either empty or exceed their threshold */ - if (txed == 0) - { - wd->vtxqPushing = 0; - return; - } - } //while (1) -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfFlushVtxq */ -/* Flush Virtual TxQ and MmQ */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen Atheros Communications, INC. 2007.1 */ -/* */ -/************************************************************************/ -void zfFlushVtxq(zdev_t* dev) -{ - zbuf_t* buf; - u8_t i; - zmw_get_wlan_dev(dev); - - /* Flush MmQ */ - while ((buf = zfGetVmmq(dev)) != 0) - { - zfwBufFree(dev, buf, 0); - zm_debug_msg0("zfFlushVtxq: [Vmmq]"); - wd->queueFlushed |= 0x10; - } - - /* Flush VTxQ */ - for (i=0; i<4; i++) - { - while ((buf = zfGetVtxq(dev, i)) != 0) - { - zfwBufFree(dev, buf, 0); - zm_debug_msg1("zfFlushVtxq: [zfGetVtxq]- ", i); - wd->queueFlushed |= (1<commTally.txUnicastFrm++; - wd->commTally.txUnicastOctets += (fragLen+snapLen); - } - else if (da[0] == 0xffff) - { - wd->commTally.txBroadcastFrm++; - wd->commTally.txBroadcastOctets += (fragLen+snapLen); - } - else - { - wd->commTally.txMulticastFrm++; - wd->commTally.txMulticastOctets += (fragLen+snapLen); - } - wd->ledStruct.txTraffic++; - - err = zfHpSend(dev, header, headerLen, snap, snapLen, - tail, tailLen, buf, offset, - bufType, ac, keyIdx); - if (err != ZM_SUCCESS) - { - if (bufType == ZM_EXTERNAL_ALLOC_BUF) - { - zfwBufFree(dev, buf, err); - } - else if (bufType == ZM_INTERNAL_ALLOC_BUF) - { - zfwBufFree(dev, buf, 0); - } - else - { - zm_assert(0); - } - } -} - -void zfCheckIsRIFSFrame(zdev_t* dev, zbuf_t* buf, u16_t frameSubtype) -{ - zmw_get_wlan_dev(dev); - - /* #2 Record the sequence number to determine whether the unicast frame is separated by RIFS or not */ - if (frameSubtype & 0x80) - { //QoS data frame - u16_t sequenceNum; - u16_t qosControlField; - - sequenceNum = ( zmw_buf_readh(dev, buf, 22) >> 4 ); // Discard fragment number ! - qosControlField = zmw_buf_readh(dev, buf, 24); // Don't consider WDS (Wireless Distribution System) - //DbgPrint("The QoS Control Field : %d", qosControlField); - //DbgPrint("The RIFS Count : %d", wd->sta.rifsCount); - - if( qosControlField & ZM_BIT_5 ) - {// ACK policy is "No ACK" - /* RIFS-Like frame */ - wd->sta.rifsLikeFrameSequence[wd->sta.rifsLikeFrameCnt] = sequenceNum; - - if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTING ) - { - if( wd->sta.rifsLikeFrameSequence[2] != 0 ) - {// RIFS-like Pattern collected - if( ( wd->sta.rifsLikeFrameSequence[2] - wd->sta.rifsLikeFrameSequence[1] == 2 ) && - ( wd->sta.rifsLikeFrameSequence[1] - wd->sta.rifsLikeFrameSequence[0] == 2 ) ) - { - /* RIFS pattern matched */ - - /* #3 Enable RIFS function if the RIFS pattern matched */ - zfHpEnableRifs(dev, ((wd->sta.currentFrequency<3000)?1:0), wd->sta.EnableHT, wd->sta.HT2040); - - // Set RIFS timer - wd->sta.rifsTimer = wd->tick; - - wd->sta.rifsCount++; - - // Set state to be Detected - wd->sta.rifsState = ZM_RIFS_STATE_DETECTED; - } - } - } - else - {// state = Detected - // Reset RIFS timer - if( (wd->tick - wd->sta.rifsTimer) < ZM_RIFS_TIMER_TIMEOUT ) - wd->sta.rifsTimer = wd->tick; - } - - //DbgPrint("SN1 = %d, SN2 = %d, SN3 = %d\n", wd->sta.rifsLikeFrameSequence[0], - // wd->sta.rifsLikeFrameSequence[1], - // wd->sta.rifsLikeFrameSequence[2]); - - // Update RIFS-like sequence number - if( wd->sta.rifsLikeFrameSequence[2] != 0 ) - { - wd->sta.rifsLikeFrameSequence[0] = wd->sta.rifsLikeFrameSequence[1]; - wd->sta.rifsLikeFrameSequence[1] = wd->sta.rifsLikeFrameSequence[2]; - wd->sta.rifsLikeFrameSequence[2] = 0; - } - - // Only record three adjacent frame - if( wd->sta.rifsLikeFrameCnt < 2 ) - wd->sta.rifsLikeFrameCnt++; - } - } - - /* #4 Disable RIFS function if the timer TIMEOUT */ - if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTED ) - { - if( ( wd->tick - wd->sta.rifsTimer ) > ZM_RIFS_TIMER_TIMEOUT ) - {// TIMEOUT - // Disable RIFS - zfHpDisableRifs(dev); - - // Reset RIFS-like sequence number FIFO - wd->sta.rifsLikeFrameSequence[0] = 0; - wd->sta.rifsLikeFrameSequence[1] = 0; - wd->sta.rifsLikeFrameSequence[2] = 0; - wd->sta.rifsLikeFrameCnt = 0; - - // Set state to be Detecting - wd->sta.rifsState = ZM_RIFS_STATE_DETECTING; - } - } -} diff --git a/drivers/staging/otus/80211core/cwep.c b/drivers/staging/otus/80211core/cwep.c deleted file mode 100644 index ec31bb1ac283..000000000000 --- a/drivers/staging/otus/80211core/cwep.c +++ /dev/null @@ -1,299 +0,0 @@ -/* - * 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; -} diff --git a/drivers/staging/otus/80211core/cwm.c b/drivers/staging/otus/80211core/cwm.c deleted file mode 100644 index 1bd0b1ff12dc..000000000000 --- a/drivers/staging/otus/80211core/cwm.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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) && - (wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RecomTxWidthSet) && - (wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_ExtChannelOffsetAbove)) { - - 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; -} diff --git a/drivers/staging/otus/80211core/cwm.h b/drivers/staging/otus/80211core/cwm.h deleted file mode 100644 index 40c39fad5f44..000000000000 --- a/drivers/staging/otus/80211core/cwm.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 */ diff --git a/drivers/staging/otus/80211core/freqctrl.c b/drivers/staging/otus/80211core/freqctrl.c deleted file mode 100644 index bab0df08d826..000000000000 --- a/drivers/staging/otus/80211core/freqctrl.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * 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); -} diff --git a/drivers/staging/otus/80211core/ledmgr.c b/drivers/staging/otus/80211core/ledmgr.c deleted file mode 100644 index eafce0b1204f..000000000000 --- a/drivers/staging/otus/80211core/ledmgr.c +++ /dev/null @@ -1,556 +0,0 @@ -/* - * 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; iledStruct.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; iSlow 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) -{ - 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; - } - } -} - diff --git a/drivers/staging/otus/80211core/performance.c b/drivers/staging/otus/80211core/performance.c deleted file mode 100644 index 4c10e1d7afd6..000000000000 --- a/drivers/staging/otus/80211core/performance.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * 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 -static struct zsSummary zm_summary; -static struct zsVariation zm_var; -static 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; i0; i--) - { - s[0] = (i/10) + '0'; - s[1] = (i%10) + '0'; - s[2] = '0'; - s[3] = '|'; - for (j=0; jtick; - 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 */ diff --git a/drivers/staging/otus/80211core/performance.h b/drivers/staging/otus/80211core/performance.h deleted file mode 100644 index 29f658ae477c..000000000000 --- a/drivers/staging/otus/80211core/performance.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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 */ diff --git a/drivers/staging/otus/80211core/pub_usb.h b/drivers/staging/otus/80211core/pub_usb.h deleted file mode 100644 index c4b4bd25e828..000000000000 --- a/drivers/staging/otus/80211core/pub_usb.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * 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 diff --git a/drivers/staging/otus/80211core/pub_zfi.h b/drivers/staging/otus/80211core/pub_zfi.h deleted file mode 100644 index 5202e5a645d5..000000000000 --- a/drivers/staging/otus/80211core/pub_zfi.h +++ /dev/null @@ -1,820 +0,0 @@ -/* - * 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 definitions 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 performance 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_PERFORMANCE_RX_REORDER(dev) -#endif -/***** End of section 3 *****/ -#endif diff --git a/drivers/staging/otus/80211core/pub_zfw.h b/drivers/staging/otus/80211core/pub_zfw.h deleted file mode 100644 index 2474bb7536e8..000000000000 --- a/drivers/staging/otus/80211core/pub_zfw.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 *)__func__, __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 diff --git a/drivers/staging/otus/80211core/queue.c b/drivers/staging/otus/80211core/queue.c deleted file mode 100644 index 29be4bdb40a4..000000000000 --- a/drivers/staging/otus/80211core/queue.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * 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; - - q = (struct zsQueue*)zfwMemAllocate(dev, sizeof(struct zsQueue) - + (sizeof(struct zsQueueCell)*(size-1))); - if (q != 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; -} diff --git a/drivers/staging/otus/80211core/queue.h b/drivers/staging/otus/80211core/queue.h deleted file mode 100644 index 4526b882bd03..000000000000 --- a/drivers/staging/otus/80211core/queue.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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 diff --git a/drivers/staging/otus/80211core/ratectrl.c b/drivers/staging/otus/80211core/ratectrl.c deleted file mode 100644 index 283b2b52638c..000000000000 --- a/drivers/staging/otus/80211core/ratectrl.c +++ /dev/null @@ -1,867 +0,0 @@ -/* - * 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; ioperationRateSet[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; ioperationRateSet[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; iPER[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 && i == 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))) - { - newRate = zfRateCtrlGetHigherRate(rcCell); - if (newRate != 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; ioperationRateCount; 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; ioperationRateCount; 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 diff --git a/drivers/staging/otus/80211core/ratectrl.h b/drivers/staging/otus/80211core/ratectrl.h deleted file mode 100644 index 92411d725cd8..000000000000 --- a/drivers/staging/otus/80211core/ratectrl.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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 diff --git a/drivers/staging/otus/80211core/struct.h b/drivers/staging/otus/80211core/struct.h deleted file mode 100644 index 17b5ce37ebb5..000000000000 --- a/drivers/staging/otus/80211core/struct.h +++ /dev/null @@ -1,1315 +0,0 @@ -/* - * 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 _STRUCT_H -#define _STRUCT_H - -#include "../oal_marc.h" - -#define ZM_SW_LOOP_BACK 0 /* 1=>enable, 0=>disable */ -#define ZM_PCI_LOOP_BACK 0 /* 1=>enable, 0=>disable */ -#define ZM_PROTOCOL_RESPONSE_SIMULATION 0 - -#define ZM_RX_FRAME_SIZE 1600 - -extern const u8_t zg11bRateTbl[4]; -extern const u8_t zg11gRateTbl[8]; - -#define ZM_DRIVER_CORE_MAJOR_VERSION 1 -#define ZM_DRIVER_CORE_MINOR_VERSION 1 -#define ZM_DRIVER_CORE_BRANCH_MAJOR_VERSION 3 -#define ZM_DRIVER_CORE_BRANCH_MINOR_VERSION 39 - -#ifndef ZM_VTXQ_SIZE -#define ZM_VTXQ_SIZE 1024 //2^N -#endif - -#define ZM_VTXQ_SIZE_MASK (ZM_VTXQ_SIZE-1) -#define ZM_VMMQ_SIZE 8 //2^N -#define ZM_VMMQ_SIZE_MASK (ZM_VMMQ_SIZE-1) - -#include "cagg.h" - -#define ZM_AGG_POOL_SIZE 20 -#define ZM_RATE_TABLE_SIZE 32 - -#define ZM_MAX_BUF_DISCRETE_NUMBER 5 - - - - - - - - - -/**********************************************************************************/ -/* IBSS macros */ -/**********************************************************************************/ -#define ZM_IBSS_PEER_ALIVE_COUNTER 4 - -/**********************************************************************************/ -/* BIT mapping related macros */ -/**********************************************************************************/ - -#define ZM_BIT_0 0x1 -#define ZM_BIT_1 0x2 -#define ZM_BIT_2 0x4 -#define ZM_BIT_3 0x8 -#define ZM_BIT_4 0x10 -#define ZM_BIT_5 0x20 -#define ZM_BIT_6 0x40 -#define ZM_BIT_7 0x80 -#define ZM_BIT_8 0x100 -#define ZM_BIT_9 0x200 -#define ZM_BIT_10 0x400 -#define ZM_BIT_11 0x800 -#define ZM_BIT_12 0x1000 -#define ZM_BIT_13 0x2000 -#define ZM_BIT_14 0x4000 -#define ZM_BIT_15 0x8000 -#define ZM_BIT_16 0x10000 -#define ZM_BIT_17 0x20000 -#define ZM_BIT_18 0x40000 -#define ZM_BIT_19 0x80000 -#define ZM_BIT_20 0x100000 -#define ZM_BIT_21 0x200000 -#define ZM_BIT_22 0x400000 -#define ZM_BIT_23 0x800000 -#define ZM_BIT_24 0x1000000 -#define ZM_BIT_25 0x2000000 -#define ZM_BIT_26 0x4000000 -#define ZM_BIT_27 0x8000000 -#define ZM_BIT_28 0x10000000 -#define ZM_BIT_29 0x20000000 //WPA support -#define ZM_BIT_30 0x40000000 -#define ZM_BIT_31 0x80000000 - - -/**********************************************************************************/ -/* MAC address related macros */ -/**********************************************************************************/ -#define ZM_MAC_BYTE_TO_WORD(macb, macw) macw[0] = macb[0] + (macb[1] << 8); \ - macw[1] = macb[2] + (macb[3] << 8); \ - macw[2] = macb[4] + (macb[5] << 8); - -#define ZM_MAC_WORD_TO_BYTE(macw, macb) macb[0] = (u8_t) (macw[0] & 0xff); \ - macb[1] = (u8_t) (macw[0] >> 8); \ - macb[2] = (u8_t) (macw[1] & 0xff); \ - macb[3] = (u8_t) (macw[1] >> 8); \ - macb[4] = (u8_t) (macw[2] & 0xff); \ - macb[5] = (u8_t) (macw[2] >> 8); - -#define ZM_MAC_0(macw) ((u8_t)(macw[0] & 0xff)) -#define ZM_MAC_1(macw) ((u8_t)(macw[0] >> 8)) -#define ZM_MAC_2(macw) ((u8_t)(macw[1] & 0xff)) -#define ZM_MAC_3(macw) ((u8_t)(macw[1] >> 8)) -#define ZM_MAC_4(macw) ((u8_t)(macw[2] & 0xff)) -#define ZM_MAC_5(macw) ((u8_t)(macw[2] >> 8)) - -#define ZM_IS_MULTICAST_OR_BROADCAST(mac) (mac[0] & 0x01) -#define ZM_IS_MULTICAST(mac) ((mac[0] & 0x01) && (((u8_t)mac[0]) != 0xFF)) - -#define ZM_MAC_EQUAL(mac1, mac2) ((mac1[0]==mac2[0])&&(mac1[1]==mac2[1])&&(mac1[2]==mac2[2])) -#define ZM_MAC_NOT_EQUAL(mac1, mac2) ((mac1[0]!=mac2[0])||(mac1[1]!=mac2[1])||(mac1[2]!=mac2[2])) -/**********************************************************************************/ -/* MAC address related mac'ros (end) */ -/**********************************************************************************/ -#define ZM_BYTE_TO_WORD(A, B) ((A<<8)+B) -#define ZM_ROL32( A, n ) \ - ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) -#define ZM_ROR32( A, n ) ZM_ROL32( (A), 32-(n) ) -#define ZM_LO8(v16) ((u8_t)((v16) & 0xFF)) -#define ZM_HI8(v16) ((u8_t)(((v16)>>8)&0xFF)) - -#ifdef ZM_ENABLE_BUFFER_TRACE -extern void zfwBufTrace(zdev_t* dev, zbuf_t *buf, u8_t *functionName); -#define ZM_BUFFER_TRACE(dev, buf) zfwBufTrace(dev, buf, __func__); -#else -#define ZM_BUFFER_TRACE(dev, buf) -#endif - -/* notification events to heart beat function */ -#define ZM_BSSID_LIST_SCAN 0x01 - -/* CAM mode */ -#define ZM_CAM_AP 0x1 -#define ZM_CAM_STA 0x2 -#define ZM_CAM_HOST 0x4 - -/* finite state machine for adapter */ -#define ZM_STA_STATE_DISCONNECT 1 -#define ZM_STA_STATE_CONNECTING 2 -#define ZM_STA_STATE_CONNECTED 3 - -/* Event definitions for finite state machine */ -#define ZM_EVENT_TIMEOUT_SCAN 0x0000 -#define ZM_EVENT_TIMEOUT_BG_SCAN 0x0001 -#define ZN_EVENT_TIMEOUT_RECONNECT 0x0002 -#define ZM_EVENT_TIMEOUT_INIT_SCAN 0x0003 -#define ZM_EVENT_TIMEOUT_AUTH 0x0004 -#define ZM_EVENT_TIMEOUT_ASSO 0x0005 -#define ZM_EVENT_TIMEOUT_AUTO_SCAN 0x0006 -#define ZM_EVENT_TIMEOUT_MIC_FAIL 0x0007 -#define ZM_EVENT_TIMEOUT_CHECK_AP 0x0008 -#define ZM_EVENT_CONNECT 0x0009 -#define ZM_EVENT_INIT_SCAN 0x000a -#define ZM_EVENT_SCAN 0x000b -#define ZM_EVENT_BG_SCAN 0x000c -#define ZM_EVENT_DISCONNECT 0x000d -#define ZM_EVENT_WPA_MIC_FAIL 0x000e -#define ZM_EVENT_AP_ALIVE 0x000f -#define ZM_EVENT_CHANGE_TO_AP 0x0010 -#define ZM_EVENT_CHANGE_TO_STA 0x0011 -#define ZM_EVENT_IDLE 0x0012 -#define ZM_EVENT_AUTH 0x0013 -#define ZM_EVENT_ASSO_RSP 0x0014 -#define ZM_EVENT_WPA_PK_OK 0x0015 -#define ZM_EVENT_WPA_GK_OK 0x0016 -#define ZM_EVENT_RCV_BEACON 0x0017 -#define ZM_EVENT_RCV_PROBE_RSP 0x0018 -#define ZM_EVENT_SEND_DATA 0x0019 -#define ZM_EVENT_AUTO_SCAN 0x001a -#define ZM_EVENT_MIC_FAIL1 0x001d -#define ZM_EVENT_MIC_FAIL2 0x001e -#define ZM_EVENT_IBSS_MONITOR 0x001f -#define ZM_EVENT_IN_SCAN 0x0020 -#define ZM_EVENT_CM_TIMER 0x0021 -#define ZM_EVENT_CM_DISCONNECT 0x0022 -#define ZM_EVENT_CM_BLOCK_TIMER 0x0023 -#define ZM_EVENT_TIMEOUT_ADDBA 0x0024 -#define ZM_EVENT_TIMEOUT_PERFORMANCE 0x0025 -#define ZM_EVENT_SKIP_COUNTERMEASURE 0x0026 -#define ZM_EVENT_NONE 0xffff - -/* Actions after call finite state machine */ -#define ZM_ACTION_NONE 0x0000 -#define ZM_ACTION_QUEUE_DATA 0x0001 -#define ZM_ACTION_DROP_DATA 0x0002 - -/* Timers for finite state machine */ -#define ZM_TICK_ZERO 0 -#define ZM_TICK_INIT_SCAN_END 8 -#define ZM_TICK_NEXT_BG_SCAN 50 -#define ZM_TICK_BG_SCAN_END 8 -#define ZM_TICK_AUTH_TIMEOUT 4 -#define ZM_TICK_ASSO_TIMEOUT 4 -#define ZM_TICK_AUTO_SCAN 300 -#define ZM_TICK_MIC_FAIL_TIMEOUT 6000 -#define ZM_TICK_CHECK_AP1 150 -#define ZM_TICK_CHECK_AP2 350 -#define ZM_TICK_CHECK_AP3 250 -#define ZM_TICK_IBSS_MONITOR 160 -#define ZM_TICK_IN_SCAN 4 -#define ZM_TICK_CM_TIMEOUT 6000 -#define ZM_TICK_CM_DISCONNECT 200 -#define ZM_TICK_CM_BLOCK_TIMEOUT 6000 - -/* Fix bug#33338 Counter Measure Issur */ -#ifdef NDIS_CM_FOR_XP -#define ZM_TICK_CM_TIMEOUT_OFFSET 2160 -#define ZM_TICK_CM_DISCONNECT_OFFSET 72 -#define ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET 2160 -#else -#define ZM_TICK_CM_TIMEOUT_OFFSET 0 -#define ZM_TICK_CM_DISCONNECT_OFFSET 0 -#define ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET 0 -#endif - -#define ZM_TIME_ACTIVE_SCAN 30 //ms -#define ZM_TIME_PASSIVE_SCAN 110 //ms - -/* finite state machine for BSS connect */ -#define ZM_STA_CONN_STATE_NONE 0 -#define ZM_STA_CONN_STATE_AUTH_OPEN 1 -#define ZM_STA_CONN_STATE_AUTH_SHARE_1 2 -#define ZM_STA_CONN_STATE_AUTH_SHARE_2 3 -#define ZM_STA_CONN_STATE_ASSOCIATE 4 -#define ZM_STA_CONN_STATE_SSID_NOT_FOUND 5 -#define ZM_STA_CONN_STATE_AUTH_COMPLETED 6 - -/* finite state machine for WPA handshaking */ -#define ZM_STA_WPA_STATE_INIT 0 -#define ZM_STA_WPA_STATE_PK_OK 1 -#define ZM_STA_WPA_STATE_GK_OK 2 - -/* various timers */ -#define ZM_INTERVAL_CONNECT_TIMEOUT 20 /* 200 milisecond */ - -/* IBSS definitions */ -#define ZM_IBSS_PARTNER_LOST 0 -#define ZM_IBSS_PARTNER_ALIVE 1 -#define ZM_IBSS_PARTNER_CHECK 2 - -#define ZM_BCMC_ARRAY_SIZE 16 /* Must be 2^N */ -#define ZM_UNI_ARRAY_SIZE 16 /* Must be 2^N */ - -#define ZM_MAX_DEFRAG_ENTRIES 4 /* 2^N */ -#define ZM_DEFRAG_AGING_TIME_SEC 5 /* 5 seconds */ - -#define ZM_MAX_WPAIE_SIZE 128 -/* WEP related definitions */ -#define ZM_USER_KEY_DEFAULT 64 -#define ZM_USER_KEY_PK 0 /* Pairwise Key */ -#define ZM_USER_KEY_GK 1 /* Group Key */ -/* AP WLAN Type */ -#define ZM_WLAN_TYPE_PURE_B 2 -#define ZM_WLAN_TYPE_PURE_G 1 -#define ZM_WLAN_TYPE_MIXED 0 - -/* HAL State */ -#define ZM_HAL_STATE_INIT 0 -#define ZM_HAL_STATE_RUNNING 1 - -/* AP Capability */ -#define ZM_All11N_AP 0x01 -#define ZM_XR_AP 0x02 -#define ZM_SuperG_AP 0x04 - -/* MPDU Density */ -#define ZM_MPDU_DENSITY_NONE 0 -#define ZM_MPDU_DENSITY_1_8US 1 -#define ZM_MPDU_DENSITY_1_4US 2 -#define ZM_MPDU_DENSITY_1_2US 3 -#define ZM_MPDU_DENSITY_1US 4 -#define ZM_MPDU_DENSITY_2US 5 -#define ZM_MPDU_DENSITY_4US 6 -#define ZM_MPDU_DENSITY_8US 7 - -/* Software Encryption */ -#define ZM_SW_TKIP_ENCRY_EN 0x01 -#define ZM_SW_TKIP_DECRY_EN 0x02 -#define ZM_SW_WEP_ENCRY_EN 0x04 -#define ZM_SW_WEP_DECRY_EN 0x08 - -/* Default Support Rate */ -#define ZM_DEFAULT_SUPPORT_RATE_ZERO 0x0 -#define ZM_DEFAULT_SUPPORT_RATE_DISCONNECT 0x1 -#define ZM_DEFAULT_SUPPORT_RATE_IBSS_B 0x2 -#define ZM_DEFAULT_SUPPORT_RATE_IBSS_AG 0x3 - -/* security related definitions */ -struct zsTkipSeed -{ - u8_t tk[32]; /* key */ - u8_t ta[6]; - u16_t ttak[5]; - u16_t ppk[6]; - u16_t iv16,iv16tmp; - u32_t iv32,iv32tmp; -}; - -struct zsMicVar -{ - u32_t k0, k1; // Key - u32_t left, right; // Current state - u32_t m; // Message accumulator (single word) - u16_t nBytes; // # bytes in M -}; - -struct zsDefragEntry -{ - u8_t fragCount; - u8_t addr[6]; - u16_t seqNum; - zbuf_t* fragment[8]; - u32_t tick; -}; - -struct zsDefragList -{ - struct zsDefragEntry defragEntry[ZM_MAX_DEFRAG_ENTRIES]; - u8_t replaceNum; -}; - -#define ZM_MAX_OPPOSITE_COUNT 16 -#define ZM_MAX_TX_SAMPLES 15 -#define ZM_TX_RATE_DOWN_CRITERIA 80 -#define ZM_TX_RATE_UP_CRITERIA 200 - - -#define ZM_MAX_PROBE_HIDDEN_SSID_SIZE 2 -struct zsSsidList -{ - u8_t ssid[32]; - u8_t ssidLen; -}; - -struct zsWrapperSetting -{ - u8_t bDesiredBssid; - u8_t desiredBssid[6]; - u16_t bssid[3]; - u8_t ssid[32]; - u8_t ssidLen; - u8_t authMode; - u8_t wepStatus; - u8_t encryMode; - u8_t wlanMode; - u16_t frequency; - u16_t beaconInterval; - u8_t dtim; - u8_t preambleType; - u16_t atimWindow; - - struct zsSsidList probingSsidList[ZM_MAX_PROBE_HIDDEN_SSID_SIZE]; - - u8_t dropUnencryptedPkts; - u8_t ibssJoinOnly; - u32_t adhocMode; - u8_t countryIsoName[4]; - u16_t autoSetFrequency; - - /* AP */ - u8_t bRateBasic; - u8_t gRateBasic; - u32_t nRateBasic; - u8_t bgMode; - - /* Common */ - u8_t staWmeEnabled; - u8_t staWmeQosInfo; - u8_t apWmeEnabled; - - - /* rate information: added in the future */ -}; - -struct zsWrapperFeatureCtrl -{ - u8_t bIbssGMode; -}; - -#define ZM_MAX_PS_STA 16 -#define ZM_PS_QUEUE_SIZE 32 - -struct zsStaPSEntity -{ - u8_t bUsed; - u8_t macAddr[6]; - u8_t bDataQueued; -}; - -struct zsStaPSList -{ - u8_t count; - struct zsStaPSEntity entity[ZM_MAX_PS_STA]; -}; - -#define ZM_MAX_TIMER_COUNT 32 - -/* double linked list */ -struct zsTimerEntry -{ - u16_t event; - u32_t timer; - struct zsTimerEntry *pre; - struct zsTimerEntry *next; -}; - -struct zsTimerList -{ - u8_t freeCount; - struct zsTimerEntry list[ZM_MAX_TIMER_COUNT]; - struct zsTimerEntry *head; - struct zsTimerEntry *tail; -}; - -/* Multicast list */ -#define ZM_MAX_MULTICAST_LIST_SIZE 64 - -struct zsMulticastAddr -{ - u8_t addr[6]; -}; - -struct zsMulticastList -{ - u8_t size; - struct zsMulticastAddr macAddr[ZM_MAX_MULTICAST_LIST_SIZE]; -}; - -enum ieee80211_cwm_mode { - CWM_MODE20, - CWM_MODE2040, - CWM_MODE40, - CWM_MODEMAX - -}; - -enum ieee80211_cwm_extprotspacing { - CWM_EXTPROTSPACING20, - CWM_EXTPROTSPACING25, - CWM_EXTPROTSPACINGMAX -}; - -enum ieee80211_cwm_width { - CWM_WIDTH20, - CWM_WIDTH40 -}; - -enum ieee80211_cwm_extprotmode { - CWM_EXTPROTNONE, /* no protection */ - CWM_EXTPROTCTSONLY, /* CTS to self */ - CWM_EXTPROTRTSCTS, /* RTS-CTS */ - CWM_EXTPROTMAX -}; - -struct ieee80211_cwm { - - /* Configuration */ - enum ieee80211_cwm_mode cw_mode; /* CWM mode */ - u8_t cw_extoffset; /* CWM Extension Channel Offset */ - enum ieee80211_cwm_extprotmode cw_extprotmode; /* CWM Extension Channel Protection Mode */ - enum ieee80211_cwm_extprotspacing cw_extprotspacing;/* CWM Extension Channel Protection Spacing */ - u32_t cw_enable; /* CWM State Machine Enabled */ - u32_t cw_extbusythreshold;/* CWM Extension Channel Busy Threshold */ - - /* State */ - enum ieee80211_cwm_width cw_width; /* CWM channel width */ -}; - - -/* AP : STA database structure */ -struct zsStaTable -{ - u32_t time; /* tick time */ - //u32_t phyCtrl; /* Tx PHY CTRL */ - u16_t addr[3]; /* STA MAC address */ - u16_t state; /* aut/asoc */ - //u16_t retry; /* Retry count */ - struct zsRcCell rcCell; - - u8_t valid; /* Valid flag : 1=>valid */ - u8_t psMode; /* STA power saving mode */ - u8_t staType; /* 0=>11b, 1=>11g, 2=>11n */ - u8_t qosType; /* 0=>Legacy, 1=>WME */ - u8_t qosInfo; /* WME QoS info */ - u8_t vap; /* Virtual AP ID */ - u8_t encryMode; /* Encryption type for this STA */ - u8_t keyIdx; - struct zsMicVar txMicKey; - struct zsMicVar rxMicKey; - u16_t iv16; - u32_t iv32; -#ifdef ZM_ENABLE_CENC - /* CENC */ - u8_t cencKeyIdx; - u32_t txiv[4]; - u32_t rxiv[4]; -#endif //ZM_ENABLE_CENC -}; - -struct zdStructWds -{ - u8_t wdsBitmap; /* Set bit-N to 1 to enable WDS */ - u8_t encryMode[ZM_MAX_WDS_SUPPORT]; /* WDS encryption mode */ - u16_t macAddr[ZM_MAX_WDS_SUPPORT][3]; /* WDS neighbor MAC address */ -}; - - // htcapinfo 16bits -#define HTCAP_AdvCodingCap 0x0001 -#define HTCAP_SupChannelWidthSet 0x0002 -#define HTCAP_DynamicSMPS 0x0004 -#define HTCAP_SMEnabled 0x000C -#define HTCAP_GreenField 0x0010 -#define HTCAP_ShortGIfor20MHz 0x0020 -#define HTCAP_ShortGIfor40MHz 0x0040 -#define HTCAP_TxSTBC 0x0080 -#define HTCAP_RxOneStream 0x0100 -#define HTCAP_RxTwoStream 0x0200 -#define HTCAP_RxThreeStream 0x0300 -#define HTCAP_DelayedBlockACK 0x0400 -#define HTCAP_MaxAMSDULength 0x0800 -#define HTCAP_DSSSandCCKin40MHz 0x1000 -#define HTCAP_PSMPSup 0x2000 -#define HTCAP_STBCControlFrameSup 0x4000 -#define HTCAP_LSIGTXOPProtectionSUP 0x8000 - // Ampdu HT Parameter Info 8bits -#define HTCAP_MaxRxAMPDU0 0x00 -#define HTCAP_MaxRxAMPDU1 0x01 -#define HTCAP_MaxRxAMPDU2 0x02 -#define HTCAP_MaxRxAMPDU3 0x03 - // PCO 8bits -#define HTCAP_PCO 0x01 -#define HTCAP_TransmissionTime1 0x02 -#define HTCAP_TransmissionTime2 0x04 -#define HTCAP_TransmissionTime3 0x06 - // MCS FeedBack 8bits -#define HTCAP_PlusHTCSupport 0x04 -#define HTCAP_RDResponder 0x08 - // TX Beamforming 0 8bits -#define HTCAP_TxBFCapable 0x01 -#define HTCAP_RxStaggeredSoundCap 0x02 -#define HTCAP_TxStaggeredSoundCap 0x04 -#define HTCAP_RxZLFCapable 0x08 -#define HTCAP_TxZLFCapable 0x10 -#define HTCAP_ImplicitTxBFCapable 0x20 - // Tx Beamforming 1 8bits -#define HTCAP_ExplicitCSITxBFCap 0x01 -#define HTCAP_ExpUncompSteerMatrCap 0x02 - // Antenna Selection Capabilities 8bits -#define HTCAP_AntennaSelectionCap 0x01 -#define HTCAP_ExplicitCSITxASCap 0x02 -#define HTCAP_AntennaIndFeeTxASCap 0x04 -#define HTCAP_ExplicitCSIFeedbackCap 0x08 -#define HTCAP_AntennaIndFeedbackCap 0x10 -#define HTCAP_RxASCap 0x20 -#define HTCAP_TxSoundPPDUsCap 0x40 - - - -struct zsHTCapability -{ - u8_t ElementID; - u8_t Length; - // HT Capability Info - u16_t HtCapInfo; - u8_t AMPDUParam; - u8_t MCSSet[16]; //16 bytes - // Extended HT Capability Info - u8_t PCO; - u8_t MCSFeedBack; - - u8_t TxBFCap[4]; - u8_t AselCap; -}; - -union zuHTCapability -{ - struct zsHTCapability Data; - u8_t Byte[28]; -}; - - //channelinfo 8bits -#define ExtHtCap_ExtChannelOffsetAbove 0x01 -#define ExtHtCap_ExtChannelOffsetBelow 0x03 -#define ExtHtCap_RecomTxWidthSet 0x04 -#define ExtHtCap_RIFSMode 0x08 -#define ExtHtCap_ControlAccessOnly 0x10 - //operatinginfo 16bits -#define ExtHtCap_NonGFDevicePresent 0x0004 - //beaconinfo 16bits -#define ExtHtCap_DualBeacon 0x0040 -#define ExtHtCap_DualSTBCProtection 0x0080 -#define ExtHtCap_SecondaryBeacon 0x0100 -#define ExtHtCap_LSIGTXOPProtectFullSup 0x0200 -#define ExtHtCap_PCOActive 0x0400 -#define ExtHtCap_PCOPhase 0x0800 - - -struct zsExtHTCapability -{ - u8_t ElementID; - u8_t Length; - u8_t ControlChannel; - u8_t ChannelInfo; - u16_t OperatingInfo; - u16_t BeaconInfo; - // Supported MCS Set - u8_t MCSSet[16]; -}; - -union zuExtHTCapability -{ - struct zsExtHTCapability Data; - u8_t Byte[24]; -}; - -struct InformationElementSta { - struct zsHTCapability HtCap; - struct zsExtHTCapability HtInfo; -}; - -struct InformationElementAp { - struct zsHTCapability HtCap; -}; - -#define ZM_MAX_FREQ_REQ_QUEUE 32 -typedef void (*zfpFreqChangeCompleteCb)(zdev_t* dev); - -struct zsWlanDevFreqControl -{ - u16_t freqReqQueue[ZM_MAX_FREQ_REQ_QUEUE]; - u8_t freqReqBw40[ZM_MAX_FREQ_REQ_QUEUE]; - u8_t freqReqExtOffset[ZM_MAX_FREQ_REQ_QUEUE]; - zfpFreqChangeCompleteCb freqChangeCompCb[ZM_MAX_FREQ_REQ_QUEUE]; - u8_t freqReqQueueHead; - u8_t freqReqQueueTail; -}; - -struct zsWlanDevAp -{ - u16_t protectedObss; /* protected overlap BSS */ - u16_t staAgingTimeSec; /* in second, STA will be deathed if it does not */ - /* active for this long time */ - u16_t staProbingTimeSec;/* in second, STA will be probed if it does not */ - /* active for this long time */ - u8_t authSharing; /* authentication on going*/ - u8_t bStaAssociated; /* 11b STA associated */ - u8_t gStaAssociated; /* 11g STA associated */ - u8_t nStaAssociated; /* 11n STA associated */ - u16_t protectionMode; /* AP protection mode flag */ - u16_t staPowerSaving; /* Set associated power saving STA count */ - - - - zbuf_t* uniArray[ZM_UNI_ARRAY_SIZE]; /* array to store unicast frames */ - u16_t uniHead; - u16_t uniTail; - - /* HT Capability Info */ - union zuHTCapability HTCap; //CWYang(+) - - /* Extended HT Capability Info */ - union zuExtHTCapability ExtHTCap; //CWYang(+) - - /* STA table */ - struct zsStaTable staTable[ZM_MAX_STA_SUPPORT]; - - /* WDS */ - struct zdStructWds wds; - /* WPA */ - u8_t wpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_WPAIE_SIZE]; - u8_t wpaLen[ZM_MAX_AP_SUPPORT]; - u8_t stawpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_WPAIE_SIZE]; - u8_t stawpaLen[ZM_MAX_AP_SUPPORT]; - u8_t wpaSupport[ZM_MAX_AP_SUPPORT]; - - //struct zsTkipSeed bcSeed; - u8_t bcKeyIndex[ZM_MAX_AP_SUPPORT]; - u8_t bcHalKeyIdx[ZM_MAX_AP_SUPPORT]; - struct zsMicVar bcMicKey[ZM_MAX_AP_SUPPORT]; - u16_t iv16[ZM_MAX_AP_SUPPORT]; - u32_t iv32[ZM_MAX_AP_SUPPORT]; - -#ifdef ZM_ENABLE_CENC - /* CENC */ - u32_t txiv[ZM_MAX_AP_SUPPORT][4]; -#endif //ZM_ENABLE_CENC - - /* Virtual AP */ - u8_t beaconCounter; - u8_t vapNumber; - u8_t apBitmap; /* Set bit-N to 1 to enable VAP */ - u8_t hideSsid[ZM_MAX_AP_SUPPORT]; - u8_t authAlgo[ZM_MAX_AP_SUPPORT]; - u8_t ssid[ZM_MAX_AP_SUPPORT][32]; /* SSID */ - u8_t ssidLen[ZM_MAX_AP_SUPPORT]; /* SSID length */ - u8_t encryMode[ZM_MAX_AP_SUPPORT]; - u8_t wepStatus[ZM_MAX_AP_SUPPORT]; - u16_t capab[ZM_MAX_AP_SUPPORT]; /* Capability */ - u8_t timBcmcBit[ZM_MAX_AP_SUPPORT]; /* BMCM bit of TIM */ - u8_t wlanType[ZM_MAX_AP_SUPPORT]; - - /* Array to store BC or MC frames */ - zbuf_t* bcmcArray[ZM_MAX_AP_SUPPORT][ZM_BCMC_ARRAY_SIZE]; - u16_t bcmcHead[ZM_MAX_AP_SUPPORT]; - u16_t bcmcTail[ZM_MAX_AP_SUPPORT]; - - u8_t qosMode; /* 1=>WME */ - u8_t uapsdEnabled; - struct zsQueue* uapsdQ; - - u8_t challengeText[128]; - - struct InformationElementAp ie[ZM_MAX_STA_SUPPORT]; - - -}; - -#define ZM_MAX_BLOCKING_AP_LIST_SIZE 4 /* 2^N */ -struct zsBlockingAp -{ - u8_t addr[6]; - u8_t weight; -}; - -#define ZM_SCAN_MGR_SCAN_NONE 0 -#define ZM_SCAN_MGR_SCAN_INTERNAL 1 -#define ZM_SCAN_MGR_SCAN_EXTERNAL 2 - -struct zsWlanDevStaScanMgr -{ - u8_t scanReqs[2]; - u8_t currScanType; - u8_t scanStartDelay; -}; - -#define ZM_PS_MSG_STATE_ACTIVE 0 -#define ZM_PS_MSG_STATE_SLEEP 1 -#define ZM_PS_MSG_STATE_T1 2 -#define ZM_PS_MSG_STATE_T2 3 -#define ZM_PS_MSG_STATE_S1 4 - -#define ZM_PS_MAX_SLEEP_PERIODS 3 // The number of beacon periods - -struct zsWlanDevStaPSMgr -{ - u8_t state; - u8_t isSleepAllowed; - u8_t maxSleepPeriods; - u8_t ticks; - u32_t lastTxUnicastFrm; - u32_t lastTxMulticastFrm; - u32_t lastTxBroadcastFrm; - u8_t tempWakeUp; /*enable when wake up but still in ps mode */ - u16_t sleepAllowedtick; -}; - -struct zsWlanDevSta -{ - u32_t beaconTxCnt; /* Transmitted beacon counter (in IBSS) */ - u8_t txBeaconInd; /* In IBSS mode, true means that we just transmit a beacon during - last beacon period. - */ - u16_t beaconCnt; /* receive beacon count, will be perodically reset */ - u16_t bssid[3]; /* BSSID of connected AP */ - u8_t ssid[32]; /* SSID */ - u8_t ssidLen; /* SSID length */ - u8_t mTxRate; /* Tx rate for multicast */ - u8_t uTxRate; /* Tx rate for unicast */ - u8_t mmTxRate; /* Tx rate for management frame */ - u8_t bChannelScan; - u8_t bScheduleScan; - - u8_t InternalScanReq; - u16_t activescanTickPerChannel; - u16_t passiveScanTickPerChannel; - u16_t scanFrequency; - u32_t connPowerInHalfDbm; - - u16_t currentFrequency; - u16_t currentBw40; - u16_t currentExtOffset; - - u8_t bPassiveScan; - - struct zsBlockingAp blockingApList[ZM_MAX_BLOCKING_AP_LIST_SIZE]; - - //struct zsBssInfo bssInfoPool[ZM_MAX_BSS]; - struct zsBssInfo* bssInfoArray[ZM_MAX_BSS]; - struct zsBssList bssList; - u8_t bssInfoArrayHead; - u8_t bssInfoArrayTail; - u8_t bssInfoFreeCount; - - u8_t authMode; - u8_t currentAuthMode; - u8_t wepStatus; - u8_t encryMode; - u8_t keyId; -#ifdef ZM_ENABLE_IBSS_WPA2PSK - u8_t ibssWpa2Psk; -#endif -#ifdef ZM_ENABLE_CENC - u8_t cencKeyId; //CENC -#endif //ZM_ENABLE_CENC - u8_t dropUnencryptedPkts; - u8_t ibssJoinOnly; - u8_t adapterState; - u8_t oldAdapterState; - u8_t connectState; - u8_t connectRetry; - u8_t wpaState; - u8_t wpaIe[ZM_MAX_IE_SIZE + 2]; - u8_t rsnIe[ZM_MAX_IE_SIZE + 2]; - u8_t challengeText[255+2]; - u8_t capability[2]; - //u8_t connectingHiddenAP; - //u8_t scanWithSSID; - u16_t aid; - u32_t mgtFrameCount; - u8_t bProtectionMode; - u32_t NonNAPcount; - u8_t RTSInAGGMode; - u32_t connectTimer; - u16_t atimWindow; - u8_t desiredBssid[6]; - u8_t bDesiredBssid; - struct zsTkipSeed txSeed; - struct zsTkipSeed rxSeed[4]; - struct zsMicVar txMicKey; - struct zsMicVar rxMicKey[4]; - u16_t iv16; - u32_t iv32; - struct zsOppositeInfo oppositeInfo[ZM_MAX_OPPOSITE_COUNT]; - u8_t oppositeCount; - u8_t bssNotFoundCount; /* sitesurvey for search desired ISBB threshold */ - u16_t rxBeaconCount; - u8_t beaconMissState; - u32_t rxBeaconTotal; - u8_t bIsSharedKey; - u8_t connectTimeoutCount; - - u8_t recvAtim; - - /* ScanMgr Control block */ - struct zsWlanDevStaScanMgr scanMgr; - struct zsWlanDevStaPSMgr psMgr; - - // The callback would be called if receiving an unencrypted packets but - // the station is in encrypted mode. The wrapper could decide whether - // to drop the packet by its OS setting. - zfpStaRxSecurityCheckCb pStaRxSecurityCheckCb; - - /* WME */ - u8_t apWmeCapability; //bit-0 => a WME AP - //bit-7 => a UAPSD AP - u8_t wmeParameterSetCount; - - u8_t wmeEnabled; - #define ZM_STA_WME_ENABLE_BIT 0x1 - #define ZM_STA_UAPSD_ENABLE_BIT 0x2 - u8_t wmeQosInfo; - - u8_t wmeConnected; - u8_t qosInfo; - struct zsQueue* uapsdQ; - - /* countermeasures */ - u8_t cmMicFailureCount; - u8_t cmDisallowSsidLength; - u8_t cmDisallowSsid[32]; - - /* power-saving mode */ - u8_t powerSaveMode; - zbuf_t* staPSDataQueue[ZM_PS_QUEUE_SIZE]; - u8_t staPSDataCount; - - /* IBSS power-saving mode */ - /* record the STA which has entered the PS mode */ - struct zsStaPSList staPSList; - /* queue the data of the PS STAs */ - zbuf_t* ibssPSDataQueue[ZM_PS_QUEUE_SIZE]; - u8_t ibssPSDataCount; - u8_t ibssPrevPSDataCount; - u8_t bIbssPSEnable; - /* BIT_15: ON/OFF, BIT_0~14: Atim Timer */ - u16_t ibssAtimTimer; - - /* WPA2 */ - struct zsPmkidInfo pmkidInfo; - - /* Multicast list related objects */ - struct zsMulticastList multicastList; - - /* XP packet filter feature : */ - /* 1=>enable: All multicast address packets, not just the ones enumerated in the multicast address list. */ - /* 0=>disable */ - u8_t bAllMulticast; - - /* reassociation flag */ - u8_t connectByReasso; - u8_t failCntOfReasso; - - /* for HT configure control setting */ - u8_t preambleTypeHT; /* HT: 0 Mixed mode 1 Green field */ - u8_t htCtrlBandwidth; - u8_t htCtrlSTBC; - u8_t htCtrlSG; - u8_t defaultTA; - - u8_t connection_11b; - - u8_t EnableHT; - u8_t SG40; - u8_t HT2040; - /* for WPA setting */ - u8_t wpaSupport; - u8_t wpaLen; - - /* IBSS related objects */ - u8_t ibssDelayedInd; - struct zsPartnerNotifyEvent ibssDelayedIndEvent; - u8_t ibssPartnerStatus; - - u8_t bAutoReconnect; - - u8_t flagFreqChanging; - u8_t flagKeyChanging; - struct zsBssInfo ibssBssDesc; - u8_t ibssBssIsCreator; - u16_t ibssReceiveBeaconCount; - u8_t ibssSiteSurveyStatus; - - u8_t disableProbingWithSsid; -#ifdef ZM_ENABLE_CENC - /* CENC */ - u8_t cencIe[ZM_MAX_IE_SIZE + 2]; -#endif //ZM_ENABLE_CENC - u32_t txiv[4]; //Tx PN Sequence - u32_t rxiv[4]; //Rx PN Sequence - u32_t rxivGK[4];//Broadcast Rx PN Sequence - u8_t wepKey[4][32]; // For Software WEP - u8_t SWEncryMode[4]; - - /* 802.11d */ - u8_t b802_11D; - - /* 802.11h */ - u8_t TPCEnable; - u8_t DFSEnable; - u8_t DFSDisableTx; - - /* Owl AP */ - u8_t athOwlAp; - - /* Enable BA response in driver */ - u8_t enableDrvBA; - - /* HT Capability Info */ - union zuHTCapability HTCap; //CWYang(+) - - /* Extended HT Capability Info */ - union zuExtHTCapability ExtHTCap; //CWYang(+) - - struct InformationElementSta ie; - -#define ZM_CACHED_FRAMEBODY_SIZE 200 - u8_t asocReqFrameBody[ZM_CACHED_FRAMEBODY_SIZE]; - u16_t asocReqFrameBodySize; - u8_t asocRspFrameBody[ZM_CACHED_FRAMEBODY_SIZE]; - u16_t asocRspFrameBodySize; - u8_t beaconFrameBody[ZM_CACHED_FRAMEBODY_SIZE]; - u16_t beaconFrameBodySize; - - u8_t ac0PriorityHigherThanAc2; - u8_t SWEncryptEnable; - - u8_t leapEnabled; - - u32_t TotalNumberOfReceivePackets; - u32_t TotalNumberOfReceiveBytes; - u32_t avgSizeOfReceivePackets; - - u32_t ReceivedPacketRateCounter; - u32_t ReceivedPktRatePerSecond; - - /* #2 Record the sequence number to determine whether the unicast frame is separated by RIFS or not */ -#define ZM_RIFS_STATE_DETECTING 0 -#define ZM_RIFS_STATE_DETECTED 1 -#define ZM_RIFS_TIMER_TIMEOUT 4480 // 4480ms 7s - u8_t rifsState; - u8_t rifsLikeFrameCnt; - u16_t rifsLikeFrameSequence[3]; - u32_t rifsTimer; - u32_t rifsCount; - - /* RX filter desired by upper layers. Note this contains some bits which must be filtered - by sw since the hw supports only a subset of possible filter actions.= */ - u32_t osRxFilter; - - u8_t bSafeMode; - - u32_t ibssAdditionalIESize; - u8_t ibssAdditionalIE[256]; -}; //struct zsWlanDevSta - -#define ZM_CMD_QUEUE_SIZE 256 //Roger Check, test 64 when ready - -#define ZM_OID_READ 1 -#define ZM_OID_WRITE 2 -#define ZM_OID_INTERNAL_WRITE 3 -#define ZM_CMD_SET_FREQUENCY 4 -#define ZM_CMD_SET_KEY 5 -#define ZM_CWM_READ 6 -#define ZM_MAC_READ 7 -#define ZM_ANI_READ 8 -#define ZM_EEPROM_READ 9 -#define ZM_EEPROM_WRITE 0x0A -#define ZM_OID_CHAN 0x30 -#define ZM_OID_SYNTH 0x32 -#define ZM_OID_TALLY 0x81 -#define ZM_OID_TALLY_APD 0x82 - -#define ZM_OID_DKTX_STATUS 0x92 -#define ZM_OID_FLASH_CHKSUM 0xD0 -#define ZM_OID_FLASH_READ 0xD1 -#define ZM_OID_FLASH_PROGRAM 0xD2 -#define ZM_OID_FW_DL_INIT 0xD3 - -/* Driver to Firmware OID */ -#define ZM_CMD_ECHO 0x80 -#define ZM_CMD_TALLY 0x81 -#define ZM_CMD_TALLY_APD 0x82 -#define ZM_CMD_CONFIG 0x83 -#define ZM_CMD_RREG 0x00 -#define ZM_CMD_WREG 0x01 -#define ZM_CMD_RMEM 0x02 -#define ZM_CMD_WMEM 0x03 -#define ZM_CMD_BITAND 0x04 -#define ZM_CMD_BITOR 0x05 -#define ZM_CMD_EKEY 0x28 -#define ZM_CMD_DKEY 0x29 -#define ZM_CMD_FREQUENCY 0x30 -#define ZM_CMD_RF_INIT 0x31 -#define ZM_CMD_SYNTH 0x32 -#define ZM_CMD_FREQ_STRAT 0x33 -#define ZM_CMD_RESET 0x90 -#define ZM_CMD_DKRESET 0x91 -#define ZM_CMD_DKTX_STATUS 0x92 -#define ZM_CMD_FDC 0xA0 -#define ZM_CMD_WREEPROM 0xB0 -#define ZM_CMD_WFLASH 0xB0 -#define ZM_CMD_FLASH_ERASE 0xB1 -#define ZM_CMD_FLASH_PROG 0xB2 -#define ZM_CMD_FLASH_CHKSUM 0xB3 -#define ZM_CMD_FLASH_READ 0xB4 -#define ZM_CMD_FW_DL_INIT 0xB5 -#define ZM_CMD_MEM_WREEPROM 0xBB - - -/* duplicate filter table column */ -#define ZM_FILTER_TABLE_COL 2 /* 2^n */ -/* duplicate filter table Row */ -#define ZM_FILTER_TABLE_ROW 8 /* 2^n */ - -/* duplicate filter table structure */ -struct zsRxFilter -{ - u16_t addr[3]; - u16_t seq; - u8_t up; -}; - -struct zsWlanDev -{ - /* AP global variables */ - struct zsWlanDevAp ap; - /* STA global variables */ - struct zsWlanDevSta sta; - /* save wrapper setting */ - struct zsWrapperSetting ws; - /* features determined by wrapper (vendor) */ - struct zsWrapperFeatureCtrl wfc; - /* Traffic Monitor tally */ - struct zsTrafTally trafTally; - /* Communication tally */ - struct zsCommTally commTally; - /* Duplicate frame filter table */ - struct zsRxFilter rxFilterTbl[ZM_FILTER_TABLE_COL][ZM_FILTER_TABLE_ROW]; - /* Regulatory table */ - struct zsRegulationTable regulationTable; - - /* */ - struct zsWlanDevFreqControl freqCtrl; - - enum devState state; - - u8_t halState; - u8_t wlanMode; /* AP/INFRASTRUCTURE/IBSS/PSEUDO */ - u16_t macAddr[3]; /* MAC address */ - u16_t beaconInterval; /* beacon Interval */ - u8_t dtim; /* DTIM period */ - u8_t CurrentDtimCount; - u8_t preambleType; - u8_t preambleTypeInUsed; - u8_t maxTxPower2; /* 2.4 GHz Max Tx power (Unit: 0.5 dBm) */ - u8_t maxTxPower5; /* 5 GHz Max Tx power (Unit: 0.5 dBm) */ - u8_t connectMode; - u32_t supportMode; - - u8_t bRate; /* 11b Support Rate bit map */ - u8_t bRateBasic; /* 11b Basic Rate bit map */ - u8_t gRate; /* 11g Support Rate bit map */ - u8_t gRateBasic; /* 11g Basic Rate bit map */ - /* channel index point to the item in regulation table */ - u8_t channelIndex; - - /* channel management */ - u8_t BandWidth40; - u8_t ExtOffset; //1 above, 3 below, 0 not present - u16_t frequency; /* operation frequency */ - - u8_t erpElement; /* ERP information element data */ - - u8_t disableSelfCts; /* set to 1 to disable Self-CTS */ - u8_t bgMode; - - /* private test flag */ - u32_t enableProtectionMode; /* force enable/disable self cts */ - u32_t checksumTest; /* OTUS checksum test 1=>zero checksum 0=>normal */ - u32_t rxPacketDump; /* rx packet dump */ - - u8_t enableAggregation; /* force enable/disable A-MSPU */ - u8_t enableWDS; /* force enable/disable WDS testing */ - u8_t enableTxPathMode; /* OTUS special testing mode 1=>diable, 0=>enable: ZM_SYSTEM_TEST_MODE */ - u8_t enableHALDbgInfo; /* */ - - u32_t forceTxTPC; /* force tx packet send TPC */ - - u16_t seq[4]; - u16_t mmseq; - - /* driver core time tick */ - u32_t tick; - u16_t tickIbssSendBeacon; - u16_t tickIbssReceiveBeacon; - - /* RTS threshold */ - u16_t rtsThreshold; - - /* fragmentation threshold, 256 <= value <= 2346, 0=disabled */ - u16_t fragThreshold; - - /* Tx Rate */ - u16_t txMCS; - u16_t txMT; - u32_t CurrentTxRateKbps; //CWYang(+) - /* Rx Rate */ - u32_t CurrentRxRateKbps; //Janet(+) - u8_t CurrentRxRateUpdated; - u8_t modulationType; - u8_t rxInfo; - u16_t rateField; - - /* timer related objects */ - struct zsTimerList timerList; - u8_t bTimerReady; - - /* for defragmentation */ - struct zsDefragList defragTable; - - /* Data struct for Interface Dependent Layer */ - //struct zsIdlStruct idlStruct; - - /* Signal Strength/Quality Related Parameters */ - u8_t SignalStrength; //CWYang(+) - u8_t SignalQuality; //CWYang(+) - - - - /* QoS */ - zbuf_t* vtxq[4][ZM_VTXQ_SIZE]; - u16_t vtxqHead[4]; - u16_t vtxqTail[4]; - u16_t qosDropIpFrag[4]; - - /* Management Tx queue */ - zbuf_t* vmmq[ZM_VMMQ_SIZE]; - u16_t vmmqHead; - u16_t vmmqTail; - - u8_t vtxqPushing; - - /* - * add by honda - * 1. Aggregate queues - * 2. STA's associated information and queue number - * 3. rx aggregation re-ordering queue - */ - struct aggQueue *aggQPool[ZM_AGG_POOL_SIZE]; - u8_t aggInitiated; - u8_t addbaComplete; - u8_t addbaCount; - u8_t aggState; - u8_t destLock; - struct aggSta aggSta[ZM_MAX_STA_SUPPORT]; - struct agg_tid_rx *tid_rx[ZM_AGG_POOL_SIZE]; - struct aggTally agg_tal; - struct destQ destQ; - struct baw_enabler *baw_enabler; - struct ieee80211_cwm cwm; - u16_t reorder; - u16_t seq_debug; - /* rate control */ - u32_t txMPDU[ZM_RATE_TABLE_SIZE]; - u32_t txFail[ZM_RATE_TABLE_SIZE]; - u32_t PER[ZM_RATE_TABLE_SIZE]; - u16_t probeCount; - u16_t probeSuccessCount; - u16_t probeInterval; - u16_t success_probing; - /* - * end of add by honda - */ - - /* airopeek sniffer mode for upper sw */ - u32_t swSniffer; /* window: airoPeek */ - u32_t XLinkMode; - - /* MDK mode */ - /* init by 0=>normal driver 1=>MDK driver */ - u32_t modeMDKEnable; - - u32_t heartBeatNotification; - - /* pointer for HAL Plus private memory */ - void* hpPrivate; - - /* for WPA setting */ - //u8_t wpaSupport[ZM_MAX_AP_SUPPORT]; - //u8_t wpaLen[ZM_MAX_AP_SUPPORT]; - //u8_t wpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_IE_SIZE]; - - struct zsLedStruct ledStruct; - - /* ani flag */ - u8_t aniEnable; - u16_t txq_threshold; - - //Skip Mic Error Check - u8_t TKIP_Group_KeyChanging; - - u8_t dynamicSIFSEnable; - - u8_t queueFlushed; - - 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); -}; - - -struct zsWlanKey -{ - u8_t key; -}; - - -/* These macros are defined here for backward compatibility */ -/* Please leave them alone */ -/* For Tx packet allocated in upper layer layer */ -#define zmw_tx_buf_readb(dev, buf, offset) zmw_buf_readb(dev, buf, offset) -#define zmw_tx_buf_readh(dev, buf, offset) zmw_buf_readh(dev, buf, offset) -#define zmw_tx_buf_writeb(dev, buf, offset, value) zmw_buf_writeb(dev, buf, offset, value) -#define zmw_tx_buf_writeh(dev, buf, offset, value) zmw_buf_writeh(dev, buf, offset, value) - -/* For Rx packet allocated in driver */ -#define zmw_rx_buf_readb(dev, buf, offset) zmw_buf_readb(dev, buf, offset) -#define zmw_rx_buf_readh(dev, buf, offset) zmw_buf_readh(dev, buf, offset) -#define zmw_rx_buf_writeb(dev, buf, offset, value) zmw_buf_writeb(dev, buf, offset, value) -#define zmw_rx_buf_writeh(dev, buf, offset, value) zmw_buf_writeh(dev, buf, offset, value) - -#endif /* #ifndef _STRUCT_H */ diff --git a/drivers/staging/otus/80211core/wlan.h b/drivers/staging/otus/80211core/wlan.h deleted file mode 100644 index 26c18b837cfc..000000000000 --- a/drivers/staging/otus/80211core/wlan.h +++ /dev/null @@ -1,595 +0,0 @@ -/* - * 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 */ diff --git a/drivers/staging/otus/Kconfig b/drivers/staging/otus/Kconfig deleted file mode 100644 index e9181340bef1..000000000000 --- a/drivers/staging/otus/Kconfig +++ /dev/null @@ -1,34 +0,0 @@ -config OTUS - tristate "Atheros OTUS 802.11n USB wireless support" - depends on USB && WLAN && MAC80211 - select WIRELESS_EXT - select WEXT_PRIV - 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 -c /path/to/wpa_supplicant.conf -d - diff --git a/drivers/staging/otus/Makefile b/drivers/staging/otus/Makefile deleted file mode 100644 index debcc5cbf876..000000000000 --- a/drivers/staging/otus/Makefile +++ /dev/null @@ -1,67 +0,0 @@ -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 diff --git a/drivers/staging/otus/TODO b/drivers/staging/otus/TODO deleted file mode 100644 index 6fea974fcc9f..000000000000 --- a/drivers/staging/otus/TODO +++ /dev/null @@ -1,8 +0,0 @@ -I'm hesitant to add a TODO file here, as the wireless developers would -really have people help them out on the "clean" ar9170 driver that can -be found at the linux-wireless developer site. - -This driver is unmaintained and its only purpose is as a -source of documentation for developers working on ar9170 and carl9170. -Once carl9170 gets 11n support and merged upstream then this driver -can be removed. diff --git a/drivers/staging/otus/apdbg.c b/drivers/staging/otus/apdbg.c deleted file mode 100644 index 09415a6b93ca..000000000000 --- a/drivers/staging/otus/apdbg.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#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 *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 = NULL; - - 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 = NULL; - 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; ivalue; 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 " - "[
] []\"\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 , Set RTS Threshold\n"); - fprintf(stderr, " frag , 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 , Set WEP key\n"); - fprintf(stderr, " txcnt, Get TxQ Cnt\n"); - fprintf(stderr, " dagcnt, Get Deaggregate Cnt\n"); - fprintf(stderr, " durmode , Set Duration Mode " - "0=>HW, 1=>SW\n"); - fprintf(stderr, " aeskey \n"); - fprintf(stderr, " aesmode \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); -} - diff --git a/drivers/staging/otus/athr_common.h b/drivers/staging/otus/athr_common.h deleted file mode 100644 index 3e32f5b4ac68..000000000000 --- a/drivers/staging/otus/athr_common.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * 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 diff --git a/drivers/staging/otus/hal/hpDKfwu.c b/drivers/staging/otus/hal/hpDKfwu.c deleted file mode 100644 index 144c62dc8da2..000000000000 --- a/drivers/staging/otus/hal/hpDKfwu.c +++ /dev/null @@ -1,832 +0,0 @@ -/* - * 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; diff --git a/drivers/staging/otus/hal/hpani.c b/drivers/staging/otus/hal/hpani.c deleted file mode 100644 index 9b9420c75d42..000000000000 --- a/drivers/staging/otus/hal/hpani.c +++ /dev/null @@ -1,721 +0,0 @@ -/* - * 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; - struct zsHpPriv *HpPriv; - - zmw_get_wlan_dev(dev); - 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) -{ - u32_t i; - struct zsHpPriv *HpPriv; - - 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 }; - - zmw_get_wlan_dev(dev); - HpPriv = (struct zsHpPriv *)wd->hpPrivate; - - 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 < ARRAY_SIZE(HpPriv->ani); 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; -} - -/* - * Control Adaptive Noise Immunity Parameters - */ -u8_t zfHpAniControl(zdev_t *dev, ZM_HAL_ANI_CMD cmd, int param) -{ - typedef s32_t TABLE[]; - struct zsHpPriv *HpPriv; - struct zsAniState *aniState; - - zmw_get_wlan_dev(dev); - HpPriv = (struct zsHpPriv *)wd->hpPrivate; - aniState = HpPriv->curani; - - switch (cmd) - { - case ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL: - { - u32_t level = param; - - if (level >= ARRAY_SIZE(HpPriv->totalSizeDesired)) { - zm_debug_msg1("level out of range, desired level : ", level); - zm_debug_msg1("max level : ", ARRAY_SIZE(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 >= ARRAY_SIZE(firstep)) - { - zm_debug_msg1("level out of range, desired level : ", level); - zm_debug_msg1("max level : ", ARRAY_SIZE(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 >= ARRAY_SIZE(cycpwrThr1)) - { - zm_debug_msg1("level out of range, desired level : ", level); - zm_debug_msg1("max level : ", ARRAY_SIZE(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; -} - -void zfHpAniRestart(zdev_t* dev) -{ - struct zsAniState *aniState; - struct zsHpPriv *HpPriv; - - zmw_get_wlan_dev(dev); - 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; - struct zsHpPriv *HpPriv; - - zmw_get_wlan_dev(dev); - 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; - struct zsHpPriv *HpPriv; - - zmw_get_wlan_dev(dev); - 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; - struct zsHpPriv *HpPriv; - - zmw_get_wlan_dev(dev); - 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; - struct zsHpPriv *HpPriv; - - zmw_get_wlan_dev(dev); - 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; - struct zsHpPriv *HpPriv; - - zmw_get_wlan_dev(dev); - 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); - } - } -} diff --git a/drivers/staging/otus/hal/hpani.h b/drivers/staging/otus/hal/hpani.h deleted file mode 100644 index b89241371ab1..000000000000 --- a/drivers/staging/otus/hal/hpani.h +++ /dev/null @@ -1,419 +0,0 @@ -/* - * 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 diff --git a/drivers/staging/otus/hal/hpfw2.c b/drivers/staging/otus/hal/hpfw2.c deleted file mode 100644 index 17f405b5db17..000000000000 --- a/drivers/staging/otus/hal/hpfw2.c +++ /dev/null @@ -1,1018 +0,0 @@ -/* - * 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 zcP2FwImage[] = { -0x0009000B, 0x4F222FE6, 0xDE947FFC, 0xE114D594, -0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769, -0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F, -0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B, -0x0009B00D, 0xE60095AC, 0xC84060E2, 0x2F028F03, -0x8FF93652, 0x7F047601, 0xA05A4F26, 0x4F226EF6, -0x410BD185, 0xD4850009, 0x0009440B, 0x450BD584, -0xD7840009, 0xD284E1FF, 0x2712611D, 0xD4835029, -0xE1FFCB01, 0x1209E501, 0x12112212, 0xE7202452, -0x4718D57F, 0x2572D27F, 0xD17FE700, 0xD680D47F, -0xE2012270, 0x24702172, 0xD67E2620, 0x2641E4FF, -0xD57DE600, 0x666DE104, 0x76016063, 0x4000626D, -0x8FF83212, 0xD5790545, 0x2520E201, 0xD279D778, -0x2710E100, 0xE5802212, 0x655C6613, 0x666DD476, -0x76046763, 0x374C626D, 0x8FF83253, 0xD4732712, -0xD573E101, 0xD6732410, 0x2542E400, 0xE03AE501, -0xD272D771, 0xE0390654, 0x27110654, 0x000B4F26, -0x7FC82211, 0xD76FD16E, 0xDC70DB6F, 0xD271DE70, -0xD572D471, 0x1F12D672, 0x1F76710C, 0x1FB877FC, -0x1FEA1FC9, 0x72041F2B, 0xDE6FDC6E, 0x1F13EB10, -0x1F511F44, 0x1F771F65, 0xD86C1F2C, 0xDD6DD96C, -0xD26DEA00, 0x89003A22, 0xD1587A01, 0x88016010, -0x56F98B03, 0x4218E201, 0xD1682622, 0x0009410B, -0x440BD467, 0xD5670009, 0x0009450B, 0x6010D14C, -0x8B108801, 0xE650D14B, 0x46186212, 0x8B083266, -0x56FAD147, 0x2120E200, 0xCB016062, 0x2602A003, -0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A, -0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801, -0x51F76792, 0x217252F6, 0xD6555191, 0x55FB2212, -0x52FC6462, 0x55612542, 0x2252E400, 0x61436643, -0x05DE6013, 0x36CC4608, 0x02DE2652, 0xC9036021, -0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C, -0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518, -0x60822C62, 0x89018801, 0x0009A168, 0x6272D742, -0x8B132228, 0xD726D541, 0x6552D441, 0x51436672, -0x316C365C, 0x27622668, 0x14138D05, 0x6262D63D, -0xB1A57201, 0xD61E2622, 0x2622E200, 0x52916692, -0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C, -0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000, -0x001E1015, 0x00201278, 0x002018A0, 0x00201922, -0x0020128C, 0x001C3510, 0x001C3624, 0x001E212C, -0x0020397C, 0x00203514, 0x00203984, 0x00203990, -0x0020399C, 0x002039F8, 0x002039FC, 0x002039A4, -0x002039A5, 0x002039A8, 0x00117700, 0x00203A12, -0x00203578, 0x001142D8, 0x00203A14, 0x00203A16, -0x001C3D30, 0x00117718, 0x001C3D00, 0x001C1000, -0x001C36F8, 0x00117734, 0x001C3684, 0x00117710, -0x001C3520, 0x00117600, 0x00117740, 0x001C1028, -0x0020358C, 0x002039AC, 0x7FFFFFFF, 0x00201734, -0x002032BE, 0x002022E8, 0x00203DC0, 0x002039FA, -0x00203584, 0x002039EC, 0x001C3D2C, 0x001C36B0, -0x0020351C, 0x0011775C, 0x8801C90F, 0xA0CF8901, -0xD17C0009, 0x36206212, 0xD47B8904, 0x2421E200, -0x2162A0CC, 0x6211D179, 0x89012228, 0x0009A0C3, -0xE202D775, 0x75016571, 0x3123615D, 0x27518D02, -0x0009A0BC, 0xD27255F2, 0x62226052, 0x40094019, -0xC90F4009, 0x8F19880A, 0x52F31F2D, 0x40196022, -0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009, -0x51F255F8, 0xE701CB01, 0x2502D263, 0xE1002172, -0x2211D564, 0x74016452, 0x2542A098, 0x8B3F8805, -0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802, -0xE5FFD45D, 0x655D6742, 0x8B102758, 0x6272D75B, -0x8B0C3260, 0x55F257F8, 0x2762E101, 0xD5522512, -0xD757E400, 0x62722541, 0xA0777201, 0x52F32722, -0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E, -0xD5508B6C, 0x615257F4, 0x7101E240, 0x64722512, -0x1F4DD14D, 0x42182419, 0x8B033420, 0x6262D64B, -0x26227201, 0xE200D640, 0x2621B0AA, 0x0009A056, -0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022, -0x40094009, 0x8803C90F, 0xD7418B16, 0x647251F4, -0x7401D23D, 0x65122742, 0x1F5DE640, 0x46182529, -0x8B033560, 0x6262D63B, 0x26227201, 0xE200D62E, -0x2621B086, 0x0009A010, 0xD738D137, 0xD22A6412, -0xE5007401, 0x21423A76, 0x22518F06, 0xEA00D634, -0x72016262, 0x2622B074, 0x2FB2D532, 0x95406652, -0xD4305BF1, 0x36205241, 0x60618910, 0x8B01C803, -0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0, -0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006, -0xE200D615, 0xD1152621, 0x2121E200, 0xE20256F5, -0x42186662, 0x26284228, 0x1F6D8D0C, 0xD61FD11E, -0x460B6511, 0x2008645D, 0x57F58904, 0x6272D11C, -0x27222219, 0xD11BE201, 0x66122822, 0x8B012668, -0x0009AE17, 0x450BD518, 0xD1180009, 0xAE10E600, -0x07D12160, 0x00203A0C, 0x00203A10, 0x00203A18, -0x001C3DC0, 0x0011772C, 0x001C3B88, 0x002039F4, -0x0011773C, 0x00117744, 0x0000F000, 0x00117764, -0x00117748, 0x00117768, 0x0011776C, 0x01FFFFFF, -0x0011774C, 0x00203584, 0x001142D8, 0x00114774, -0xFDFFFFFF, 0x00203DC0, 0x0020246C, 0x002039FA, -0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, -0xD11F7FF4, 0x6212DE1F, 0x67E25411, 0xD41E1F41, -0x1F722F22, 0x6743D51D, 0x7794D21D, 0x5A425841, -0x6C726942, 0x6D225B16, 0xE6006052, 0x2502CB20, -0x7601E540, 0x3253626D, 0x62F28BFB, 0x212255F1, -0x55F21151, 0x2E52D613, 0x14A21481, 0xD4122492, -0x11B627C2, 0x674226D2, 0xD911DA10, 0x2A72E801, -0x1A8C490B, 0x4218E201, 0x7F0C1A2C, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x000068F6, -0x001C3B9C, 0x001C3D98, 0x001C3700, 0x001C3500, -0x001C5960, 0x001C8960, 0x0020358C, 0x001C3D00, -0x00201610, 0x2F962F86, 0x2FC62FA6, 0x2FE62FD6, -0x4F124F22, 0x7F884F02, 0xE018DEB2, 0xD4B261E0, -0x61E30F14, 0x62107101, 0x440BE01C, 0x20080F24, -0x8F126D03, 0xD4AD1F08, 0x6740DDAD, 0x657CD4AD, -0x470BD7AD, 0xD2AD0009, 0x621C6120, 0x46086623, -0x36284608, 0x3D6C4608, 0xE01C1FD8, 0xE58004FC, -0x604C66E2, 0x3050655C, 0x2D628F17, 0x01FCE018, -0xDEA3E500, 0x641CA008, 0x6753655D, 0x607037EC, -0x31DC6153, 0x80147501, 0x3243625D, 0xD49D8BF4, -0xE200D59D, 0xA27F2421, 0x20082521, 0xE0188B13, -0xE50001FC, 0xA009DE96, 0x655D641C, 0x32EC6253, -0x62536722, 0x32DC6672, 0x75041261, 0x3243625D, -0xA2698BF3, 0x88012D10, 0xE0188B16, 0xE40001FC, -0x671C2D40, 0x624DDE8A, 0x8B013273, 0x0009A25C, -0x6DE3644D, 0x7D046243, 0x32EC6643, 0x652236DC, -0x74086162, 0x2512AFEF, 0x8B198804, 0x01FCE018, -0x2D70E700, 0x1FD56D1C, 0x627DDE7D, 0x8B0132D3, -0x0009A242, 0x6173677D, 0x31EC65E3, 0x75046412, -0x365C6673, 0x61426262, 0x21297708, 0x2412AFED, -0x8B198805, 0x01FCE018, 0x2D70E700, 0x1FD46D1C, -0x627DDE6F, 0x8B0132D3, 0x0009A226, 0x6173677D, -0x31EC65E3, 0x75046412, 0x365C6673, 0x61426262, -0x212B7708, 0x2412AFED, 0x8B598831, 0x61E6DE67, -0x61E31F19, 0x64E27104, 0x1F4A6216, 0x1F2B6416, -0x75E46513, 0x66536712, 0x1F4C7604, 0x64521F7D, -0xD75F6E66, 0x27E0D25F, 0xDE5F6062, 0xC9013245, -0x65622E00, 0x4609060A, 0x4609D15C, 0x46094509, -0x21501F4E, 0xB2B0646D, 0x620D1F6F, 0x8B012228, -0x0009A1EA, 0xD756DE55, 0x661C61E0, 0x6410D150, -0x470B654C, 0x7FFC54FF, 0x2FE25EFE, 0x51FE7FFC, -0x2F12E040, 0x55FBD14F, 0x57FD56FC, 0x04FE410B, -0xD24D7F08, 0xE11C640D, 0x1D412D10, 0xD44B6522, -0x67421D52, 0x1D73DE4A, 0xD24A65E2, 0x67221D54, -0x1D75D249, 0xD2496E22, 0x66221DE6, 0x1D67A1BC, -0x89018830, 0x0009A08E, 0xE340D538, 0x33FC6156, -0x23126456, 0x71046153, 0x67521341, 0x13726416, -0x7EE46E13, 0x65E66212, 0x66E3D731, 0x13246EE2, -0x760427E0, 0x6062D22F, 0x3255DE2F, 0x2E00C901, -0x060A6E62, 0xD12D4609, 0x4E094609, 0x13434609, -0x646D21E0, 0xB2501F5E, 0x620D1F6F, 0x8B012228, -0x0009A18A, 0xDE25D522, 0x61E06450, 0xD724654C, -0x470B54FF, 0x7FFC661C, 0x06FEE054, 0x7FFC2F62, -0xEE4001FE, 0x2F123EFC, 0x55E2D125, 0x57E456E3, -0x64E2410B, 0xD21C7F08, 0xE11C640D, 0x1D412D10, -0xD61A6522, 0x67621D52, 0x1D73DE19, 0xD2196EE2, -0x62221DE4, 0xD2181D25, 0x1D266222, 0x6222D217, -0x1D27A15A, 0x00117800, 0x00202A18, 0x00203996, -0x002035BC, 0x00203A7C, 0x002018D0, 0x00203995, -0x00117804, 0x00203A14, 0x00203A16, 0x00117810, -0x00203991, 0x10624DD3, 0x00203992, 0x00203993, -0x00114AA4, 0x00200F68, 0x001C5864, 0x001C6864, -0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC, -0x00200FC0, 0x8B048833, 0x470BD7A2, 0xA123EE00, -0x88282DE0, 0xA0D38901, 0xDE9F0009, 0x62E1E143, -0x3216E054, 0x0FE68F02, 0x2E21E240, 0x622D62E1, -0x8B013217, 0x0009A0BC, 0xE50185E1, 0x8B013056, -0x0009A0B6, 0x2D10E101, 0x64E1B111, 0x06FEE054, -0x6261E143, 0x3517652D, 0xE6408945, 0x8B0C3563, -0xE058E41A, 0xE5000F45, 0x72C0E05C, 0x60230F55, -0x6703C907, 0xA014E060, 0x66530F75, 0x46214621, -0x46214621, 0x45214621, 0xE0587618, 0x0F654521, -0xE0034521, 0xE05C2509, 0xE0070F55, 0xE0602209, -0xE8540F25, 0x858238FC, 0x640D65F3, 0x1844B170, -0xDD7A8584, 0x85866C0D, 0x610D4C08, 0x410860C3, -0xE00F0EFE, 0x18154D0B, 0x2E296207, 0x668260C3, -0x85620FE6, 0x4D0B5185, 0x2E0B600D, 0x548460C3, -0xB13C0FE6, 0xE05465F3, 0xE5400EFE, 0xE06C62E1, -0x3653662D, 0x0F668D41, 0xC9036023, 0x40004008, -0x61036403, 0xD965E070, 0x0F46E5FF, 0xE074655C, -0x60530F96, 0x6263490B, 0x42214221, 0x42214221, -0x42006723, 0x4200327C, 0x6C074621, 0x4621E054, -0x606309FE, 0x4008C903, 0x790630FC, 0x6A036D2D, -0x65F3E800, 0x64D3B124, 0xE0706EA2, 0x2AE22EC9, -0x01FE6694, 0x666CE074, 0x470B07FE, 0x2E0B6063, -0x65F32AE2, 0xB0FA64D3, 0x628D7801, 0x32E3EE06, -0x7D018FE7, 0x0EFEE054, 0xE05462E1, 0x420006FE, -0x760C8561, 0x701B302C, 0xE4006103, 0xE70465F3, -0x68667401, 0x3973694D, 0x8FF92582, 0x65F37504, -0x641DB0DD, 0x0EFEE054, 0x64E1B09C, 0x0009A054, -0xD43B56F8, 0xEA01D23B, 0x26A0420B, 0x0009A04C, -0x06FCE01C, 0x8829606C, 0x5CF88B08, 0xE200D636, -0x52612C20, 0x642DB04B, 0x0009A03E, 0x666CE681, -0x8B043060, 0x420BD231, 0xA03554F8, 0xE6820009, -0x3060666C, 0xD22E8B04, 0x54F8420B, 0x0009A02C, -0x666CE683, 0x8B0A3060, 0xDA2755F8, 0x2590E900, -0xD82855A1, 0x2852D628, 0xA01D52A2, 0xE6922620, -0x3060666C, 0xD2208B08, 0x5C21D824, 0x6CCC52F8, -0x28C1E600, 0x2260A010, 0x666CE693, 0x8B063060, -0xD61F59F8, 0xE201EA00, 0xA00529A0, 0xD6162621, -0xD21DD41C, 0x6562420B, 0x4F067F78, 0x4F264F16, -0x6DF66EF6, 0x6AF66CF6, 0x000B69F6, 0x4F2268F6, -0xE240614D, 0x89323123, 0x3127E21F, 0x8B27D713, -0xD406614D, 0xE00171E0, 0x5671440B, 0x26596507, -0x1761A025, 0x00200FBC, 0x00117804, 0x00203470, -0x00203A9C, 0x002018C0, 0x00117800, 0x00115F00, -0x00116058, 0x0020397C, 0x00203990, 0x00203A1A, -0x00203A16, 0x00203AB4, 0x002018D0, 0x001C3704, -0xE001D490, 0x6672440B, 0x26596507, 0x4F262762, -0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912, -0xD7893127, 0x614D8B08, 0x5671D286, 0x420B71E0, -0x260BE001, 0x1761A006, 0x6672D282, 0xE001420B, -0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618, -0x6252D57E, 0x89FC2268, 0x0009000B, 0x4618E680, -0xD57A4628, 0x22686252, 0x000B89FC, 0xA0010009, -0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680, -0xD5734628, 0x22686252, 0x000B8BFC, 0x2FE60009, -0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D66D, -0x54E11615, 0x16464218, 0x422855E2, 0x57E31657, -0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE, -0x2FD62FC6, 0x4F222FE6, 0x6C53DD62, 0x6E43BFD6, -0x2DE2BFBB, 0x0009BFD2, 0x2C1251D5, 0x1C4154D6, -0x1C5255D7, 0x1C6356D8, 0x6EF64F26, 0x000B6DF6, -0x61636CF6, 0xA004E600, 0x62564109, 0x24227601, -0x36127404, 0x000B8BF9, 0xD6530009, 0x8562E500, -0xA00B674D, 0x655D610D, 0x40006053, 0x305CD44F, -0x024D4008, 0x3270622D, 0x75018905, 0x3213625D, -0x000B8BF1, 0x000BE000, 0x2FE6E001, 0x54416743, -0x4E08EE7F, 0x4E28D246, 0x25E96543, 0x60436E21, -0x9E7562ED, 0x4529C903, 0xE60032E3, 0x8D456103, -0x21184509, 0xD23F8B05, 0x002C6053, 0xA08AC93F, -0x60136603, 0x8B268801, 0x880C6053, 0xD53A8B04, -0xC93F8453, 0x6603A07F, 0x8B048808, 0x84E2DE36, -0xA078C93F, 0x880D6603, 0x8B03D633, 0xC93F8461, -0x6603A071, 0x88096260, 0x622C8F09, 0xE014DE2C, -0x655C05EC, 0x60233258, 0xA064C93F, 0x60236603, -0xA060C93F, 0x88026603, 0xE0078B5D, 0x60432509, -0x8905C810, 0x6053D225, 0xC93F002C, 0x6603A053, -0x6053DE23, 0xC93F00EC, 0x6603A04D, 0x88016013, -0x60538B19, 0x8B04880C, 0x8423D21E, 0xA042C93F, -0x88086603, 0xD51B8B04, 0xC93F8452, 0x6603A03B, -0xD618880D, 0x84618B03, 0xA034C93F, 0x60606603, -0xA030C93F, 0x88026603, 0xE0078B2D, 0x60432509, -0x8923C810, 0x6053DE10, 0xC93F00EC, 0x6603A023, -0x00000BB8, 0x00203470, 0x001C3704, 0x001C373C, -0x001C3700, 0x001C370C, 0x00114000, 0x00114008, -0x001142D8, 0x001142E4, 0x001142E8, 0x001142F5, -0x001142ED, 0x001142FD, 0x00114309, 0x6053D209, -0xC93F002C, 0x60136603, 0x8B038802, 0xC8106043, -0x76028900, 0xC93F6063, 0x40004018, 0x1741240B, -0x6EF6000B, 0x00114301, 0x0009A16E, 0x2FE62FD6, -0xDD944F22, 0xA0049EB2, 0xD4930009, 0x420BD293, -0x62D265D2, 0x8BF822E8, 0x0009A004, 0xD28FD490, -0x55D1420B, 0x22E852D1, 0xA0048BF8, 0xD48D0009, -0x420BD28A, 0x52D255D2, 0x8BF822E8, 0x0009A004, -0xD286D489, 0x55D3420B, 0x22E852D3, 0xA0048BF8, -0xD4860009, 0x420BD281, 0x52D455D4, 0x8BF822E8, -0x6EF64F26, 0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, -0x6E636C73, 0x6D53B01A, 0x64D357F4, 0xB05F65E3, -0xB07566C3, 0xB0A40009, 0xB0A80009, 0xB0AC0009, -0xB0AC0009, 0xB0AF0009, 0xB03154F5, 0x6CCD6C03, -0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0x3412D170, -0xD6700529, 0x2650D770, 0x2742000B, 0x0009A018, -0x2FD62FC6, 0x4F222FE6, 0x6E636C73, 0x6D53BFEE, -0x64D357F4, 0xB03365E3, 0xB08D66C3, 0xB00F54F5, -0x6CCD6C03, 0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, -0xE503D162, 0xD763D462, 0x21524518, 0x2472000B, -0xD45FD15E, 0x2162E600, 0x2462000B, 0xBF734F22, -0xBF73E40A, 0xD25C0009, 0x4118E104, 0xE40AE500, -0xBF692212, 0xD7592252, 0xCB206072, 0x000B4F26, -0x4F222702, 0x410BD156, 0xD556E400, 0x4F26452B, -0xD1552FE6, 0x66126E63, 0x92104418, 0x44084528, -0x45002629, 0x265B4408, 0x264B4400, 0x21624708, -0xD14E4708, 0x217227EB, 0x6EF6000B, 0x1FFF03F0, -0x4F222FE6, 0xE101DE4A, 0xBF3DE40A, 0x67E32E12, -0xE500776C, 0xE204E130, 0x2752E40A, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x27222712, 0x27522752, 0x27522752, 0x27522752, -0x27522752, 0x175ABF18, 0x2E62E600, 0x000B4F26, -0xD2346EF6, 0xE441E101, 0x000B2212, 0xD1322242, -0xE605D432, 0x000B2162, 0x000B2462, 0xD2300009, -0xE40AE601, 0x2262AF00, 0x2FC62FB6, 0x2FE62FD6, -0x7FFC4F22, 0x6C43DB2B, 0xED0060B2, 0x2B02CB03, -0xC90360B2, 0x6E03A008, 0x89073DC2, 0xE46460B2, -0xB07CC903, 0x7D016E03, 0x8BF52EE8, 0x8F043DC2, -0xD4212FE1, 0x460BD621, 0x62F10009, 0x6023622D, -0x89FFC801, 0x7F046023, 0x6EF64F26, 0x6CF66DF6, -0x6BF6000B, 0x001C3B88, 0x00203AC8, 0x002018D0, -0x00203AD0, 0x00203AD8, 0x00203AE0, 0x00203AE8, -0x0025E720, 0x00203DBC, 0x00203980, 0x001C5968, -0x001C3B40, 0x000F8000, 0x001D4004, 0x001C3500, -0x002015E4, 0x00201610, 0x001C5814, 0x001C59D0, -0x001C5830, 0x001C6268, 0x001C59A4, 0x001C639C, -0x001C581C, 0x001C5860, 0x00203AF0, 0x002018C0, -0x8F014411, 0x6043604B, 0x0009000B, 0x5651D52B, -0x46286052, 0x306C000B, 0x2FC62FB6, 0x2FE62FD6, -0x4F124F22, 0xBFF14F02, 0x6B036E43, 0xDD25DC24, -0x0009BFEC, 0x3C0530B8, 0x4609060A, 0x46014609, -0x020A3D65, 0x42094209, 0x32E24209, 0x4F068BF0, -0x4F264F16, 0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6, -0x2FE62FD6, 0x4F124F22, 0xBFCF4F02, 0x6C036E43, -0xBFCBDD13, 0x30C80009, 0x060A3D05, 0x46094609, -0x36E24601, 0x4F068BF5, 0x4F264F16, 0x6DF66EF6, -0x6CF6000B, 0x4F222FE6, 0xE102DE0B, 0xE403E500, -0xBFB92E12, 0xE6062E52, 0xE7004618, 0x2E62E403, -0x4F262E72, 0x6EF6AFB0, 0x0009000B, 0x001C1040, -0xCCCCCCCD, 0x10624DD3, 0x001D4004, 0x2F962F86, -0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0xE5007F98, -0x6453E710, 0x6B534728, 0xEE1ADCBC, 0x6153655D, -0x315C4108, 0x75014108, 0x6043317C, 0x0F16665D, -0xED0060B3, 0x21B136E3, 0x81128111, 0x11D28113, -0x11D411D3, 0x74048FEA, 0xD8B167F2, 0x1871D9B1, -0x58F12872, 0x1981D1B0, 0x59F22982, 0x5DF45AF3, -0x54F65EF5, 0x21921191, 0x11A211A3, 0x11D411D5, -0x11E611E7, 0x11481149, 0xDAA855F7, 0x57F8EE00, -0x52F9DDA7, 0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6, -0x2D72EAEF, 0x6AAC2622, 0x6DE36EED, 0x61E34D08, -0x41083DEC, 0x31EC4D08, 0x60B33D9C, 0x2DB14108, -0xE05081D1, 0xE79F4108, 0x41084008, 0x81D2677C, -0x318C60B3, 0x3472E200, 0x1DD281D3, 0xD4931D13, -0x1D248D01, 0x65D3D48F, 0x7E01B0B2, 0x34A264ED, -0xDA8C8BDA, 0x68A22FD2, 0x4829DD91, 0x64A22D82, -0x694D7DFC, 0x2D92D286, 0x4E296E22, 0x2DE27D0C, -0x6AD36822, 0xD784618D, 0x6D722A16, 0xD583D489, -0x5E7224D2, 0x14E2D688, 0xEE005174, 0x58761414, -0x1486D186, 0xE7105978, 0x62521498, 0x142A65E3, -0x64E326E2, 0x644DE600, 0x48086843, 0x4808384C, -0x6053381C, 0x28B10C86, 0x60B309CE, 0x60538191, -0x60430ACE, 0x605381A2, 0x60B30DCE, 0x605381D3, -0x740108CE, 0x09CE1882, 0x19E3624D, 0x32730ACE, -0x8FE01A64, 0xD96A7504, 0x6C92E003, 0x2CB14018, -0xDA6F6D92, 0xE05081D1, 0x40086E92, 0x619281E2, -0x811360B3, 0xE6006492, 0x67921442, 0x17A3D468, -0xE1FF6892, 0xE7031864, 0x46086563, 0x7501364C, -0x665D2612, 0x8BF83673, 0xE003DC5A, 0x40186DC2, -0x6EC22DB1, 0x81E1D25F, 0xEE0061C2, 0x64C21112, -0x1423E024, 0xD45B65C2, 0x67C215E4, 0x8172E580, -0x66E368C2, 0x655C8183, 0x6963666D, 0x6A6D7604, -0x3A53394C, 0x29E28FF8, 0xDC54DB53, 0x740424B2, -0x7F6824C2, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, -0x000B69F6, 0x614268F6, 0xC8036011, 0xE5008F03, -0x3420D23C, 0x60118B06, 0x8802C903, 0xD2398B06, -0x8B033420, 0x65135612, 0x24225264, 0x6053000B, -0x2FE62FD6, 0x7FEC4F22, 0x62536E53, 0x6D43E550, -0x4508E400, 0xE101A001, 0x60435224, 0x81212211, -0x60538123, 0x56E28122, 0x8BF53620, 0x16E4D238, -0xE61464F3, 0x65E3420B, 0xE4FC65E1, 0x2E512549, -0x65F361F1, 0x2F112149, 0xD13154D1, 0xE614410B, -0x607157D1, 0x2701CB01, 0x7F141DE1, 0x6EF64F26, -0x6DF6000B, 0x2FE62FD6, 0x7FEC4F22, 0x66536E53, -0x6D43E5FC, 0x20596061, 0x2601CB01, 0x326052E2, -0x12E48B06, 0x31E051E2, 0x52D18B04, 0x1E22A002, -0x5664AFF0, 0x64F3D21E, 0x420BE614, 0x67E165E3, -0x2719E1FC, 0x67F12E71, 0x271954D1, 0x65F3D118, -0x410BE614, 0x52D12F71, 0xCB016021, 0x1DE12201, -0x4F267F14, 0x000B6EF6, 0x00006DF6, 0x002039AC, -0x0020357C, 0x00203584, 0x0020358C, 0x002035B4, -0x00203998, 0x002039A0, 0x00100208, 0x001014C0, -0x001E210C, 0x001C3D00, 0x002039EC, 0x001000C8, -0x00117880, 0x00117780, 0x00040020, 0x0026C401, -0x00200D42, 0x4F222FE6, 0xDE42624C, 0x42004208, -0x3E2CA005, 0xD4405252, 0xBF695624, 0x65E22E62, -0x352052E1, 0xD63D8BF6, 0x4F262622, 0x6EF6000B, -0x2FC62FB6, 0x2FE62FD6, 0xDC394F22, 0x52C1DB39, -0x362066C2, 0x6061891C, 0x8801C903, 0xDE348918, -0xBF38DD35, 0x650364E3, 0x66B28503, 0x3262620D, -0xD4328907, 0x0009BF76, 0x4D0BD431, 0xAFE60009, -0xBF3D0009, 0xD42F64E3, 0x00094D0B, 0x0009AFDF, -0x2262D22D, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, -0x2FD62FC6, 0x4F222FE6, 0xDD29DC28, 0x6E4360C2, -0x04DE4008, 0xE614D127, 0x65E3410B, 0xD127D726, -0x55E227E2, 0x35E05254, 0x21228F04, 0x400860C2, -0x122202DE, 0x605365C2, 0x75014008, 0x0DE606DE, -0xC90F6053, 0x60632C02, 0x6EF64F26, 0x000B6DF6, -0x85436CF6, 0x650D5643, 0x622D6262, 0x35277204, -0xE1008F0C, 0x2268960C, 0xD6158B03, 0x72015261, -0xD6131621, 0x6262E101, 0x26227201, 0x6013000B, -0x000001FF, 0x0020358C, 0x00203584, 0x001C3D00, -0x002035B4, 0x0020397C, 0x002018C0, 0x0020357C, -0x00203B18, 0x00203B1C, 0x001C3D28, 0x002039EC, -0x002039AC, 0x00200D42, 0x002039F0, 0x002039F4, -0x00117754, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, -0x7FF84F22, 0x6C22D241, 0xC80360C3, 0xDE40896E, -0xDA41DB40, 0x52B1D941, 0x362066B2, 0x60618945, -0x8801C903, 0xDD3B8941, 0x420BD23D, 0x650364D3, -0x60A12F02, 0x89328801, 0x85145153, 0x8840600C, -0x1F118F0C, 0xD5376191, 0x641D450B, 0x8B262008, -0xD7356691, 0x646D470B, 0x8B202008, 0x420BD233, -0x51F154F1, 0xC8208511, 0xD1318904, 0x021EE050, -0x01267201, 0x420BD22F, 0x200864F2, 0x64D38907, -0x4D0BDD2D, 0xD12D65F2, 0xAFC4E601, 0xD22C2162, -0x420B65F2, 0xD72B64E3, 0xAFBCE601, 0xD2262762, -0x420B65F2, 0xAFB664D3, 0xDE270009, 0xDA28DD27, -0x52D1DB28, 0x362066D2, 0x60618918, 0x8801C903, -0xD4228914, 0x450BD516, 0x56030009, 0x8F0436E0, -0xE2016503, 0xAFEC2A20, 0xD41F2B52, 0x420BD216, -0xD7180009, 0x4118E101, 0x2712AFE3, 0xC80460C3, -0xD21A8902, 0x0009420B, 0x4F267F08, 0x6DF66EF6, -0x6BF66CF6, 0x000B6AF6, 0x000069F6, 0x001E2100, -0x0020358C, 0x00203584, 0x00203A14, 0x001142D8, -0x002014A6, 0x00115EA2, 0x00114774, 0x00200D8A, -0x0020351C, 0x002016C2, 0x002014D0, 0x001E212C, -0x00201534, 0x001C3D30, 0x00117880, 0x0020357C, -0x0020399C, 0x00203998, 0x002035B4, 0x00200644, -0xE601D203, 0x1265D503, 0x000B2252, 0x00001266, -0x001C1010, 0x0000C34F, 0x0009000B, 0x0009000B, -0x0009000B, 0x0009000B, 0xE000000B, 0xE000000B, -0x0009000B, 0xE4FDD59D, 0xD69D6152, 0x25122149, -0x74016052, 0x2502CB01, 0xD19A6752, 0x25722749, -0xC8406010, 0x60628902, 0x2602CB04, 0xE1F76462, -0x26422419, 0xE7016062, 0x2602C9CF, 0xE5026062, -0x2602CB10, 0x47186062, 0x2602CB03, 0x000B1652, -0xD58D1673, 0xD28ED78D, 0xE100D48E, 0x2511E600, -0x22102711, 0x2461AFCE, 0xD28B664C, 0x362C4600, -0xCB106060, 0x2600000B, 0xD287654C, 0x352C4500, -0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D283, -0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D27F, -0x6650352C, 0x2619E1EF, 0x2560000B, 0xD27A664C, -0x362C4600, 0xCB086060, 0x2600000B, 0xD276654C, -0x352C4500, 0xE1F76650, 0x000B2619, 0x664C2560, -0x4600D272, 0x6060362C, 0x000BCB08, 0x654C2600, -0x4500D26E, 0x6650352C, 0x2619E1F7, 0x2560000B, -0xD669624C, 0x326C4200, 0xC9086020, 0x40214021, -0x000B4021, 0x624C600C, 0x4200D664, 0x6020326C, -0x4021C908, 0x40214021, 0x600C000B, 0x644CD160, -0x6240341C, 0x602C000B, 0x644CD15E, 0x6240341C, -0x602C000B, 0x4F222FE6, 0x645C6E43, 0x3467E60A, -0xBFEB8914, 0x640C0009, 0x880160EC, 0xE00F8B02, -0x2409A002, 0x44094409, 0xE60A624C, 0x89053263, -0x644CBFE2, 0x6023620C, 0x8B00C880, 0x6023E200, -0x000B4F26, 0x4F226EF6, 0x6062D64B, 0x8B038801, -0x0009B256, 0x0009A003, 0xE640D248, 0xD6482260, -0x4F26E200, 0x2622000B, 0xD6434F22, 0x88026062, -0xB29F8B01, 0xD6420009, 0x4F26E200, 0x2622000B, -0xD43ED53D, 0xE701E100, 0x000B2512, 0xD23B2470, -0x000BE604, 0x4F222260, 0xD13BD43A, 0x0009410B, -0xE1FDD53A, 0xD23A6650, 0xE7002619, 0x4F262560, -0x2270000B, 0xD5374F22, 0x6152D237, 0x611DD737, -0x64522512, 0x242BE6FF, 0xD4352542, 0x666DD22E, -0x2762420B, 0xE1FBD52D, 0x27196750, 0x000B4F26, -0x4F222570, 0xD128D42F, 0x0009410B, 0xE7F7D527, -0x26796650, 0x000B4F26, 0xD5242560, 0x62509425, -0x000B2249, 0xD5212520, 0x6250E4BF, 0x000B2249, -0x4F222520, 0x8522D224, 0x2008600D, 0x88018911, -0x88038944, 0x88058946, 0x88068948, 0x8808894E, -0x88098954, 0x880A895A, 0x880B8960, 0xA06D8966, -0xB06F0009, 0xA06A0009, 0xFF7F600C, 0x001E2148, -0x001E1108, 0x001E1000, 0x00203A4C, 0x00203A4E, -0x00203A6D, 0x00203A30, 0x001E103F, 0x001E105F, -0x001E102F, 0x001E1090, 0x00203A54, 0x001E100B, -0x00203A50, 0x00203B20, 0x002018C0, 0x001E1028, -0x00203A6C, 0x001D4020, 0x98760000, 0x001C1000, -0x00203B2C, 0x00203B3C, 0x00203A24, 0x0009B04C, -0x600CA035, 0x0009B055, 0x600CA031, 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, -0x00203A6D, 0x00203A24, 0x00203A30, 0x001E1100, -0x001E100C, 0x00203A50, 0x001E1000, 0x001E1001, -0x00203A58, 0x00203A38, 0x00203A3C, 0x00203A40, -0x00203A5C, 0x00203A60, 0x00203A64, 0x00203A68, -0x00203E20, 0x00203E2A, 0x00203A4A, 0x002027F2, -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, 0x64E3BC86, 0xBC8B64E3, -0x62EC7E01, 0x8BF732D7, 0xBC8EEE01, 0x64E364E3, -0x7E01BC93, 0x32D762EC, 0x4F268BF7, 0x000B6EF6, -0xD1186DF6, 0xD418920D, 0x72122122, 0x2422D617, -0xD7177204, 0x72202622, 0x2722D116, 0x000B7230, -0x137A2122, 0x00203A4A, 0x002028FE, 0x001E1015, -0x00203A50, 0x001E1001, 0x00203A24, 0x001E1100, -0x00203A4E, 0x00203A3C, 0x001E1000, 0x00203A40, -0x00203A4C, 0x002027F2, 0x001E100C, 0x00203A38, -0x00203A54, 0x00203A58, 0x00203A5C, 0x00203A60, -0x00203A64, 0x00203A68, 0x4F222FE6, 0xD6707FFC, -0x88016060, 0xE2018951, 0x2620BFBB, 0xD56ED16D, -0xDE6E6010, 0x64E36552, 0x7402C840, 0x8D22D16C, -0xD26C7502, 0xE601D76C, 0xE7042722, 0x76016255, -0x626C2421, 0x8FF93273, 0xD4637402, 0x6242E601, -0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C, -0xE417D562, 0x67557601, 0x3243626C, 0x8FF92171, -0xA0207102, 0xD25E0009, 0xE601D75B, 0xE7042722, -0x76016255, 0x626C2421, 0x8FF93273, 0xD4527402, -0x6242E601, 0x640D8528, 0x67494419, 0x275D657E, -0x81E4607C, 0xE417D553, 0x67557601, 0x3243626C, -0x8FF92171, 0x92897102, 0xD2462E21, 0x5E23D74E, -0x64F22FE2, 0x604365F2, 0x2700C980, 0xC9606043, -0x80716103, 0xC9036043, 0x80724519, 0x65F2605C, -0x817266F2, 0x46194629, 0x606C4529, 0x4018645C, -0x8173304C, 0x21185E23, 0x64F22FE2, 0x6E4C62F2, -0x602C4219, 0x66F262F2, 0x46294018, 0x461930EC, -0x42298174, 0x652C606C, 0x305C4018, 0x81758F07, -0x0009BC97, 0x2228620C, 0xA00A8908, 0x60130009, -0x8B038840, 0x0009B009, 0x0009A003, 0xE202D62F, -0x7F042622, 0x000B4F26, 0x4F226EF6, 0x8552D52A, -0x8830600D, 0x88318903, 0xA0348923, 0x85550009, -0xD428D727, 0x85532701, 0x610DD627, 0x24124118, -0x460BD426, 0xD7230009, 0xD226D425, 0x6572420B, -0xE230D120, 0x42286712, 0x2729E620, 0x37604628, -0xD6218B03, 0xA016E200, 0xD61F2622, 0xA012E202, -0xD1182622, 0x6212E530, 0xE6204528, 0x46282259, -0x89083260, 0xD41AD119, 0xE601D513, 0x2160450B, -0x472BD718, 0x4F264F26, 0x0009000B, 0x0000060A, -0x00203A6C, 0x001E1000, 0x00203A58, 0x00203E20, -0x00203E2C, 0x00203DC4, 0x00203A40, 0x00203DF4, -0x00203DF2, 0x00203DC6, 0x00203A24, 0x00203A50, -0x00203A3C, 0x00203A38, 0x002018C0, 0x00203B48, -0x00203B4C, 0x002018D0, 0x00203A54, 0x001E100B, -0x00203B60, 0x00114004, 0x4F222FE6, 0x84E9DE86, -0x2448640C, 0xB17B8901, 0xD2840009, 0x26686620, -0x60E08902, 0x2E00C9BF, 0x000B4F26, 0x000B6EF6, -0x2FE60009, 0xDE7E4F22, 0x60E0D67E, 0xCBC0D47E, -0x62602E00, 0xC803602C, 0x40218904, 0x70014021, -0x6603A002, 0x66034009, 0xD678616D, 0xE500A004, -0x75016262, 0x74042422, 0x3213625D, 0xD2748BF8, -0x0009420B, 0xC9BF84E2, 0x4F2680E2, 0x6EF6000B, -0x2FE62FD6, 0x7FFC4F22, 0x6260D66E, 0x89402228, -0xD565E100, 0x60502610, 0xCB40D46B, 0x2500440B, -0x8D052008, 0x62E06E03, 0x7104612C, 0x2F11A006, -0xD466D65E, 0xDD666760, 0x657C4D0B, 0xE23C6D1D, -0x8B033D27, 0xD264D463, 0x0009420B, 0x4D214D21, -0xA005D762, 0x66E6E400, 0x357C4508, 0x74012562, -0x35D3654D, 0xD75E8BF7, 0x6E72E003, 0x81E14018, -0x6E7260F1, 0x81E2700C, 0xD45A6172, 0xDD5A8113, -0x65724D0B, 0xD64AD259, 0x2212E101, 0xC93F6060, -0x7F042600, 0x6EF64F26, 0x6DF6000B, 0x2FC62FB6, -0x2FE62FD6, 0xD2524F22, 0x6B436E73, 0x420B6C53, -0x20086D63, 0x64038D1C, 0xE50ED13C, 0x32526210, -0x60C38916, 0x804124B0, 0x814160D3, 0xA007E500, -0x655D61BC, 0x00EC6053, 0x364C6653, 0x80647501, -0x3213625D, 0xD6308BF5, 0xC9BF6060, 0x2600A008, -0xD239D440, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, -0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 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, 0xBF8F666C, 0x7F3C655C, -0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, -0xD11C68F6, 0x6012D21C, 0xCB20E405, 0x2102E500, -0x000B2242, 0x00002252, 0x001E1017, 0x00203996, -0x001E1015, 0x001E10BF, 0x00117800, 0x001E10FC, -0x00200644, 0x0020399C, 0x00202A56, 0x00203B64, -0x002018D0, 0x00203B80, 0x002018C0, 0x0011788C, -0x00203998, 0x0020357C, 0x00201534, 0x001E2130, -0x00202A18, 0x00203B88, 0x002039FC, 0x00203A04, -0x00203DC0, 0x001C3500, 0x001D4004, 0xD564D163, -0xE400D764, 0x2142E20F, 0x17411154, 0xD5622722, -0x9669D762, 0x15412572, 0x96661562, 0xE6011565, -0xD55F1165, 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, -0x0009BE85, 0xC81060E3, 0xBE828901, 0x60E30009, -0x8901C840, 0x0009BEA4, 0xC80160E3, 0xDD3D8938, -0xC80260D0, 0x2F008D03, 0x460BD63B, 0x60F00009, -0x8902C804, 0x460BD639, 0x62F00009, 0xC8806023, -0x60D08902, 0x2D00C97F, 0xC8016023, 0xD6348906, -0x0009460B, 0x0009A007, 0x51630601, 0x8902C808, -0x460BD630, 0x60F00009, 0x8902C810, 0x420BD22E, -0xD52E0009, 0x88026052, 0xD22D8B03, 0xA005E604, -0x88012260, 0xD22A8B02, 0x2260E601, 0x2522E200, -0xC88060E3, 0xD227892D, 0x60E36E20, 0x8902C880, -0x420BD225, 0x60E30009, 0x8902C840, 0x420BD223, -0x60E30009, 0x8902C802, 0x420BD221, 0x60E30009, -0x890DC804, 0xDD20D11F, 0x0009410B, 0x0009BF11, -0x0009BF4C, 0xD51ED41D, 0x2470E708, 0x25D2BF85, -0xC80860E3, 0xD21B8905, 0x4F267F04, 0x422B6EF6, -0x7F046DF6, 0x6EF64F26, 0x6DF6000B, 0x001C581C, -0xA000A000, 0x001D0100, 0x001D4000, 0x00040021, -0x001C589C, 0x001E1021, 0x00201A46, 0x00201A68, -0x002020C8, 0x00201A80, 0x00201A8E, 0x00203A50, -0x001E100B, 0x001E1028, 0x00201AFA, 0x00201B06, -0x00201A96, 0x00201AB4, 0x12345678, 0x001E1000, -0x0010F100, 0x00201AE2, 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, 0x00203A4A, -0x00203A4C, 0x00203A4E, 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, 0x00203995, -0x00203994, 0x00203996, 0x002035BC, 0x7FFC4F22, -0xE680D1A8, 0x666C6212, 0xD2A72F22, 0x67F36563, -0x420B7542, 0x7F04E404, 0x000B4F26, 0xE6800009, -0xD2A1666C, 0xE7006563, 0x422B7540, 0xE6806473, -0xD29D666C, 0xE7006563, 0x422B7543, 0x2F866473, -0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FC04F22, -0xDB97D296, 0x72012F22, 0xD1961F21, 0x66125211, -0x8B013620, 0x0009A0F9, 0xC9036061, 0x8B018801, -0x0009A0F3, 0xD290DC8F, 0x64C3420B, 0x6503D18F, -0x60111F02, 0x8B048801, 0x420BD28D, 0xAFE464C3, -0x54530009, 0x844CEE84, 0x890130E0, 0x0009A0C3, -0x6610D188, 0x6023626C, 0x8B718801, 0x6210D186, -0x89662228, 0xDA86D285, 0xE0036122, 0x64221112, -0x4018D881, 0xDD83E500, 0x814167A3, 0x77042850, -0x647266A2, 0x6ED3D580, 0x1F457E04, 0x65521F56, -0x64E368D2, 0x1F8874F8, 0x684369E2, 0x1F637894, -0x1F991F74, 0x62826142, 0xD779D978, 0x1F2BD679, -0x67726292, 0x1F1A6062, 0x2602CB20, 0xD176E600, -0xE5401F57, 0x1F7D1F2C, 0x76011F1E, 0x3253626D, -0x51F38BFB, 0x52F555F4, 0x25222A12, 0x55F757F6, -0x27525AF8, 0x5DF92DA2, 0x2ED251FB, 0xD56B5EFA, -0x54FC24E2, 0x281257FD, 0xD160D869, 0x25722942, -0x69126782, 0x1974D866, 0xDD666A12, 0x56FE60A1, -0x2A01CB01, 0xDA646412, 0xE9012842, 0x4A0B2D42, -0x52FE2692, 0xD661EE01, 0x22E24E18, 0x72016262, -0x60B22622, 0xCB01D14F, 0x2B02E202, 0x2120A03F, -0x8B3C2228, 0xE601D55A, 0x2160E700, 0xE01C2572, -0xC801004C, 0xD8578B0C, 0x1F8FD257, 0xE6002822, -0x7601E57D, 0x3253626C, 0x56FF8BFB, 0x2622D253, -0xE2FE69B2, 0x2B922929, 0x0A4CE01E, 0xE01F65F2, -0x014C25A0, 0x741057F1, 0xEA062710, 0xDD4CE600, -0x8446DE4C, 0x2D007601, 0x696C6844, 0x2E8039A3, -0x8FF67E01, 0xDE487D01, 0x2EA0EA94, 0xE1007E01, -0x7E0F2E10, 0xD12FE205, 0x64102E20, 0x6023624C, -0x89088801, 0x55F2D22A, 0x64C3420B, 0xEE01D132, -0xAF1A4E18, 0x55F221E2, 0x8553D13C, 0x620D6612, -0x89063262, 0xD63BD43A, 0xE801460B, 0xAF0CD73A, -0xD91F2782, 0x64C3490B, 0xEE01D127, 0xDA38D437, -0x4A0B4E18, 0xAF0021E2, 0x7F400009, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x4F2268F6, -0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1, -0x81F2D209, 0x67F38542, 0x854381F3, 0x81F4E40C, -0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26, -0x00000009, 0x001C3D9C, 0x002023FC, 0x0011779A, -0x001C36F8, 0x002035B4, 0x002014A6, 0x00203A16, -0x002014D0, 0x002039A5, 0x002039A4, 0x002039A0, -0x001C3B9C, 0x001C3704, 0x001C3D98, 0x001C3BB4, -0x001C5960, 0x001C3500, 0x001C3D30, 0x001C8960, -0x0020358C, 0x001C3D00, 0x00201610, 0x00117730, -0x002039A8, 0x001C582C, 0x2000A000, 0x0000A000, -0x0011778C, 0x00117792, 0x00117788, 0x0020397C, -0x0020357C, 0x00201534, 0x001E2130, 0x00203DA0, -0x002018C0, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, -0x4F222FE6, 0xD19B7FEC, 0x2F12E000, 0x6103D49A, -0x1F4281F2, 0xDD9ADA99, 0xD69A6813, 0xE0014808, -0x460BDE99, 0x38EC4800, 0x65A21F03, 0x352052A1, -0xA23E8B01, 0x60510009, 0x8801C903, 0xA2388B01, -0x52530009, 0x32E0DE91, 0xD9918B10, 0x64A3490B, -0x4B0BDB90, 0xDE906403, 0xD791D690, 0xEC01D591, -0x2E02E100, 0x271026C0, 0x2502AFDF, 0xC8018551, -0xA1578B01, 0x62510009, 0x4200622D, 0x5E53366A, -0x85E2226D, 0xC903642C, 0x85E36603, 0x6053650D, -0x40214021, 0x4500C93F, 0x322A6703, 0x6053252D, -0xC901D17F, 0x60106C03, 0x8801D97F, 0xDB7F8B05, -0x2120E200, 0xCB0160B2, 0xD17D2B02, 0x88016011, -0x65A28B0A, 0x8D042448, 0x9B9E6251, 0xA00322B9, -0x919B2521, 0x2521221B, 0x37B3EB10, 0x2448895E, -0xD4738B07, 0x22286241, 0x60638903, 0xA05781F8, -0xD5706473, 0x46084608, 0x85E26273, 0x46006B50, -0x362C4200, 0x2BB8C910, 0x8F1F6463, 0x26686603, -0xD2698911, 0x062D6043, 0x4119616D, 0x6B0E6019, -0x81F820BD, 0x880160C3, 0x646C8F2C, 0x880F6073, -0xA0278B1B, 0xD2610009, 0x052D6043, 0x4119615D, -0x670E6019, 0x645C207D, 0x81F8A01C, 0x890F2668, -0x6043D25B, 0x6B5D052D, 0x60B94B19, 0x201D610E, -0x60C381F8, 0x8F0D8801, 0x6473645C, 0xEC00A00A, -0x6043D254, 0x625D052D, 0x60294219, 0x207D670E, -0x81F8645C, 0x880285F8, 0x85E1890A, 0x8D07C820, -0xE6DC6203, 0x60232269, 0x81E1A002, 0x644CE4FF, -0x6210D149, 0x89012228, 0x644CE4FF, 0x654DEBFF, -0x35B06BBC, 0xDB368B2B, 0x64A34B0B, 0x410BD135, -0x54036403, 0x85446E03, 0xC948DB40, 0xDC408808, -0xBEAC8B01, 0x64B3E502, 0x65E34C0B, 0xDB3DEC01, -0xD13D2DC2, 0x621260B2, 0x72017001, 0x21228805, -0x2B028F08, 0x666CE680, 0x6563D238, 0x7549E700, -0x6473420B, 0xA030D436, 0x7FFF0009, 0x85E28000, -0x20B9EBFC, 0x610381E2, 0x942A85E3, 0x62032049, -0x450885F8, 0x81E2201B, 0xC90160C3, 0x40084018, -0x40084008, 0x4000225B, 0x6023220B, 0x85E481E3, -0x4118E108, 0x81E4201B, 0xE40262A2, 0x20B98521, -0x67A28121, 0xCB016071, 0x85F82701, 0x89033042, -0xECE785E2, 0x81E220C9, 0x490BD41E, 0xA03B0009, -0x7E030009, 0x001C3D30, 0x00203DAC, 0x0020358C, -0x001E212C, 0x00203470, 0x001C3D00, 0x00117780, -0x002014A6, 0x00201670, 0x0011770C, 0x002039A4, -0x002039A5, 0x002039A0, 0x002018C0, 0x001C36F8, -0x00203A1A, 0x00203DBC, 0x00203BA0, 0x00203C20, -0x00203CA0, 0x00203D20, 0x00203990, 0x00203584, -0x002014D0, 0x00203A1C, 0x00203A20, 0x002023FC, -0x00203DA4, 0x00203DA8, 0x602262F2, 0x40094019, -0xC90F4009, 0x8B0B880A, 0x60E2DE8C, 0x40094019, -0xC90F4009, 0x8B038808, 0xCB0160A2, 0x2802A006, -0x65E2DE87, 0x2E527501, 0x286266A2, 0x52F366F2, -0x2622AE83, 0xD2838551, 0xDE83C802, 0xA0958B01, -0x420B0009, 0x4E0B64A3, 0x5E036403, 0x85E46503, -0x4918E908, 0xD77D209B, 0xE04C81E4, 0xDC7C0B7E, -0x7B01D97C, 0x61C207B6, 0x71016690, 0x8D062668, -0xD4792C12, 0x420BD279, 0xA070EB01, 0x62512DB2, -0x4B18EB0F, 0x22B9E102, 0x32104118, 0x85518B0F, -0x2029E2FC, 0x60518151, 0xCB0172E0, 0x85E12501, -0x202994A3, 0x85E481E1, 0xA0522049, 0x675181E4, -0x4719677D, 0x667E6779, 0x7701276D, 0x6903607C, -0x88014918, 0x25918F3E, 0x6B12D161, 0x21B27B01, -0x660D85E3, 0x40216063, 0xC93F4021, 0x6C034600, -0x262D322A, 0xC8016063, 0xDB5ED15D, 0x967D8901, -0xE6002C6B, 0x666C67CD, 0x40006063, 0x622D021D, -0x8D0E3270, 0x60436403, 0xE9FF021D, 0x8B013290, -0x01C5A007, 0x626C7601, 0x3292E904, 0x646C8BEB, -0x60434400, 0xD15004BD, 0x0B457401, 0x669D6911, -0x89073670, 0x602D6211, 0x890388FF, 0xE201DB4B, -0x2B2021C1, 0xECFC8551, 0x815120C9, 0xCB016051, -0xDC472501, 0x64A34C0B, 0x51F366F2, 0x85EF2612, -0x54F2D244, 0x650D420B, 0x0009ADE7, 0xE500DC42, -0x420B2C52, 0x4E0B64A3, 0x54036403, 0x85446E03, -0x6703E908, 0x65034918, 0x27998541, 0xDB323790, -0x8F0BD932, 0x6013610D, 0x8B07C820, 0xC9486053, -0x8B038808, 0xE501BD4B, 0x0009A005, 0x2128D233, -0xBD448901, 0x64B3E500, 0x490B65E3, 0xADBCEC01, -0x85F22DC2, 0x7001EE04, 0x31E7610D, 0x8D0281F2, -0xADA97A08, 0x7F140009, 0x6EF64F26, 0x6CF66DF6, -0x6AF66BF6, 0x000B69F6, 0xF7FF68F6, 0x2FE68000, -0xD2234F22, 0x60E36E22, 0x8D02C840, 0xBBE522E2, -0xE2400009, 0x2E284218, 0xBBF08901, 0x60E30009, -0x8905C810, 0xD21CD41B, 0x0009420B, 0x0009BBEF, -0xC80560E3, 0xBD6D8901, 0x60E30009, 0x8902C802, -0xABEC4F26, 0x4F266EF6, 0x6EF6000B, 0x001C3D3C, -0x00117760, 0x002014A6, 0x00201670, 0x0020351C, -0x00203DC0, 0x00203990, 0x00203584, 0x002014D0, -0x002039FC, 0x00203A04, 0x002039F8, 0x002039FA, -0x00201534, 0x002018D0, 0x00203A1C, 0x00008000, -0x001C3510, 0x00203DB4, 0x002018C0, 0x89014F22, -0x611B600B, 0x611BB00A, 0x000B4F26, 0x600B600B, -0x611BA004, 0x8DF12107, 0x8BF84011, 0x620D2F26, -0x8F3E3020, 0x40180019, 0x8B0B3016, 0x31043104, -0x31043104, 0x31043104, 0x31043104, 0x412462F6, -0x601C000B, 0x41296219, 0x20084018, 0x31048926, -0x31043104, 0x31043104, 0x31043104, 0x31043104, -0x31043104, 0x31043104, 0x31043104, 0x61193104, -0x3204221D, 0x32043204, 0x32043204, 0x32043204, -0x32043204, 0x32043204, 0x32043204, 0x32043204, -0x212D3204, 0x601962F6, 0x4024000B, 0x000BE000, -0x621362F6, 0x41294228, 0x31044224, 0x31044224, -0x31044224, 0x31044224, 0x31044224, 0x31044224, -0x31044224, 0x31044224, 0x31044224, 0x31044224, -0x31044224, 0x31044224, 0x31044224, 0x31044224, -0x31044224, 0x31044224, 0x602D4224, 0x62F6000B, -0x080A0C0E, 0x00020406, 0x1A1C1E20, 0x12141618, -0x2E303234, 0x26282A2C, 0x3A3C3E40, 0x6C625648, -0x41112F26, 0xE2208F18, 0x890B3123, 0x321CD204, -0xD1026220, 0x412B312C, 0x00090009, 0x0020349A, -0x00203450, 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, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x42707372, -0x3D206675, 0x554E203D, 0x202C4C4C, 0x6E49677A, -0x4E497274, 0x6D754E51, 0x0000003D, 0x61766E49, -0x2064696C, 0x72657375, 0x20726F20, 0x2079656B, -0x00214449, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63, -0x3D646E61, 0x00000000, 0x203A3051, 0x00000020, -0x203A3151, 0x00000020, 0x203A3251, 0x00000020, -0x203A3351, 0x00000020, 0x203A3451, 0x00000020, -0x2B434741, 0x73696F4E, 0x61432065, 0x7262696C, -0x6F697461, 0x6166206E, 0x6F206C69, 0x6974206E, -0x0D0A656D, 0x00000000, 0x00000072, 0x00205220, -0x62735576, 0x7473725F, 0x00000A0D, 0x62735576, -0x7375735F, 0x646E6570, 0x00000A0D, 0x62735576, -0x7365725F, 0x000A0D6D, 0x00000044, 0x44387570, -0x72637365, 0x6F747069, 0x3D584572, 0x00000000, -0x00000047, 0x72746E49, 0x6D652051, 0x2C797470, -0x49677A20, 0x4972746E, 0x754E514E, 0x00003D6D, -0x654C7245, 0x0000006E, 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, 0x020C020B, 0x020E020D, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x010E010D, 0x00020003, 0x01090108, 0x0002010A, -0x00030003, 0x02020201, 0x02040203, 0x02060205, -0x02020200, 0x02040203, 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, -0x0200010F, 0x02020201, 0x02040203, 0x02060205, -0x02020200, 0x02040203, 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, -0x010F010F, 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, 0x40030405, -0x02090100, 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 zcP2FwImageSize = 15964; diff --git a/drivers/staging/otus/hal/hpfwbu.c b/drivers/staging/otus/hal/hpfwbu.c deleted file mode 100644 index f60f57ed887a..000000000000 --- a/drivers/staging/otus/hal/hpfwbu.c +++ /dev/null @@ -1,5269 +0,0 @@ -/* - * 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 zcFwBufImage[] = { -0x3A4BCF18, 0xF44C076E, 0xF59452EA, 0x451BA755, -0x140AC87A, 0xC07EE942, 0x3EF978AB, 0xF5B03DC6, -0xB70080F0, 0xA89064EA, 0x54E2C1D6, 0xEB047DF4, -0x1798390C, 0x00350624, 0x35B3ECF0, 0x59F2FABF, -0xAF9D248E, 0xF9BDB9F0, 0xD05C8B47, 0xC08B5A16, -0x990093C7, 0xD335A160, 0x1C04942C, 0xBF6E7A88, -0xFD232B0F, 0x5C224387, 0xBF1E156C, 0xF24F2A27, -0xFF56421D, 0xB213037C, 0x2BA67BA0, 0x4950CF8A, -0x05F00F25, 0xA5E82085, 0x74168A0C, 0x2F2AB30B, -0xC80C57EE, 0xB6BDF570, 0x89BC5A99, 0x7F3B5A67, -0xF6C943B8, 0x0C9C9201, 0xE8383747, 0x0C9A72D6, -0xE0520704, 0xA66D7F30, 0xE444A434, 0xE0C94AB7, -0x8DD7751C, 0x1A659464, 0x6C9ABA4F, 0x792F2D2D, -0x5936F66B, 0x061E580E, 0x59903F6C, 0x1FBFB8A0, -0xCC822EFE, 0x4B030CAF, 0xB62457C9, 0x27E9BF15, -0xB113A487, 0xFA0FC915, 0x447B184A, 0x5330CD51, -0x00BCC622, 0xF30DE149, 0xFF718E1C, 0x7B5D2861, -0xDBCA573E, 0xFB0D7BF9, 0xE1CFBAAC, 0xF99D4583, -0x4BA7498A, 0x7CAEA7EB, 0xBA958E32, 0x36C530FF, -0x8F88CA99, 0xF93CABC2, 0x8E47EF11, 0xFB0EED6F, -0x5B3668A1, 0x9D63ADDE, 0xA0EEAB8C, 0x084915F1, -0xFACAAA27, 0x209638FE, 0x1CED9EFF, 0xEEBD2335, -0x38C6F424, 0x2D1F3D7E, 0x976E8106, 0xBE087AD2, -0x32194845, 0x756066DB, 0xC70E3165, 0xC568DCB1, -0x3212E4E1, 0xB5D991AD, 0x07C3CEF8, 0xDB4ABB38, -0x1574C232, 0xF8C792BC, 0x14E62DBE, 0x5A48E7DC, -0xEFDC5407, 0xC45B4017, 0x3B814E89, 0xF0936466, -0x89491B2B, 0x9A359A41, 0x82287675, 0xA0F338D3, -0x523FDD3C, 0x4E40B795, 0x458ADAA4, 0xED812957, -0x7ADC73BC, 0x6FD7DB78, 0x2740FC04, 0x6392AEA3, -0x185ABCEA, 0x6B50ABC3, 0x3681F07F, 0xC840F8CE, -0x5733E7EC, 0x0805FA71, 0x0B34530A, 0x8CB3D033, -0x81451551, 0x53B0B4EC, 0x908646D0, 0x10A3E642, -0xF358DC34, 0xC1FA570C, 0x2B1284B0, 0x592322BB, -0x9D587783, 0xE7D77988, 0xE1BE5D7B, 0x44B93E23, -0xF8BE94A2, 0x506DC723, 0x6E0A7D09, 0x3FB1046F, -0xDB3A166F, 0x9CB7D6A0, 0xE278DE6D, 0x88459334, -0xB52BA3C9, 0x284740A2, 0x04D30792, 0x944D79CA, -0x1D050EA9, 0xA404DB1B, 0x99526023, 0xBACE24E7, -0xB9F20704, 0x284E6432, 0x47A593D1, 0x95F8DFCB, -0x220C9167, 0x8FAABBBC, 0x93D34E8C, 0xCE077138, -0x4FC18081, 0xE76DD7E5, 0x67465F6C, 0x7A479D77, -0x74D61F82, 0x00559214, 0x2F66E42E, 0x8742A96B, -0x62063950, 0xA2DBFAE5, 0x368B966F, 0xAB5FCCE1, -0xCB4023B1, 0x1E7AF542, 0x05953E30, 0x8CA51CFC, -0x2216547D, 0x29D562D4, 0xE9C9F8EE, 0xA90505C9, -0x088D0EEB, 0xD7A290FA, 0x95E5B567, 0x53FAD3C0, -0xB89FC625, 0x69A7519B, 0x3687C7EF, 0x7188CB55, -0xCE5DB97E, 0xA260574A, 0xD453D173, 0x145D970B, -0x12112CC6, 0x399839E0, 0x29C55BEB, 0xE467C71F, -0x10B3C9D4, 0x8F1C9662, 0xF207A826, 0xE0245600, -0x688B1812, 0x5A483031, 0x7048380A, 0x78E3D5BB, -0x1951533D, 0x8FA5D8E3, 0xC5BE500D, 0x71DB5B2B, -0xA17AA000, 0x408C9BE8, 0x161E12F5, 0xB1C38C45, -0x22A88F05, 0xDE3F4405, 0x5078ADBB, 0xCE1BF1A6, -0xB7A75B04, 0x6B8364E8, 0x0CE32E3E, 0x9BF65504, -0x28C18157, 0x78359AC6, 0x617BF202, 0x1E76FA09, -0x0F8E61A8, 0x6D02F0D5, 0x80356459, 0x79CEFAE7, -0x7D00F155, 0x5C1C0128, 0xC75CA073, 0x32816090, -0x9FF78DFC, 0x848D269C, 0xF811B314, 0xA86920FC, -0x6F885D01, 0xACFE6525, 0xC726074D, 0xFED68599, -0xF1D5C76A, 0x8799E5F5, 0xF85F5171, 0xD8DE2D3B, -0xE7DD8E75, 0x43F8614A, 0x0684FC8D, 0x9683B8C8, -0x74BE786B, 0x2514762D, 0x7D866682, 0xE711FE1F, -0x0DE9E273, 0x12F53167, 0x4FA3A7FE, 0x2A00EB61, -0xB3984A28, 0x4319F2B0, 0x42BA0CA2, 0x848771B6, -0x995E945E, 0xD41115F5, 0x43D9834B, 0x54EEDC36, -0x5C3C5407, 0x671B540E, 0xDCF18948, 0x150ED973, -0x2D4922DE, 0xF93CA17D, 0xB24A76E5, 0xD1C01C22, -0xF2963DD6, 0x3B860066, 0x08EF0EA4, 0x609B60CC, -0xE2E901FA, 0x25BE9B93, 0xDF96D9BC, 0x86D415DF, -0x75CCF6BB, 0x882D54B2, 0x7976E9AF, 0x88A0B178, -0x5ADE5A55, 0x8A8C0112, 0xD896755A, 0xCB6789B3, -0x8B63AE2F, 0x2545036C, 0xE4655B94, 0x20959977, -0x29DFB4D1, 0xCDAAEBF4, 0x1C07EC05, 0x5A6F607D, -0x88A9B31D, 0x118C74D2, 0x000BB065, 0x75C46712, -0xEF1A58BD, 0x50ECA262, 0xCCE393B9, 0x6EDB92E8, -0x700EF517, 0xBF6CF4AD, 0x57456DC0, 0xF629517C, -0x40331F8B, 0xC10A454D, 0x6CCB02CF, 0x9BF11B1C, -0xE0871437, 0x23623585, 0xF519F09C, 0x4DB2AFC8, -0x88FCBD7B, 0xB512FE8D, 0xDE445894, 0x078AD03C, -0x44375FB0, 0x0BABEDB1, 0x40D5E8E1, 0x13F20A86, -0xF1406303, 0x7205C322, 0x3FC43779, 0x7A60D510, -0x14469E04, 0xF4E77873, 0x2EAD7ECE, 0xA135D6EA, -0x3F4C4B30, 0x21488077, 0x69F64F1C, 0xEEF4876E, -0x63610C0B, 0xB7B24C5C, 0x324A76FE, 0x0CF651D3, -0x9460F0B1, 0x81A83230, 0x0839CFF9, 0x70722F04, -0xC278FB3B, 0x5DD1BDA4, 0x1E4B3DBA, 0xAE161A93, -0x9E1033C3, 0xD938FCEC, 0xDA2B2F93, 0x28CD82EA, -0x14AD1FAF, 0xE4EC9CB8, 0xE770AFDF, 0xEFB12898, -0x500BE181, 0x602625C5, 0xF160631B, 0x78D3643F, -0x4E13ED37, 0x647BB223, 0xCF18D75C, 0xF477F94C, -0x786ECB89, 0xB3ED21F8, 0x1BEF3916, 0x240FB35A, -0x5C69B7D9, 0x8E96290A, 0xD40DC98C, 0xD1370291, -0x5870021E, 0x3F7CF23F, 0xFD4A6ADA, 0x36482457, -0x926600AF, 0xDC8618BC, 0x67D3779F, 0x3422830C, -0x87A41FBA, 0xCA0AFF53, 0x63BC45F3, 0x520BBBAE, -0xEDE2E031, 0xB6FA9450, 0x258CA712, 0xD709C4E4, -0x617709B2, 0xAACE0B41, 0x363DBF55, 0x701D6583, -0x39F3C885, 0x7CD6297B, 0x078FE13B, 0xA398DABF, -0xDB97C514, 0x039102E3, 0x5CA545AF, 0x9298BA18, -0xD18DAF86, 0x3D70EEA2, 0x5266AD68, 0xB04945B5, -0x402DDA5B, 0x01DC6CD1, 0x93AC5053, 0x08DF9EA9, -0x485EBE97, 0xA5D05853, 0x6CBEE910, 0xD485F4E2, -0x8F201D07, 0xEFC384A3, 0x7272AFBE, 0xC0B41FD7, -0x8E54A971, 0xA7F9E0F7, 0xC21700B4, 0xC24A4ED0, -0x5419EACF, 0xBC2D8FB1, 0x2C5B5AFF, 0x0345274C, -0xC41DF47A, 0x37658AFF, 0x24CF3BE7, 0xA3086248, -0xF82B5928, 0xB49A9B04, 0xD4105AEF, 0x444EBE8D, -0x348368DF, 0xDC77A7A0, 0x68D37E0D, 0xD2EB54EE, -0xDDAC8C33, 0xE5C93C79, 0xE4706ABF, 0x17536EFD, -0x6C2B2B16, 0x038AA806, 0xDAD42458, 0xAE1D76A1, -0xCC8DE95C, 0x1BA20647, 0x0521068C, 0x306FBE44, -0x4E29D881, 0xD2A14D53, 0xA155853E, 0x44500CC4, -0xFC4466B7, 0x5AACD51D, 0x506D3A73, 0x3F61E0FE, -0x58F11F9D, 0xC92A2CAD, 0xD9A4F86B, 0x1FA747B1, -0x77DEC5D2, 0xDFAB369A, 0xD471EA01, 0x724502DA, -0x618CE21A, 0x52388BEB, 0x2E8A4CC5, 0x58332211, -0x3FCC46E1, 0x501210E2, 0xE9D51D1A, 0x37237B55, -0x8CE3E2F1, 0x6B2E98CC, 0xB56A11E5, 0x8819036B, -0xA6AA2F27, 0xB0124A0E, 0x92F17364, 0xD4A89238, -0x0507E337, 0x8ED95DEC, 0x9C014BA8, 0xBA5B11C6, -0x9C15D38C, 0x52596C98, 0x9330DD3D, 0xD6147570, -0x21701F1B, 0x5A2385F1, 0xE2F38C6C, 0xB3E94698, -0x2F9C63FA, 0x7E0234D8, 0x4CDD3288, 0xE1969B5F, -0x853B3C1D, 0xF61465A7, 0xF281C419, 0x46C5F072, -0x9F1722DD, 0x64F2A994, 0x86AEE8A8, 0x55895E17, -0x6047D1AC, 0x3375A934, 0x336BEACA, 0x90791174, -0x4DACC4D2, 0x24253860, 0x2A7876FB, 0x9DBDF98D, -0xD5BCE182, 0x67EB5F70, 0xCC06BA38, 0xE8F78715, -0xFEB0EB44, 0xE9776E03, 0x892A0898, 0x7A070650, -0x6D04DDC4, 0x99A5B7EA, 0x3B416BB6, 0xDADCE834, -0xB3B03278, 0xDB73B70E, 0xB0F0224E, 0x538A4AF9, -0xD25D6A37, 0x8F627FB0, 0x11ED9387, 0xB8C88457, -0x0CF320CA, 0xA20E62A2, 0x1DACDD4A, 0xAB84575D, -0x740DAF75, 0xAB9DB955, 0xFF787314, 0xA680B8E3, -0xC976D38E, 0x1FD38F4D, 0x0AEB6633, 0xB69A03DF, -0xB6CA8610, 0x106354C2, 0xC37D48C8, 0x3E5EED54, -0x534CC9BA, 0xE37DFFAD, 0x9F69EB05, 0xF67217EE, -0x50180B3D, 0xCC61C127, 0xC3598D73, 0xE5C00F01, -0xFFE9B111, 0x5E23EA2F, 0xF6C45DCE, 0x44585E39, -0xB02C6004, 0x37233902, 0x4F374C0D, 0x34288898, -0xE274937D, 0xC81D472C, 0x17A43151, 0x2638F7D3, -0x5304E5B5, 0xD5CE5EDE, 0x357FA7B3, 0xFBE27986, -0x64E65D1F, 0xC28D1237, 0xA73D9AB3, 0x124CA6C8, -0x770D7415, 0x5788C32C, 0x18DEFC00, 0xB3B2B06A, -0x55CC86A0, 0x8D929309, 0x84AB381A, 0x9DEFE8DD, -0x26C742C8, 0x952BAC34, 0x0A3B140F, 0x82A9304B, -0x52CEC9F4, 0x47DF4D08, 0x15A116D8, 0x7B890B18, -0xC87BEF1A, 0xB59601B6, 0xD37BFB28, 0x5D9F564D, -0xFB002F8D, 0xE7602E57, 0xE429C852, 0x9C0A8C75, -0xE02611DC, 0x8A1C9861, 0x7495D6DE, 0xCA059710, -0xAE5969B8, 0xE5B2CBDC, 0xA49F6EC1, 0x85D2A553, -0xE4719B0F, 0x40F68BBC, 0x092E24B5, 0x7B132678, -0xD70C17E1, 0x309E6AA1, 0xE009657F, 0xA7238C7A, -0xE0575D78, 0x1D6980E7, 0xEFCDD368, 0x19F08D93, -0xFAC03B85, 0x51BADA8F, 0x037DF839, 0x8F4D29F4, -0x1DC8A913, 0x50C55402, 0xDEE578F0, 0x2BA1C091, -0x9ACA567E, 0xA8FFECFA, 0xA3C05D12, 0xF18C6283, -0xEAAE6662, 0xB4DC6A79, 0xCEC5E782, 0x93A2E384, -0x8F8A5E6F, 0xCA8379D5, 0x81BCD49E, 0x5FCE174B, -0xD1543A5B, 0x845D635F, 0xD53125B9, 0x3B2121AE, -0xF8ECDD01, 0xF84D2D11, 0x6579BC21, 0x5C2DC220, -0x9EC1A688, 0x1148D831, 0x6C087799, 0x58944357, -0x56F79FC6, 0x6B689B55, 0x740B5FD1, 0x9F7BFB5F, -0x6B2F3E2D, 0x10E09273, 0x2E9E3213, 0xF3436AA0, -0x14A9F681, 0x9087D3CE, 0x68D0430B, 0x9FAFE3EF, -0xD45B8C61, 0xB982724A, 0x04448D7F, 0x8712E47A, -0x2C188D15, 0x9C3F06CC, 0x6343B130, 0x56C6765C, -0xF657BC9A, 0x15F1E973, 0x47E71181, 0x8639F5D7, -0xC1F3FDD5, 0xDC522441, 0x56BB2908, 0xAA48AEC6, -0xEC04087A, 0x8D375875, 0xE2941F88, 0xED31CC72, -0x09BD8794, 0x4C81D5C1, 0x1CC96D9C, 0x98A89022, -0xAA362C57, 0x924D583D, 0x270430E6, 0x0FD4040A, -0xAF561155, 0x38DCD1CF, 0xE861D2AC, 0x24A2EF3C, -0x2B7E3868, 0x13DA6C12, 0x69202EB6, 0x4A5FEC66, -0x185417A9, 0x3C92EFF4, 0x949842E6, 0x02115D93, -0xAD1726FF, 0x4E093D7D, 0xC3E41B9C, 0x27BBC1C1, -0x4FFA49C7, 0x6C63D24C, 0x84255444, 0x282C3BA2, -0x3D679D86, 0x03B410B1, 0x64DB454C, 0x535499D4, -0x25B421A1, 0x7E68C8FE, 0x0477E3B9, 0xCEFB087D, -0x9E59B89C, 0xBB787559, 0x1A550EE4, 0x078B48AB, -0x73A865FE, 0xD7227471, 0x3A864049, 0xE5EE3A1D, -0x201BC19D, 0xEB8DAE2C, 0x0E2AB31D, 0xCDAC2D79, -0xDAAB08B1, 0x63ECD4F2, 0xC00F9716, 0xD415C6BB, -0x8C20C39F, 0xDED8F5A2, 0x1D6A4190, 0x3D319167, -0x56B3A26B, 0x0547BF52, 0xA056924F, 0x4DAA539A, -0x557241D1, 0x42C9124E, 0x18723323, 0x6AD6E7EC, -0x8E039337, 0xF6FDDD65, 0x5F3525F9, 0xC0AD9704, -0x810EF049, 0xCE022EE0, 0x41CE7E52, 0x8E172A44, -0x648808E2, 0xC7FF6896, 0x2AD0985C, 0x304B9631, -0xD21EA39B, 0x279F5089, 0xCDB5C390, 0x21716A40, -0x5E34B278, 0x39475D72, 0xBA4F4DB1, 0x8B25818F, -0xE6E466F4, 0xC4A09DF8, 0x59F18AC7, 0x887AB5FE, -0xEEA4BA42, 0x17371DA8, 0xA82193D1, 0x6DC30EF7, -0xDEB9D349, 0x2B3271D4, 0x1FE83836, 0xEC755A29, -0x05F07FCD, 0xC331D3AE, 0xC6208B76, 0x497FF280, -0x4C579C5A, 0x22B71F94, 0x30FD620B, 0x31B71AE3, -0xDF7D1A41, 0xF041ACA5, 0x9533261B, 0x3262D291, -0x060E9672, 0x7D191A55, 0x6D0F0945, 0xF8C7777C, -0x1C173808, 0x78308E77, 0xC1EEAD3B, 0x059CCD9D, -0xA8FDBE19, 0xE47630FA, 0x88A49DE5, 0x03347DAB, -0x4F31F969, 0xF9C62B12, 0x93AB126F, 0x8A7A3BFB, -0x82591545, 0x2A1A2131, 0x1DEBB134, 0x449E28DD, -0xFA7E0248, 0xC1E3A5BC, 0x1747E097, 0x4C69AA5C, -0x1FD71B4B, 0xAC64CA6C, 0x5545F9F9, 0x5E5886F2, -0x243DBA6C, 0x495BE163, 0x4ECF5A6C, 0x430C9019, -0x89A980FA, 0x528945AE, 0x00CE6936, 0x9F9A73B2, -0x9E59DC6B, 0xD57740CD, 0x0E0CB735, 0xB1202BE3, -0xAA26C2A9, 0x267A77A6, 0x3FA12CF0, 0x4587C0AF, -0x354ED831, 0xFFD8BD8E, 0x56CC0F26, 0x75717AE3, -0x51B10674, 0x3E33EC26, 0x26CE80DB, 0x5C4A9140, -0x017F6C2F, 0xF9038D9A, 0x0A22C29F, 0xBA1F7C8D, -0x125CC934, 0x6CF66BFF, 0x48C13DCD, 0x63FC3D81, -0x258C181D, 0x1A4C3DDD, 0x2E24BECC, 0x7C86A9ED, -0x5BD1989C, 0x57CE595C, 0xDF291AFE, 0xEAF00887, -0xD8DD4259, 0xDF67331E, 0x50D0CE88, 0x1FD090AE, -0x632DA5F0, 0x95272A5B, 0x31172F25, 0x547FD7DF, -0xAFBE11D9, 0x97189DFC, 0xC4881191, 0x1C92365D, -0x843DEFDE, 0xCF0A399B, 0xCF327CAF, 0xDDAF0BCE, -0x03AA7A2E, 0x411A8664, 0x6CCF7CD9, 0x61097EF5, -0x07F3941E, 0x5BC3EB75, 0x2791945F, 0xBEBB526E, -0x18631A34, 0x25FEBF10, 0x419834CF, 0xF642D176, -0x372FFF10, 0x2A1BEA1B, 0x400FF345, 0x257A234A, -0x9F15E99D, 0xE06AA1DB, 0x3A0DB315, 0x2BA30D99, -0x0E9E831E, 0x1B25EE41, 0x8DB30E70, 0x9FBA6D64, -0xAB8AA5E3, 0x5A96177A, 0x6BE03535, 0x97E37DCE, -0xACA24F26, 0x5F0096F7, 0x5D02722F, 0xAF8F3EC7, -0xA6824151, 0x70FAD406, 0xDEBA8513, 0x99C63E34, -0x1CC4A3DF, 0x7F756508, 0xB7386527, 0x647C7FB8, -0x43F1F4DF, 0xC7E4EC18, 0x302BA109, 0xD5E9175B, -0x82856F77, 0x0F6D45D9, 0x95AE28B9, 0xE63385C3, -0x8FB26619, 0xBD99F298, 0xC884B948, 0x0B596FF1, -0xE061C3F9, 0xBC2F9A81, 0xC488CD91, 0x372EF590, -0x3DA1BFE5, 0x10DE037B, 0x7210B4DC, 0x74E4EFF8, -0x6365AFD2, 0x8CEABC85, 0x1D8FFD43, 0x4DE243F8, -0xEC976FD9, 0xAD827765, 0xC679F15D, 0xC125EC31, -0x95D3481C, 0xC4EA6EAC, 0xC8FC014F, 0x1352EB66, -0x9C400EB5, 0x227BFAB9, 0xB12BF958, 0x85B6D782, -0x78B6E44D, 0xE2232EEE, 0x4F101711, 0x9ABEBF69, -0x66ACC682, 0x04AD5F55, 0xE4FC6238, 0xBA3D2266, -0xA2BA3170, 0x083F39AB, 0xFF2075C4, 0x945C4B05, -0x41E8C113, 0xEC7CAD67, 0x3653733E, 0x03510C3B, -0x1E973158, 0xFBE507F3, 0x2CCD8D9A, 0x6EA9442F, -0x0D48DE95, 0xC517BFAE, 0x04EBB5C9, 0xEFAB1823, -0xD5FBFC0A, 0x6890F212, 0xA1C00CCD, 0x6DD561E6, -0x20D39B1C, 0x56113FBA, 0xCF3A7FD7, 0x3AB5A0DB, -0x3656572E, 0x7BC48CD3, 0x8902AE36, 0xD3E94AFF, -0xC06EB447, 0xCC513C0C, 0x2544B7DD, 0x6F168877, -0x53162607, 0x461DCEF0, 0xF47AF2BB, 0x8AF9F3CC, -0x1EEFF9E6, 0x57CFB6B6, 0x7F712439, 0xAB20C93D, -0x043F9003, 0x60C808BC, 0x86C2137C, 0x46ADB474, -0x848B65F2, 0x5544789B, 0x18E9AEC7, 0xC889913E, -0xFEB79B2F, 0xA3FBE518, 0x67922463, 0x93746398, -0x968E160F, 0x8CA856A4, 0xA040202E, 0x660C00C6, -0x8F0A8E62, 0xE2BA54DE, 0x4BD0C117, 0x1A1A3092, -0x086CAA3A, 0x2BBA5676, 0x89610176, 0x00ED2F97, -0xC72130C7, 0x5A053880, 0x7298E553, 0xD67971EA, -0x0D41E477, 0x2FA8285F, 0xB856A190, 0x132DB916, -0xCDFFDD11, 0xB5519A81, 0x1BC7001B, 0x97C824DC, -0xBB4C707F, 0x90166DC2, 0x42DFAB7A, 0x90E33184, -0x6C6B940C, 0xDC553814, 0xC4F5E7AA, 0x99434AE9, -0x82BB09D4, 0xCB0A7DA3, 0x3A8033AE, 0x054D3481, -0xE20AF761, 0x25F5F254, 0x7AD3AF3A, 0x23A34C29, -0xA19C57BC, 0x39B57AD9, 0x55E1EC59, 0x5ECA4198, -0xDB908BCD, 0x4871C3F4, 0xE7091328, 0x64A9B6EC, -0x1CCAB2F3, 0xEDB22423, 0xFFB6A717, 0x6FA13548, -0x361FF711, 0x24664017, 0xCBBF9970, 0x83A7B7DE, -0x9B704690, 0x01A0B877, 0x95041B60, 0xC048F3E1, -0xA31625F2, 0xE3DFBE27, 0xF657295B, 0x1F5C3AF5, -0x60EE1637, 0x575EDFAC, 0x725844FB, 0x242723D0, -0x04FA46FC, 0x1A8C3F44, 0x0E03A5FE, 0x8778079F, -0x606E4E1A, 0x7C0AF3D5, 0x9578B266, 0x63BCE765, -0xA8ED66D9, 0x9242377A, 0x817A5D5E, 0xD0981A98, -0xC07F2E7F, 0x0E66F84A, 0x3635F854, 0xD7AD8359, -0xDCF23230, 0xC1B9084C, 0xA7987FE5, 0xC3B27EB4, -0x1F747061, 0xFD278601, 0xB6ED3B5A, 0x9CEF8AA0, -0xA5023C46, 0xB49832AF, 0xB12055FD, 0xD85310E1, -0x2C19ADE6, 0xEFBB17A8, 0xC246A4C7, 0xBE4B2666, -0x13C2D7F9, 0x50063BA1, 0x9B00E02D, 0x335B9DF8, -0xD424AF25, 0xBAE40C92, 0xE87BD6B7, 0x384D1EB1, -0x8B91E8F4, 0x9E3FC6D5, 0x6BB1A51E, 0x21AE5533, -0xFCB8E713, 0x188B66B1, 0x6572E9ED, 0x98829178, -0x7BAE8CBF, 0xE00C32B4, 0xDAFC14D5, 0xEA8FC746, -0x2C8D712E, 0x89A05FC9, 0x9A274641, 0xAC2450AD, -0x2437784F, 0x3B1B80F0, 0x0B4A31FD, 0x277C0232, -0xFDDC6829, 0x3F3C606C, 0x0EF62352, 0x3D07D04A, -0x4E0939E8, 0xD59BF115, 0xA02752E7, 0x42BF7133, -0x9FA0939E, 0x64764109, 0xD5D03EBA, 0x3D4433A3, -0x1749B437, 0x137298B1, 0x677BE344, 0xA83CEF7E, -0x17813A39, 0xBC71823F, 0x2070E9A7, 0x3873AEF8, -0x5AF1E21B, 0x1F0CC692, 0xB8EFB04D, 0x1A1CC514, -0xADED6C3D, 0xDF35A8D7, 0x6D93275E, 0x9C362545, -0x62BF7583, 0xFC56D990, 0x0CD6A324, 0xF12A7939, -0x52587029, 0xD00D5F16, 0x51622555, 0x1178E887, -0x81E7BCC8, 0x92BB1C11, 0x097330E4, 0xCF8C5CAF, -0xD076D6BC, 0xBA292918, 0xF835A829, 0x4280A51E, -0x09CD7827, 0x11583487, 0xB8BA2CEF, 0xD598AE93, -0x99F4FD77, 0xEB151110, 0x1571B076, 0x63F2103A, -0x56C6BF44, 0x9E63B556, 0xFB981238, 0x5D8C978B, -0x9501D936, 0x82A1E971, 0xE5A4F7E2, 0xC6E3727A, -0x03329F07, 0x248ACDD6, 0x437E917B, 0x23B02B20, -0x73F76AA0, 0x75EA06C5, 0xD7C662B3, 0x267777F8, -0xDC96BF06, 0x54020346, 0xCBDF069B, 0x030133EC, -0xA7EF1C2E, 0x568959AB, 0x4FC31DE0, 0x3A22890E, -0x280F8652, 0x1BD8CB24, 0x9A8D92C9, 0x52718DE1, -0x12033FC7, 0xD48490CC, 0x681ADEE2, 0xF91BF7B8, -0xB8609B38, 0x34CF4BCA, 0x8F123290, 0x0D0F4FCD, -0xC4F43323, 0x2FC04F1C, 0x4669B890, 0x1E8D2A7F, -0x0658CAE6, 0x5489F3A3, 0x9CD362FE, 0xBA5190B1, -0x06A58820, 0x7A9AF759, 0xDC94E672, 0xEB284B85, -0xF8EFA022, 0x3837C379, 0x7C9E9A2A, 0xD2ED96BC, -0x5D1E4C7E, 0x97F2169F, 0xFC3C37C2, 0xE039EDF1, -0xDBE93909, 0x81FEAC6B, 0xFCD383FC, 0x170B91FB, -0x05BA3243, 0x8FB2ADE1, 0x52AFB984, 0xE8262E9A, -0x1E704638, 0x89B8DFD8, 0x18C0C641, 0x2760C7E6, -0xD3AFF3C9, 0xC4E3543B, 0x0C0B7910, 0x1DEF7792, -0x483D7194, 0x9AAF5864, 0x08607947, 0x626F0CF3, -0xC0F6A486, 0xEB4525CE, 0xA8BBA8F8, 0xE450DA14, -0x2DC4D114, 0xBCA527C9, 0x6682AA4D, 0xCBB48A5F, -0x1B474C99, 0x7F5B526C, 0xEC435C0C, 0x9E8D3E1A, -0x67D2EA29, 0xA3B7ADCD, 0x8328590E, 0x7345607B, -0xB6057588, 0x1A8B034C, 0x5C8CA534, 0x8115DC5F, -0x189C2ABE, 0xF1B92927, 0x78A3B62F, 0x4B621D49, -0xDC176A68, 0xCBD3C1DC, 0xD82348BB, 0xEEF05FA7, -0xC0DD3D83, 0xC1F2A7BF, 0xB2079D00, 0x14B5730E, -0x73203CD7, 0xA8672433, 0xA171FFED, 0x9F181200, -0x4E16A5C8, 0x56D8AC31, 0x73803D86, 0xD4685CA4, -0xE8DE9FE2, 0xA35D2CE8, 0x808CF3E2, 0x198700AE, -0x0034163F, 0x57BC76FE, 0x271ACF93, 0xAA3AF6D0, -0x37003A7E, 0x450B74F4, 0x157401CB, 0xB79DDDA8, -0xD60AB7A4, 0x3A4C8779, 0xB6990FC8, 0xA1668D5A, -0x05B7965F, 0x7814376D, 0xFA0D2D8A, 0xD97A1142, -0xE804DE3D, 0x4939089E, 0x78D40CAC, 0x01DEF5EA, -0x3DD1CADA, 0x96465956, 0x6358CFB6, 0xACE02DE5, -0xB4C9F6CE, 0xE9C95AFF, 0x70EAD28E, 0x58803693, -0x89EF9972, 0x58F0273F, 0xDB17A277, 0x0B082B98, -0xAAB13ABD, 0xE86381EC, 0xC18924D4, 0xE28D4348, -0xC21895AB, 0xE17073AD, 0x9417539B, 0xA043E5F5, -0x88FFD026, 0xD972F017, 0xD0C8B8D3, 0xB34F3D67, -0xC525E4B5, 0x0189A5A1, 0x59224A35, 0xAA18F2D5, -0xFC9E170C, 0x16D3795A, 0x35DB09FA, 0x1624DB1D, -0x4A6E059F, 0xC5C88A93, 0x9051D373, 0x4B12B09C, -0x4088AF39, 0x705394F6, 0x360F2BAC, 0x8A1F2420, -0x641D4FA5, 0xA78B78F9, 0xA5A5302E, 0x691D2108, -0x7CFB57FD, 0x1812FE68, 0x8A2BB5E0, 0xF181CA14, -0x1846848E, 0xDC044F67, 0x17FCCA28, 0x21D7C5AC, -0x4C43432F, 0xC457E26E, 0xB0C9ADD2, 0x791EE2B4, -0x620F27BE, 0x229E0B1E, 0x746B4FFC, 0x02038738, -0x1C7B971B, 0x05193430, 0x8645DBD7, 0x58678F98, -0x141E912D, 0xD89C587E, 0x9FD7B43F, 0x21851D56, -0x725311A7, 0x0605B1B2, 0xC18BF2B7, 0xC6F79EA9, -0xBD84A01B, 0xC9B7F2DA, 0x04E47EE8, 0x1C1A14F5, -0xBD5B4FF1, 0xE15FBC2E, 0xC4D43F01, 0x5D39AD4A, -0xBD3BD983, 0xB2314A4B, 0x8DABA67E, 0xB5263B5A, -0x9912F262, 0x82659C80, 0xC3610181, 0x3F229014, -0x2685532F, 0xCE4EC210, 0xF46AB09A, 0xFAFA69C8, -0xD1292944, 0x2EF880D9, 0xD03AAEAB, 0x0E83C435, -0x842C482C, 0xA70951A1, 0x0E4EA07D, 0xE0332D0C, -0x3EA27E55, 0x04721425, 0x7C8B56DC, 0x96391312, -0xF600D78C, 0xC850517C, 0xB3F9F2AE, 0x59A99351, -0x8D6AA838, 0xF586672E, 0xD81FE525, 0x3CEF31DF, -0xABDC7079, 0x6E1BB8F6, 0x6B45B87B, 0x9FD2CAC4, -0x648E357A, 0x6C57D30B, 0x23766B64, 0x8C8BD9C1, -0x9A29001A, 0x206F47E3, 0x5F423D75, 0x293A32C4, -0xDCC6432B, 0xA4280954, 0x457790B8, 0x11E84CEF, -0xAB11D0BF, 0xD04258E3, 0xFB44C0CE, 0xED8231B2, -0x0277A6B2, 0xD8E5C517, 0xCEDF4C8B, 0x19D90170, -0x20555532, 0xFCB610B9, 0x88D5F5A9, 0xD35DC77E, -0xEF5EA686, 0xD866959C, 0xF0886B56, 0x005CFB90, -0x582AD255, 0x7381289F, 0xC18CED4D, 0x444F0A6B, -0x9917AE56, 0x505A7BCD, 0xCBDC903B, 0x51EF0F3C, -0xC4E6AF5A, 0xB148AD2F, 0x609A124A, 0xB5DA89E4, -0x3A68C7D4, 0x98694F02, 0xE85B1766, 0x754BA5FF, -0x1296A58E, 0x27736843, 0x9B6280BD, 0x2686032D, -0xB428AC04, 0xB06DBA5C, 0x625FE034, 0xD4BCB25E, -0xC91C5B3C, 0x73BB70E5, 0xA26A479A, 0x73173229, -0x3AA1235C, 0xE16171D1, 0x42D0D42F, 0xFC624752, -0xF1F5DCC2, 0x1B6F20A9, 0xFF9D626D, 0xDBF052C0, -0x90E38D23, 0xFB72CC5E, 0x9186519C, 0xF2330093, -0xE5251385, 0xA0094977, 0xE83FA066, 0x2E389CE2, -0xD3A62E72, 0xA9422A8B, 0xC61CFD5B, 0x1B3A516A, -0x58087800, 0x3A47462C, 0x557DDD8B, 0x94FD21D4, -0xE1AEA942, 0x4B2CC532, 0xB2185B36, 0xDCA15259, -0x1D044D7D, 0x781317B8, 0x49CB13E7, 0xDAAFFBC6, -0x30A05644, 0x77B05F37, 0x065A567C, 0x94721C79, -0x47316C60, 0x58AAC7C9, 0x410081AB, 0x7D4A36FA, -0xCDF23455, 0x1873EF87, 0x186982B5, 0x7C78D9DA, -0x3567D966, 0x10FF5E8E, 0xDB88E5B3, 0xFF1D39A1, -0xB8A345A3, 0x7A7258F3, 0x9706B3CE, 0xB5ADCC26, -0x4561EF5B, 0xB002FBF6, 0xF3F4C6FA, 0x57EC75AD, -0xBCF37924, 0xBC05B0AD, 0x2AB19DAA, 0x0EBD25EA, -0xF335D08C, 0xDFF79E19, 0xDD86D418, 0xECE11951, -0xC06F4D50, 0xFD698DF8, 0xBA6192EF, 0x365A28CE, -0x74DEC0B7, 0xE971F67B, 0xBF89DD42, 0x1E683399, -0x164A7158, 0xA1E48475, 0xBE139E8E, 0xBDEBA7FE, -0x74E03AEC, 0x88EA9618, 0x9B0048C2, 0x68C1DD20, -0x8DC9FC85, 0x24B55E3B, 0x51C38BDA, 0x2ECD7B13, -0x54D66C89, 0x69A3EBC1, 0x4B4E4F13, 0xAD37B7DF, -0x030A1D8B, 0x85A114D9, 0x403BE495, 0xB5E40331, -0x316E7310, 0xB36AA494, 0xDBFFCB9A, 0x5C0E5DA5, -0x099BA9E8, 0x66826E9D, 0x0BC5849B, 0x1A20CBAB, -0x0744FBE6, 0x2CB52040, 0x8B88533F, 0xA8A44BF1, -0x62FEB4A8, 0xDB2ABC4D, 0x46F0B676, 0xCBD06470, -0xDB6D71EF, 0x5DC3551A, 0x71B31A5B, 0x046D4C7F, -0xC051A998, 0x1EC19FF9, 0xA9E21F9F, 0x7951E081, -0x78BCBA62, 0x91B623F2, 0x8EF6A81D, 0x1023755E, -0xCE47F5AA, 0x0EF27527, 0xE9E488D5, 0xD53E4A29, -0x78A276E1, 0xB2100585, 0x01208E3C, 0xA38BCAFF, -0x36221FB7, 0xB3C9194E, 0x51BD75D4, 0x9C8C73AC, -0x7ACA9964, 0x17890C94, 0x9FDA51F4, 0xC4FDF688, -0x2C8244B2, 0x0D834C74, 0x290973D3, 0x7F134553, -0x296D2FC2, 0x4E08ED27, 0x1C51E53D, 0x3D892F49, -0x945F76CC, 0x2E531E63, 0x71EE37E0, 0x9C47F346, -0x2D8D920C, 0xC3E465BA, 0x3A72D142, 0x5B6AB80D, -0x364C2AE7, 0x3B18389B, 0xB9442484, 0x5D687BB5, -0x97C65A4F, 0xC7DBE8BE, 0x0F840061, 0x5A73EA89, -0xCBBDD954, 0xAFE9CABD, 0x06ABDF95, 0xF139302D, -0x3804FEA8, 0x7CE6542F, 0xDE47B8ED, 0xD34BE509, -0x5EB9C9E1, 0xDC582534, 0xE77D7FC8, 0x2BEFED7E, -0x4EA26DFD, 0x54670B81, 0x665C4531, 0x5B7A7023, -0xA05D9A2E, 0x71BDDB2E, 0x9D51D8C2, 0xD8A665CC, -0xA9B87A22, 0x581D28BF, 0xF9D40373, 0xE04D8F63, -0x117B9842, 0x8868B9BE, 0x8397FAB9, 0xEF5CED75, -0xF70F90D8, 0xD3DFD3A6, 0x1779F576, 0x3059520D, -0xC38F4AA9, 0x6B7A6D0A, 0x4E73112A, 0x4FF9DCED, -0xAEA1383A, 0xBAB0AA93, 0x41DBCBED, 0x266775A6, -0x8EE0D5D5, 0xB522CB9E, 0xC6E5D0D3, 0x86E4C8FD, -0xA894642F, 0xF69821A9, 0x88B41798, 0x4585A188, -0x9D2130FC, 0xC5B18E0D, 0x6B92C9EE, 0x3C9289FB, -0x1F02CBB6, 0x31FA86DE, 0x1B2295CD, 0x5B4DA19C, -0x3134D8FC, 0xE5EABC44, 0xDF8C5095, 0xF6571881, -0x1F2FBD62, 0xE585FE61, 0x020CEDF6, 0xD70ABC83, -0x5F37746A, 0x6FDA3BF7, 0x5434E503, 0x44CF6915, -0x561B2393, 0xEA4A2251, 0xA988C080, 0xE47B1791, -0xD335CFBE, 0xEDA9DEE2, 0x4F70FB22, 0x83A2C29F, -0xF44FA002, 0x069D25EC, 0x4D5043F5, 0x887464CA, -0x661D1E9F, 0x98B856AD, 0x81A23FB0, 0x3693BD42, -0xCE0AEB0B, 0x1F6E8322, 0xCBDF571B, 0x93688909, -0xFA16A774, 0x25834437, 0xEE77FA98, 0x8DC68C60, -0x155A8760, 0x22B8FCA3, 0x1B1BB054, 0xCA3AFFCA, -0xC8EACEA4, 0xC86BADD9, 0x473770AB, 0x41D6E398, -0x568B397D, 0x065C0BE5, 0x51D38A0D, 0x3BB3A0E1, -0xBC386DCB, 0x7DCBA6B0, 0x19007254, 0x3F4FC726, -0xF27DAE85, 0xF7FDA72A, 0x6D0B5C07, 0x64A0ED12, -0xE26D8878, 0x210E4F6B, 0x65F92C0D, 0x4E4E2CA6, -0x5E479D49, 0x7B287050, 0xE9A4836C, 0xC3A111A2, -0x9B90D6FD, 0xA5F362E0, 0xADC9526B, 0x79B736E9, -0x72A9A57B, 0x181B4E70, 0x5236F32A, 0x5567E3C9, -0x23EFD063, 0x87113163, 0xCDF6D4F4, 0xF53A8722, -0xB70CF941, 0x757F40C8, 0x6A652BE7, 0xD71DA5AA, -0xF87D51C2, 0xB4A68E16, 0x763D8FEB, 0xB6DE5436, -0x12184DCD, 0x38D1DE90, 0xB39E5209, 0x1600492A, -0x073AE8F5, 0x0366AC0E, 0x1AD5014F, 0x398E0873, -0xD653928E, 0x30B5B4DE, 0xAC68A06E, 0x8DAEF4D3, -0x76A880D8, 0xF3B3BCC5, 0x2B631F58, 0x340914DB, -0xB4771DCC, 0x7C9D4A43, 0xAFDB1138, 0x014B5A83, -0x0D44185D, 0x20C89576, 0x994B4367, 0xA84BD792, -0xB2E17CB1, 0x00CE5214, 0xFB93E54F, 0x03CCA7F1, -0x956A82E6, 0x22329A71, 0x2A634374, 0xF18B7AD9, -0x1F168BC4, 0xC2CB1EDC, 0x8E0AF6CD, 0x211AF22A, -0xAB5DA374, 0x63F1F25E, 0xEC58D4CC, 0x48C65C46, -0x5A7F7574, 0x7BA60047, 0x279EF299, 0xE0B77F48, -0x647A03C3, 0xAE7C4D8F, 0xF65149D0, 0xAC9EF228, -0xCD90B1CD, 0xCEEDA54C, 0xD8FD0A6A, 0x8D7C2291, -0xB38EF6C1, 0x7F38E676, 0xDADD0A8F, 0x1125713C, -0xAA78A299, 0x54033F20, 0x199C76C5, 0xCAF82A17, -0x16F2EE8B, 0x20071D0F, 0x2CA000F8, 0x0178A24B, -0x0029EE46, 0xA9D8C738, 0x123D2BBD, 0xEF7CAC52, -0xBD241869, 0x435F8FF7, 0xB573A190, 0x402BFB2F, -0xFDA3097C, 0xF3765889, 0x68E2C7D5, 0x4C26F858, -0xD6814D1F, 0x6B043C7B, 0x173DB091, 0x95126C7C, -0x0FE8E1BE, 0xFDEB233C, 0xB979B0CB, 0x00E00659, -0x19952E52, 0xA0976F7E, 0x02FB462C, 0x798815C8, -0xA2504EFE, 0x0F4811AD, 0xBA8F122E, 0x5EE5864F, -0xD39B6799, 0x5319F6A3, 0xF6A66685, 0x988D106F, -0x7ABA5220, 0x0320384B, 0x4DE48C79, 0xF5CB36E6, -0x2B33270F, 0xFF4E6965, 0xD4D843D5, 0x7EEE861C, -0xA96AE5EE, 0x310E5215, 0x6D20068E, 0xB149AE8B, -0x0997D9EF, 0x5043FFFA, 0x0516E2B6, 0x3FCCDA32, -0x8E604A04, 0x23012778, 0x9444A474, 0xB7F5DC24, -0x3A58E6FB, 0x17B759FB, 0xF29C1EE7, 0x8893D2D1, -0xC6CD235B, 0xAAB0CBCE, 0x2D84474C, 0x8A0BE027, -0xFDB87FB5, 0xE6B507BD, 0x19B41927, 0x783FF4DA, -0x485A1D5D, 0x8ED285C2, 0x25AFC4C5, 0xBF0D662B, -0xC4238532, 0x4339FCCF, 0x14A784B6, 0x71665819, -0xED76E473, 0x5F1BAE9E, 0xD0AEC17B, 0x4CE78814, -0xD3609F61, 0xD4E49EB0, 0xE4E3EFDA, 0x9B7CAD1D, -0xEF01ABB7, 0xD137BEE9, 0xEE87A81D, 0xD4B204FF, -0x00B25737, 0x2770FBD1, 0x174AFF7F, 0x0A77A21C, -0xF1B370E7, 0x9C093CB0, 0x080C1FFA, 0x83CE92D9, -0x1707470C, 0x3303479F, 0x25F1B6AF, 0xF40EEB7F, -0xB98A1677, 0xA54A1BA2, 0x43B4144A, 0x2F092A35, -0x33286A77, 0xA0AB9C93, 0x4F8D70DC, 0x3A47BF6F, -0xB6209AB5, 0xA4C94557, 0x5E757055, 0x706EAD9F, -0x467BC02A, 0x6472A857, 0x42055C57, 0x66F2BA60, -0x33C0536F, 0x3240BFBD, 0x3DD74E6B, 0x1F58A552, -0x822E9577, 0xF49BFE77, 0x5490DC6D, 0x1D32BBA0, -0x1C30B072, 0x78A4A5C0, 0x1EE88A57, 0x97CAC3C8, -0x9912861F, 0xC916BBAF, 0xFC3A7F0E, 0xCA5E1F3A, -0x630F09CD, 0xF6C8C210, 0xF0A12A72, 0xF3148619, -0xDF1672E1, 0xFCE5C390, 0x29CAE554, 0xE984A45C, -0x8A1F0A3A, 0x6A02C707, 0x8CFB3ED6, 0xC0A741BD, -0x7A871FE5, 0x91021A69, 0x505FB05A, 0x8F85227B, -0xC300ACF1, 0x0A1B201B, 0x224614B2, 0x54A23576, -0x5360A5BA, 0xDCD23A31, 0xF98DF638, 0x79FF79D7, -0xEAC8EAC3, 0x4D22C65D, 0xDFFBF1D9, 0x55FD8848, -0x4BFD2347, 0xE2A08287, 0xE6A48824, 0x80625EA9, -0x71AB3F7E, 0x99B84DE5, 0x6512ADBE, 0xFBF24C47, -0x3EEF2564, 0x23DF9F1B, 0x24BE5199, 0xDEDD72D5, -0xA2FE063B, 0x4FE520B1, 0x9E4E7BBE, 0xD615BDBE, -0xC14E8184, 0x40F86FB1, 0xD403A65A, 0xC5AF6386, -0x412F8434, 0x6D6012B0, 0x4EC57107, 0x3F76AF19, -0x54A305BD, 0xEA9C4EB2, 0x584E0176, 0x20759805, -0x1A16C84A, 0x50BB10DB, 0xE610AF45, 0x98CF1EA0, -0x3F8C7756, 0xF9056BE0, 0xBAA66B7D, 0xF7076DCF, -0x67F1994D, 0x92BFEB62, 0x86FBDE17, 0x389DB311, -0x2A171F5A, 0xE14898B1, 0x4D11723F, 0x29889062, -0xCBF3DD79, 0x2B7468FC, 0x4FB93770, 0xC5FCEFE8, -0x8FEE6678, 0x9F4ABA9C, 0x6A6B23E1, 0xFEA7077F, -0xC835F734, 0xCA67807C, 0x1BFBEB49, 0xB8B1E842, -0x6A850623, 0x001C1E8D, 0x782AC01E, 0xA28A72D8, -0x6CD66FC1, 0x77EF6F13, 0xFF40D7CF, 0x4A163DFB, -0xDB21AA89, 0x29D03A9E, 0x3A4D1D57, 0x7A89CDC9, -0xC5623E10, 0x8A444799, 0x1F620DF4, 0xFF876758, -0xC9DEEF2E, 0x7F86911E, 0xE3196093, 0xA00EB422, -0xCDB1743F, 0x4AAD1988, 0x70167700, 0x70595C5F, -0x8E648013, 0x401D8770, 0xC762F0E7, 0xDB776926, -0x2BDC55B3, 0x8F4AD2C1, 0x1A2EEB50, 0xBD4BF2A4, -0xA43FFE90, 0x752935E7, 0xB02C7801, 0xDD4CD3DB, -0x3815C394, 0xAF427695, 0x7455A8F9, 0xC444C7EC, -0x9BC9B2C5, 0x08423BA7, 0x5D91ADD8, 0x59D866DB, -0x0AD32258, 0x7BC397F6, 0x0EF7DB59, 0xC1034320, -0x79073406, 0x991A12B9, 0x9D6776A0, 0x6348A5EB, -0xBD98CDC4, 0x81A6C5C5, 0x76A3ABA6, 0xFA9CDF77, -0x97772B59, 0xD987E42B, 0xA4B893D4, 0x61F78E38, -0x82567691, 0xCB91CD58, 0xEEFA69AE, 0xF7D51178, -0xA436C578, 0x99E86E08, 0xA8C3B16B, 0xD609054F, -0x1E0ADCE8, 0x5DF6EF20, 0xEB3CC45B, 0x9FAEA24F, -0x97F57F19, 0x66E2713F, 0x42A423C3, 0x2A21B17C, -0x6A4C6B40, 0xFA0F4F2B, 0xD1F3F64A, 0xD0AAFA50, -0x767D3AC2, 0x837E626D, 0x3B21279C, 0xCAE18855, -0xFA8CA385, 0xA91BDE45, 0x1A953327, 0x733948CC, -0x158B8CD2, 0x904AC43D, 0xA6BC8F82, 0x55F027DA, -0x95B6BB32, 0x9265FF80, 0x8EEF0D24, 0x28F6796E, -0x1D736700, 0xB621D4D6, 0xAB2F1A4A, 0xECD7DB83, -0x35CAD419, 0x60604917, 0x5DE51335, 0xA3D7E122, -0x685D04D4, 0x494739D4, 0x0060722C, 0x59149718, -0x03C9F144, 0x43328818, 0xBB1AE189, 0xCA7B9250, -0xC835666D, 0x83950220, 0xD774405F, 0xF6F4FCCE, -0x0E38794D, 0xAF184A7E, 0xEF66E15B, 0xA0C2A74F, -0x876112D5, 0x7D68C9CF, 0x8902011C, 0x6AB0E128, -0x2A515520, 0xA99D1DA0, 0x9EACEB4D, 0xB669AA8F, -0x6F96DCE2, 0xCFEB5CDF, 0x46EB36BD, 0xEDDF8317, -0x4FA30C3E, 0x9541A8A1, 0xA5F75533, 0xEFE1FEF6, -0x7F21B481, 0xDA11D5EA, 0x64642069, 0x083D2137, -0xDF508726, 0x8F6CCC4B, 0xC5412D0A, 0x6A9F6BEA, -0x3E3CC54F, 0x078BBB1E, 0xA6047468, 0xF1FA39C2, -0x26143435, 0x90132EB3, 0x4216580C, 0xF6773B8C, -0xA6B188BF, 0xE3B49523, 0x89E4563F, 0xD0B16538, -0x2D9079FD, 0x69ABDE36, 0x669AC5EB, 0xD0618DD9, -0x5080BFEF, 0xADC056D6, 0x72402C9C, 0x0AE79E07, -0x8D6DF48E, 0x0502837E, 0x79BA17AD, 0xE4871C89, -0xC4554CD5, 0x23FCB2A4, 0x646FA999, 0x212A9DB8, -0xBD23DF0A, 0x890B5FE6, 0xB5D03292, 0x9FA3FD59, -0xD612F8B1, 0x611365FB, 0x7E7C9FAB, 0x024194D2, -0x46C2C617, 0xAEB0FAD9, 0xAE5D3A7E, 0xEA8B0ABB, -0x760730A4, 0x50443E76, 0xECA64341, 0x538E5256, -0x8A8505F5, 0xE0E4DC29, 0x105DC564, 0xC73D93D9, -0xE3F27C90, 0x8CC01FC8, 0x400D0F76, 0xDCD01130, -0x1E3416D4, 0x4C612E03, 0x0BFE7A5C, 0xFDB15334, -0x5326A77F, 0x99549BDA, 0xDDE90BAB, 0x920BD872, -0xC4B4F5DF, 0x7B39BAC2, 0x777C6694, 0xB4971103, -0x9E7806A1, 0xD3141F2D, 0x2B40BAD0, 0x74AF248F, -0xD1AEED43, 0x2F453736, 0x1880104E, 0xF9CD502F, -0x7691FE59, 0x39C3FEC7, 0x72EA7BF2, 0x0C94BAB5, -0x35D6F509, 0xAE86AC96, 0x0624C181, 0xA69DF699, -0x5991FCE3, 0xAB20D4F1, 0xF30F1BC9, 0xB094CF62, -0xA3B5A732, 0x3BC8C32F, 0xE7710370, 0x429A8D96, -0xD8913A42, 0xCFBD0E4F, 0x710B7078, 0xC6501E93, -0x241224AF, 0x978D2320, 0x8EF1064B, 0x273FAE07, -0x316EC02C, 0xB3C16C0B, 0x8249C245, 0x21AD11CB, -0x6265FE57, 0xA9F1D5FC, 0x0B52F1CD, 0x0381D983, -0x2931D6B1, 0xD126CD94, 0x69D95197, 0x7CFB6AD0, -0x46E6D50D, 0xE60BCBD2, 0x72FBB436, 0xC971A4CA, -0xA580B9B9, 0xBC823514, 0x5D15A840, 0x87A91622, -0x63490D13, 0x277189A8, 0x22CA2EDC, 0x1C56456D, -0x1B5EB836, 0xD8BBF2EB, 0x20F56DFB, 0x99321E4B, -0x9238B783, 0xE5E5D085, 0xC81DAA11, 0xEF8DD032, -0xCEC28645, 0xFC40AAA5, 0xBFA5FC68, 0x1C2CF7C7, -0xC0DFD194, 0x5AB730DA, 0xE3FB56A9, 0xA0AD00E9, -0xB7BA2E2E, 0x579C8722, 0x04AA07FD, 0xF55C6C5C, -0xE56CD6DD, 0xA7DA5100, 0x2A6BA1E5, 0x9B7E5104, -0x81410420, 0xDC6130A8, 0x3EC8935B, 0xCC2EC782, -0x142344EF, 0xF016E0CA, 0xA3ACFA8E, 0x019A7009, -0xA0DAEC5D, 0xFA503565, 0xC907794E, 0x77AA4E69, -0xB45B7E54, 0x929A056A, 0x46AA4AE1, 0x55E56EDF, -0xFDD9D726, 0x35744D5C, 0xD6854700, 0x9A6E1EEE, -0x0B00F6FB, 0x6BE65BFB, 0x9CF98DE0, 0xD80ACE66, -0x1E5300E4, 0x745338DD, 0x4CB925DE, 0xB369B0D4, -0x7A53A606, 0xD2B96E54, 0x88F96B30, 0xB72C3E19, -0xC2A41177, 0x6206F879, 0xC1F6CD78, 0x879DA74F, -0x763F9417, 0xD109B779, 0x6A58B34C, 0xDCD7C21A, -0x1B0A0154, 0x45EE3A9C, 0x62C60161, 0x79E47020, -0x42250A39, 0x9E2C2C59, 0xCE4F6206, 0xC2970386, -0x983CC2C3, 0x0DAF0A85, 0x388626DA, 0x06A56D27, -0x9223203A, 0x96E0148C, 0x22F0D052, 0xD5F1AA88, -0x394BC8B9, 0x03CF58FA, 0xC0B1073C, 0xC16B35C7, -0x7B7CF9F8, 0x2E3A24A5, 0xA19089C9, 0x4223FAE9, -0x7751D977, 0x802E7062, 0x6D3651EF, 0x39E9B52E, -0x946D07F8, 0x8E2EAEB7, 0xF9279A65, 0x14DEE911, -0x8B92A149, 0x9611756E, 0x067DD22D, 0x59907967, -0xB3417E3C, 0x3B72AB7A, 0x825D87C7, 0xCE5FA852, -0x5D88C5F8, 0xE792BF66, 0x28DB3A4A, 0x118CA3A2, -0xCC86284E, 0xA0AC4AE8, 0x33394B70, 0x974F96C2, -0x86ADD3B5, 0xC87295B9, 0x1447D26F, 0xC9ECAE80, -0x10CA01D7, 0xE04ECC68, 0xAE56597E, 0xAAA1248C, -0x81C35460, 0x0087CA93, 0x943AABA2, 0x0AFCBFAA, -0xEA77D5AB, 0x020D36D6, 0xF1CCBBB6, 0x8DF1426F, -0xAE726D96, 0xA6E4C915, 0x58F15F91, 0x5B696D6F, -0x00042B30, 0xC6AC90C3, 0xBD8E0187, 0xE73ED2E2, -0xCEE64CF6, 0x48B56436, 0xA33994CA, 0xB3E3B7AB, -0x060D5E14, 0xC1B176C6, 0x4A76C391, 0xD7C8DB1D, -0x333E4998, 0xC20BAC4F, 0x523BE3E0, 0x237E87BC, -0xE6CDBEC0, 0xC506F19C, 0x262C0039, 0x7F85A4AC, -0x46160693, 0x2EA1BC36, 0x4CAC0DF2, 0x0066B83F, -0xBCBC778D, 0x7F4AB507, 0x99CADB2F, 0xC95520D0, -0xC5CBF067, 0x903ECD68, 0xF5D7B0FC, 0x08198C8F, -0xA17879EC, 0x18C2723D, 0x5A4D6D37, 0x080198B6, -0x3525186C, 0xEF8BE144, 0x44B05851, 0x28B5025A, -0x0FDF085D, 0xDEB1F249, 0xA7C00F42, 0x7614A735, -0x3BEBF467, 0x7871D305, 0xD4F63809, 0x9D044079, -0xE585D3D6, 0xA89952F3, 0xF42C2B8E, 0x04179DA4, -0x00A6CE87, 0x96CA92B8, 0x9DF2B156, 0x3ECF18BC, -0xDE2509CF, 0x5CD85FCA, 0xF8A7CEEF, 0xCB7DC25E, -0xF2847474, 0x35B501D1, 0x137BBB3E, 0x451E1BB9, -0xD360D811, 0x792B3464, 0x4BF89A81, 0xA7E9C450, -0x628BCB0C, 0x2AF7037D, 0xA45F628E, 0xF0EC875D, -0x9CE3677D, 0x2CD0EA59, 0xA50A0217, 0x8BA45DD7, -0x1735ACF1, 0x5804C4D9, 0xE619B352, 0x948F44A8, -0xA9BF5C7F, 0x614D4F6C, 0x6D9FCA79, 0x29717B0C, -0x50BF2D5C, 0xD5847B52, 0x0D4FAAA5, 0x1AABCA5D, -0x779399E0, 0x58A90CD6, 0x37EC2615, 0x61B68C07, -0xC49F4AEE, 0xFAC4D897, 0x9C68CC6D, 0xBB3352F6, -0xF933436D, 0xD310078E, 0x2FBFA17A, 0x3D839C4C, -0x186E69EF, 0xCBE7CC6A, 0x7434231A, 0x80F8130B, -0x58CD7EA2, 0x2E46D714, 0x367286E2, 0xA6E2044D, -0xC2ABC50A, 0x6FEDC9C4, 0xE2F26F03, 0x3B030D52, -0x3674D8E7, 0x9096DF78, 0x90902892, 0x44A32190, -0xD08D2649, 0xEFE0ED0A, 0xCE1BF4E9, 0x62C19753, -0xFBF3D1A8, 0xD4AA5390, 0x4B32E77F, 0x9894F05E, -0x41B9DBBE, 0xE9B09561, 0x46C883A0, 0xADD5D60F, -0x69CE5BBE, 0xFD29CCF1, 0x2F209371, 0x4C6716E9, -0x31E9A09F, 0x04089795, 0xB9EF9025, 0x97C6267D, -0x63823150, 0x3AB346BA, 0xED3E0579, 0x85FC7062, -0x37B35761, 0x4A32B6CD, 0xC38EB479, 0x203642CC, -0x568FCAD7, 0x67D92B5D, 0xE51B8C3E, 0x02104078, -0x026BC607, 0x5A06CDA7, 0xE27435D0, 0xC7C20CE7, -0xFEA74022, 0x77310076, 0x35C6F953, 0xE1B199C5, -0x262F139B, 0xFD2FE2C7, 0x3EEE02EB, 0x915A873F, -0x2DE4AB8E, 0x2421DC15, 0xD1DD0D9E, 0xDE02B5AD, -0x151C76CF, 0x798B90B7, 0x82EDDF4C, 0x795E18CF, -0xF09CEC5A, 0x070ADF8F, 0xCDCF5232, 0xD498D43C, -0xB4FC2662, 0x25678E54, 0x5D200482, 0xC31F21C9, -0x35E5AF29, 0x8CC0E603, 0x995351AD, 0xD8EB54F6, -0x564E35D9, 0x0C13E321, 0x34CFA33D, 0x33D1E5F9, -0x2EAC9748, 0xFFB950D6, 0x2032206F, 0x4F871AE3, -0xBD464C61, 0x06356EA0, 0xA15A290D, 0xA78456D0, -0xD2F4EE88, 0x4D835908, 0x15DC87B3, 0x79EDB6C3, -0xAEAF0F9E, 0x5C3E7EF9, 0x639A099E, 0xD375D8DA, -0xB718510B, 0x090DF965, 0x9C8A362E, 0x25AD10BB, -0xF9A42BE9, 0x8ADE3DF0, 0x5527424E, 0x301F0D0F, -0x2F691C9A, 0x534FE1FC, 0x7D406016, 0xF98820A2, -0x4D204871, 0xED145173, 0xD67ECE9A, 0x35F9F990, -0x8ED4D787, 0x1F3F46E1, 0x5A68F171, 0x9A9D28B0, -0xE726BD5C, 0x8119228D, 0x0ADBA4D2, 0xEA243204, -0xE523C0D6, 0x261E3664, 0xB2D1211C, 0xB4D9293A, -0x9C89D924, 0x15A6A3A9, 0x0D8C6C66, 0xEC04AD36, -0x0CDF0F98, 0x9262C7DF, 0x8EE0E09B, 0x6B929EE9, -0xDCC713BC, 0x75FD34FF, 0x2784E694, 0x23C23044, -0xB7B04F09, 0xF10B753E, 0x2EC774DA, 0x470BE72E, -0x054510E9, 0x9C7DDF10, 0x1466C277, 0x9F52F493, -0x7F298608, 0xF1BA10D3, 0x8847A319, 0xEE8A63CA, -0x8E64B34E, 0xEBB66933, 0x575ADB24, 0x041BFD76, -0x727ED364, 0x00F4A008, 0x8F5EDA92, 0x21477637, -0x0B360617, 0x56DC8978, 0x27F88944, 0x69B799EF, -0xEA1E943B, 0x6FDD60B0, 0xCE2AD89F, 0xB98CCF43, -0x2A3796BF, 0x4DD02535, 0xC6B524EA, 0x6B173341, -0xDCE0A457, 0x91770646, 0x57A8D138, 0xFC218331, -0xDC6B712D, 0x14C0B3B9, 0x30CA09AD, 0x759EB942, -0xBC9634AB, 0x8F92A7E5, 0xF7F85B53, 0x6C831B3B, -0x56A75B18, 0x43DB9F1C, 0xF81FC212, 0xB8EB9026, -0x78A74B51, 0x870655E3, 0xA17B536D, 0xBDE866CF, -0xFC609F11, 0xF34A7016, 0x7C4FD4DD, 0x236312F6, -0xB50520A8, 0x4BEEA2C3, 0x2B690BA3, 0x18701667, -0xBD791FA9, 0x236D36CF, 0x49E576CC, 0x316A77E1, -0x93E9B0BF, 0x52715603, 0x83B9AAF2, 0x0F8F2A80, -0xA87F764A, 0xD2079BEB, 0x48A24AB6, 0xAC370950, -0x3077FB2F, 0x4BAFF3F5, 0x1A79926D, 0x8B369956, -0xAD78F739, 0xED88CE42, 0xB96A7C15, 0xA7BBA2EE, -0x47CC3233, 0x804DE962, 0xE0B431A3, 0x4A8257B8, -0xA4B0E8E2, 0x2FFC49B8, 0xF0CDF5E5, 0xF089C32A, -0x46328288, 0xEACBC054, 0xA48CB5CC, 0x77996530, -0x83A4E184, 0x3C2F47D9, 0x5106177C, 0x33F1A787, -0xA2266E7A, 0xEBC426C8, 0xD7E8ADD3, 0x2DF40477, -0xF9E8D7BD, 0x80BD8EAB, 0xE61CE55F, 0xF6A7EF6F, -0x5C67E1C0, 0xFBD0088A, 0x7ED37B24, 0xF5BFD58E, -0xC29CFB0F, 0x61ECE08B, 0xA776CFD8, 0x9E0F3A05, -0x8FC8B02F, 0xFDF82702, 0x028C2F2C, 0x169D3094, -0xE4AA3228, 0xF2CD142D, 0x9C70574E, 0x057BFE78, -0x782B9039, 0x0D01311F, 0x97552050, 0x6A097F2F, -0x1B3242B8, 0xF43F32FB, 0x96004287, 0xC3DC0939, -0x4215A0E1, 0xACD1A28A, 0x189932EC, 0x9BBA0475, -0xFA154E5B, 0x4B4E8D01, 0x4D6B18B1, 0x31545B3C, -0xC849C52D, 0x60958B9B, 0xE92CF090, 0xAC3E1B58, -0x251D02A3, 0xFAEE4F8B, 0xB1CF6CCC, 0xC2A0D8B0, -0x0501DF46, 0xD0369D94, 0xF3E11479, 0x397599F8, -0xB90064D2, 0x341F6D57, 0x31F0141A, 0x2F899029, -0xBC9EF6E8, 0x13B47347, 0xB93D59BB, 0x556E990F, -0x5727BDFC, 0xBA9F5121, 0xD67BE7CA, 0xB167E84D, -0x2C0ED0FF, 0x251FFD4A, 0xC98719F2, 0xD379D976, -0x8B3A0A9B, 0x40BA5F66, 0xE40A93E8, 0x2F89FC04, -0xFCBAFDD4, 0xF2424270, 0x1BDBDD15, 0x7F1459B0, -0x5ACB6C6A, 0xFA20719F, 0x2F16FFB4, 0x820DDE50, -0x468AAC15, 0x7816134C, 0x978D9570, 0x6745CD6D, -0xC1E768C1, 0x15E243B5, 0xBA30AD61, 0x483FB6FE, -0xCAA17D0F, 0x2F8F0974, 0x34AB68B4, 0xB3E864B0, -0xC1DA3828, 0x5DAD43B0, 0x72D13B81, 0x01F274AB, -0x9C0651AD, 0x0FC30C10, 0x0E7AA3CB, 0xDBE6B9D9, -0xF423B9A7, 0x457B4E32, 0x40E8E269, 0x91DA042A, -0x9DBF41E9, 0x308C0F2E, 0xCABFAC0D, 0x0E2C86B2, -0x117BC3C6, 0xEEA538F8, 0xF31585DF, 0x0DF50281, -0xEAA9601E, 0x8F408AFA, 0xF1144F9A, 0xA2AB2ECD, -0xACB88685, 0x6F4EFFBD, 0x81EEF886, 0x46B02240, -0x3C09D916, 0x4F0DAF68, 0x8337B3E3, 0x9A011BA6, -0x4C63AC66, 0x2FCC669E, 0x0C7D15BB, 0x51279D9F, -0xC1354779, 0xEFF940AF, 0xA956CB37, 0x0DB797E2, -0xE665EE55, 0x79AF879D, 0x21BBC902, 0x30B264BF, -0x411CDC98, 0xE453389F, 0x47C2C197, 0x3E6015F8, -0xF9E7AA2B, 0xA9302474, 0x04C6888F, 0x4D118BF9, -0x0DB7AAC0, 0x52A38EDB, 0x4DAB22F2, 0x7DBB6EAB, -0xD4D17851, 0xFD944314, 0x40C5838C, 0xBA6EB0EF, -0x9AA287A5, 0xF6D236F0, 0x41D9E2BA, 0x6968D776, -0x31B1D129, 0x42C3F963, 0x27CCAD30, 0xCD61BF4E, -0x2C7DABAB, 0xA78A9CC3, 0x7F856B6F, 0xB6D444A5, -0x90CBB312, 0x95611781, 0x4916D531, 0xC496C30E, -0x706D0CB7, 0x35D0064B, 0xFE26C36A, 0x6211F14B, -0x2C2340BA, 0x58633567, 0x06B6BA8E, 0xA7EC3D8D, -0x1071B0CD, 0x388EEFA8, 0x60D8FB1C, 0x5F99D147, -0x52CA6EBF, 0xFA73602E, 0x0376C15C, 0x3C91B57D, -0x9386AF17, 0x14A35A1A, 0xBDB42A39, 0x0E83C257, -0xD4C5C775, 0xA607FA46, 0x91B9AD40, 0x7623C5D6, -0xE3D53E6A, 0xA3C663E7, 0x5AD39BCE, 0x03B58394, -0x38862C7A, 0x01D50B9F, 0xEAAB38EC, 0xAB3DFB8B, -0x06795385, 0xB17F485E, 0xE2F57914, 0xB79A3BAA, -0x13DA7886, 0x7136C7EB, 0x5E748AF7, 0xD34F16FC, -0x968F6701, 0x99C5D7BE, 0x530F7FAC, 0xCDF5D567, -0xE31DE0D3, 0xCF93BC68, 0x34C578AA, 0xA201F761, -0x5CB8DC00, 0xCA24DB98, 0xF8AD7E4F, 0x808EC476, -0x603BA751, 0x489555C6, 0xF2A03FF0, 0xD2461E9A, -0x102C33BE, 0x7673933C, 0xC11A2424, 0x6A23C8C6, -0x69499812, 0x19AA8510, 0xC8CDA75F, 0x34B5216A, -0xD87F7420, 0xC8CEDB53, 0x8DF11BA2, 0xB10911C6, -0x3F1E5955, 0xF075F4EB, 0x17874FC5, 0x0D55685B, -0x5EE521E5, 0x46C72924, 0xF8540210, 0x5D5E4C5C, -0xE87A133C, 0x91633DC9, 0x36B54D5D, 0xA8B5D440, -0x7DB7D6C4, 0x5FA82C17, 0xAD679039, 0x86B3B839, -0xDF5121B7, 0xC08B768A, 0x338A512F, 0xCF9A4F9A, -0x5DEFBB5B, 0x4C9301B2, 0x08023702, 0x5B1D7E28, -0xEC800505, 0x3A869E80, 0x4C50C8AE, 0xB1AE9064, -0xAFFA34EB, 0xF2F006B9, 0xD8A9A3D1, 0x2C6C2134, -0x677EE648, 0xBB6B6D5C, 0xA285136C, 0x6C47BF4C, -0xAF158DC1, 0x0EF75E2B, 0x5B9C74D5, 0x9B8D4BE3, -0xE495BE19, 0x5940B228, 0x55E62656, 0x3247E060, -0xBF7094CD, 0x1C1AB380, 0xECEA2275, 0xB6DD8251, -0xCCA39DD2, 0xAB85D992, 0x278197D2, 0xFB6C9FD0, -0xBD53B458, 0x89EFE0EC, 0x52A3DFFD, 0xA6B7FF7B, -0xFB043649, 0x93C93F79, 0xAEB4CD6D, 0x71DB5C90, -0x9E8DFE92, 0x0F1A5B91, 0x55C5CF5D, 0x1A1847AC, -0x8D25CF6C, 0x914FD316, 0x39FCFE20, 0xD8F66A07, -0x2CDD3DC6, 0xE415AC72, 0x3D1BD09B, 0xA8322C59, -0xBD3A826A, 0x2A988A40, 0xEBD8B1DD, 0x9F53EEEF, -0xDF571816, 0xD4FCCDAE, 0xB85A1E50, 0xBE1A571F, -0x0ED07534, 0x4C1E471A, 0x8B4D36F6, 0x0E388FC6, -0x9ED2BC4D, 0x3E2D7F72, 0x752ACA15, 0x8960B48E, -0x5892B3D7, 0x70F6F3CD, 0x26C485EF, 0xC83839B9, -0xFE6C224B, 0x3547203F, 0xF73ACA84, 0x065DCDBC, -0x8986EBDC, 0xCD59EA14, 0xC0EF58A8, 0xC5587229, -0x484FBCEF, 0x9B8BF24D, 0x351CF946, 0xE10AA973, -0x17919640, 0x95FF7B1C, 0x82AB65E5, 0x070BCC98, -0x0E7CDB8D, 0x38DB27DE, 0xCA543C2B, 0x0131EB41, -0x8300996B, 0x88B63D66, 0x03ADAC1D, 0xB205A87B, -0xD8BDC0C6, 0x443F6071, 0x2CE69D2A, 0x6E1E5A53, -0x4EFF93AC, 0x70322657, 0x5CCDD146, 0x04C435B6, -0x5BF3CD69, 0x51E09115, 0x2545DFB2, 0xA52EF448, -0x8D387046, 0x7C4F1F25, 0x2EFFD8AA, 0xFD6422B0, -0xB82E26A7, 0xCF01CC45, 0x88899EBE, 0xDB621966, -0xBBA1822F, 0xB264AAEB, 0x1076EAA5, 0xC24B0CD5, -0x54D554B0, 0x4ECA7C05, 0xC8C9B053, 0x70A86D97, -0x4E3265CA, 0xEA24F810, 0x873B172D, 0x79A74D18, -0xEC3F49D5, 0xD1799602, 0xA21A28B6, 0x3FB99AD1, -0xC2DB35B3, 0x63EC2E51, 0x17E4489F, 0xE8E19164, -0x79ADD819, 0x10D66157, 0x5F621A73, 0x1CD063BA, -0x6665815F, 0xFA0B7081, 0x6E0FA473, 0x0CE3571E, -0xB5EAEF46, 0xAA04CF54, 0x336680CA, 0xDABBFF11, -0x2259E797, 0xB57B4470, 0x111EB4BF, 0xC171D42B, -0x5889A7A4, 0x419CCB3E, 0xBEA1F366, 0x41FE414B, -0xA65CB898, 0x6C28363A, 0x8F82FC84, 0xDBED5A9C, -0x4DBF3526, 0xF2F34E66, 0x9D2C9B11, 0x0C0D4DFB, -0x4DBF79D4, 0xA256E86D, 0x6407376C, 0x3F3E8AFF, -0x474B3593, 0xE55965C8, 0xCB20D358, 0x0C671A9B, -0x169F8342, 0xD2E1C9E7, 0xBDDBAAEB, 0x93DF0C75, -0xF27707F7, 0x5108305B, 0x4FF2C060, 0xEB9C08DE, -0xDF11020E, 0xD2271046, 0x6D1BFD27, 0xED020CDC, -0x2C22659B, 0x692050D9, 0xD14BE291, 0x3EBF8E86, -0x8344B625, 0x7840B91C, 0xB702BD5F, 0x4935D318, -0x01A22013, 0xF2A20B08, 0x651A1C38, 0x004FE633, -0xE51DCC06, 0xF5B86138, 0x9FBFF118, 0x6F7B3CD4, -0x028938B4, 0x071E96AE, 0xDF33DC9E, 0x79001AC7, -0x7B5D20FC, 0x3F137794, 0x81165B04, 0x973F8FD4, -0x0AE4CBF5, 0x7C48180B, 0x4A96BC89, 0x58066E74, -0x86669DC6, 0xDC55A218, 0x858C3130, 0x99AEAC91, -0x26983FC4, 0xEE4D4F06, 0xD8D6D657, 0x18EF262B, -0x374A620F, 0x85995F9C, 0xCC814AC1, 0x39F487E0, -0xC628177B, 0x2FAE2C39, 0x642525A2, 0xC1474F2D, -0xBC7CD49E, 0xE81E13F7, 0x83F42BDB, 0x8AB7D99A, -0xA8040B11, 0xD8AA68EC, 0x983B3739, 0xEE42ECDB, -0xC9513498, 0xCAA06A14, 0xE4784094, 0xE6BEBB9E, -0x13BE8018, 0x59E3D5D4, 0x0CF1728F, 0x963413BE, -0x319533B7, 0x14662ABE, 0x3363B45D, 0x59A99687, -0xBBB0FDA4, 0xCDBB8B21, 0x0240F3B1, 0x226DAC3B, -0x30E1C49E, 0x76E076D7, 0x4B91C598, 0xB3C46E2F, -0x4A657CC7, 0x66C3875A, 0xCBC6FC54, 0xF832EBE8, -0xDD1EAD3D, 0xFEFDAF85, 0x8DE51B88, 0xAEAFD5D3, -0x3E4CEA82, 0x55F47934, 0x9F8314CA, 0xD0220BC0, -0x5ACEF81F, 0x71FDD8E9, 0x13A14ED8, 0x6F1FC1E4, -0x75046A04, 0xC6C4FDAF, 0x4FFFF724, 0xF44FEDD6, -0x7E1C5CBC, 0x784C6B4C, 0x8D85F220, 0x38B65C3E, -0x8C992050, 0x2DE34C13, 0x9F2A4547, 0x48E58F65, -0xA280B689, 0x6F540D8A, 0x10B61B39, 0x1C8A2849, -0xA7316358, 0xDBFB7862, 0x182C553D, 0x92F04389, -0x1FE7BADD, 0x6A724CBA, 0x970BE020, 0x93760058, -0x2DF9E0AD, 0xCFF1F8B1, 0x170D810A, 0x45F4E6A2, -0x37A0E8FD, 0x86D11C6D, 0x4F3C6A3A, 0x4B144452, -0xCE9B87A1, 0x7C08C30D, 0x9CB9B0AB, 0xD55F2CC5, -0xFF95180F, 0xF35505BD, 0xED5BDB96, 0x85CA2E41, -0x8708B264, 0xD6079734, 0xCA76AB3D, 0xFD6CDF4F, -0x9AAB840B, 0x92D3A5F7, 0x93A92C38, 0x0419AA7A, -0x1D50006E, 0x126F48FF, 0xACDA412C, 0x01139454, -0x8E23C486, 0x01D44F51, 0x7A5F6F10, 0x377D4D5E, -0xB784E72F, 0xA9AC925F, 0xB9C66C79, 0x057331E6, -0xCFF040E4, 0x77E8A960, 0x35E31EEC, 0xEB807A44, -0x8594FFFC, 0xD27629B7, 0x5DDF526E, 0xBCF2F484, -0x88805013, 0x41047850, 0xB8574ECD, 0x3E15082F, -0x309C16DC, 0x297B6904, 0x30C39ECB, 0xD20B61AF, -0x51A578AF, 0x4E0D24A9, 0xC61FBE5F, 0x7A89F4C6, -0x9432299D, 0xFE261B95, 0xDD1FC4CA, 0x044BFB92, -0x41BE56CA, 0x0A2B6831, 0xE135D75D, 0xAB2D00A0, -0xB4374080, 0xFAA6DBD0, 0xA704C4A9, 0xD81385A4, -0x51533312, 0xED5EDAF7, 0xE4EDFAEB, 0x74B7DAFE, -0x9D810AA7, 0x40B91827, 0x65219BCB, 0x75431C16, -0x94D923D3, 0x00B7AA4E, 0xB8A88FDA, 0x927278D7, -0x7A237697, 0x45B14097, 0x2E3A562F, 0x93003322, -0x0B88A5FF, 0xD13D4ADD, 0x6D7B7579, 0x72D834C4, -0x0BCAA361, 0xC02E00B8, 0x15023551, 0x481C5E93, -0x02E81A16, 0x8A846A33, 0x1239A971, 0x994818B4, -0xFC3DBB6D, 0x43C8D2F2, 0xE3AE548C, 0x408032F1, -0x02B05636, 0xE361A60C, 0xFE2CA292, 0x061D2374, -0xDB285556, 0x70627EA4, 0x7FC64AF0, 0xFE100B6D, -0x71AEB3F2, 0xA565A412, 0xA698731F, 0x49DD9767, -0xC3627EBC, 0x75FB2DBF, 0xFDC0E971, 0xF6ED12A6, -0xA23DC00F, 0x897E917B, 0x7F2031E0, 0x17DCE568, -0xDF69CAD3, 0xC6FB5B6D, 0x097268B0, 0xE1102444, -0x86DF9383, 0xBD7B9CC2, 0xBAAF7DCF, 0x985B45D1, -0x4218E95A, 0xB2455EF4, 0xDB015F9B, 0x54CCCE76, -0x56EDF561, 0x6F66F95E, 0xF8B1EBD0, 0xF7A39AE0, -0xF66D8346, 0xA4677007, 0x02C4B3EB, 0x829987B0, -0x7C0E1919, 0x51F7060B, 0x4B30F1D6, 0x85A4E0CA, -0xEC049FA0, 0x17CBF1E4, 0x7A1AAD95, 0xEBA4C513, -0xE8462E78, 0x54CDDA0C, 0xEE7B8378, 0x9858C8C1, -0xBA33587C, 0x4D6F1B14, 0x7A2C0525, 0x7E6EE4D2, -0xACA18692, 0xDD186820, 0x41198B03, 0x8AC85AB7, -0xBD86900B, 0x36E2C354, 0xE65F9115, 0xB10645DA, -0x7971D230, 0xC83D3583, 0x8C60C81D, 0x94DB5741, -0x4FCB8934, 0x9A520FE2, 0xCE49446D, 0x8864E641, -0xF5EF25A5, 0xC1DEED0A, 0xC8057F37, 0xFB305C73, -0x392E670D, 0xA4D00D2A, 0x356A46F0, 0x2F675567, -0xB7997CF0, 0x88AF3A4E, 0x56C9D51E, 0xDD746ECD, -0x40CFA453, 0x5EA740CD, 0xE4DD6BB1, 0xCCB31429, -0xA2227F3F, 0x18A1EAF0, 0xC155417B, 0x41FE735F, -0x16D40B00, 0xC9F72AFC, 0x86B1D62D, 0x6A99A82A, -0x09D33248, 0xEC44639C, 0x9B0AB2B2, 0x6969164C, -0xEF602BB1, 0x0208FC6F, 0xC1109578, 0x2997AB87, -0xE5626B14, 0xCDAF48E1, 0x20781633, 0x2EBE0A41, -0x7379261E, 0xF216F7A1, 0x714D8258, 0x936FE68F, -0x160856F9, 0x2A4D1416, 0xB558E412, 0x7DB196DF, -0xDC88CCB2, 0xF37AB612, 0x7423F214, 0xD3B06A43, -0x25A8012D, 0xC1C69FFA, 0x936F2C18, 0x56D77C19, -0x774BFC69, 0xF5E85E24, 0xD79158C9, 0xA67C3E15, -0xB958819E, 0x69F81278, 0xF2B35107, 0xBF2F4085, -0x1C997A06, 0x6C238C3B, 0xC756D56E, 0xD15C1149, -0x351E6EC4, 0x2311303F, 0x0621602C, 0xB11B6DD1, -0xBE8E50B5, 0x34A5F589, 0xE4D308AE, 0x4344B297, -0xA33AE98D, 0x0A303CDB, 0x388EA17B, 0x0107B5A5, -0x38B39042, 0xFE678995, 0xB426FE69, 0x221FCF06, -0xC45926AB, 0x21A430F9, 0x6D192D2E, 0x4168C10B, -0x5BA6B132, 0x0519ECA7, 0x21127582, 0xF6C447E0, -0x0C72FC31, 0x0941B3F0, 0x76F23877, 0x86CF0677, -0xE7785105, 0xA4637864, 0x94C82B45, 0xF60FD6A0, -0x46941C27, 0x7A33A698, 0xE1DF8BFB, 0x5249970B, -0xDFE65E1C, 0xF4A4FB22, 0x599639F4, 0xFE0E9722, -0x7BB48F58, 0x533465E3, 0x9E884B35, 0x2620429C, -0x2875FFC1, 0xF11EC0CA, 0x663AF5F0, 0xB2C59C38, -0x03556ED9, 0x271E9E39, 0x8556E062, 0x08207682, -0xE5797F00, 0x66A362B5, 0x7ED8394D, 0x2922C374, -0x271657BE, 0xAC15071B, 0xE296691E, 0x0FE2C740, -0x19120FB5, 0x9ABD888A, 0xA200762C, 0x7837F41C, -0xC6F4EA19, 0xF286ABF4, 0xFCA8998F, 0x97B0E7D5, -0x1339C79F, 0xFED05D43, 0xB3392E71, 0xFC2A01EB, -0xB720CBED, 0x4FA71358, 0x04A57F62, 0x3D558B0A, -0x1DEB4D40, 0xC9C823F1, 0x470F630A, 0x08F22975, -0x2BD85107, 0x3288A628, 0xB0C89675, 0x32D957C1, -0x80B78426, 0x98A46953, 0xA493AF60, 0xC2B84AC4, -0x486D658F, 0xFE119FF9, 0xB2FE565F, 0xEADB58CD, -0x1F45F9B4, 0xCEAE62B6, 0x68EC702D, 0xF52ADDF7, -0x0FFC0715, 0x4129E42C, 0x956AC4D9, 0x0035CD9C, -0xF8FEBAA1, 0x29C58397, 0x7C2E2E41, 0x7BE74DAF, -0x2791D34D, 0xB6D67B0D, 0x8F557528, 0x9DDEED5B, -0xB3AA4BB7, 0x05E22E43, 0x4CDA600D, 0x432E2D32, -0x405DA5BD, 0xAF23818C, 0x2F73FE09, 0xD4624626, -0x653EFCB3, 0x77D65D3F, 0x51A3DCB3, 0x767F407C, -0xC66452E3, 0x10B6842E, 0x93A0840E, 0xE453AD10, -0xDE58FC3D, 0x6C227215, 0x1EE130EA, 0xB0BF64BE, -0xA11E5D38, 0x0131B755, 0x191F70D0, 0xDB483959, -0xAA8D2F9E, 0x5A002AA0, 0xF5A2996D, 0xFD0F95F9, -0xD6A12864, 0x3AA48B74, 0x50F6679F, 0x0ADF5C49, -0xE2F8CE68, 0xBF213E67, 0x5E9ACEEA, 0xCACD0EBE, -0x6DF766A5, 0x33C0A156, 0x720868EA, 0x3112A0DC, -0xB382350A, 0x369D9C50, 0xE8F890D0, 0x0A121399, -0x2AB458EA, 0x51C8233D, 0xBF46403C, 0x0728CD55, -0x23F6774B, 0x2FB59DB0, 0xFA2CF724, 0xB49FA848, -0x5FFFA125, 0xDE2C0D15, 0x76B78C41, 0x192BA62C, -0x4C9563E2, 0x8F742507, 0x882104E0, 0x357AD078, -0x799E25A2, 0xEF3ED021, 0x69D54B46, 0x5EC57870, -0x0FF418E0, 0x07C5AC7F, 0xC1ACBF9A, 0x80A830D9, -0x837C7C5A, 0x04C11D86, 0xC14C8BC7, 0x92BA650B, -0x94D34FA8, 0xDBDD5EDC, 0x9ED2A08F, 0xA1FAE485, -0x5FD66C3D, 0x4CCB6F9F, 0xB7AA56B0, 0x0FB3C73A, -0x03AF96E6, 0xDB2D38F9, 0x7AF20D60, 0xB57CBE90, -0x20EB2D6E, 0xCF934452, 0x82EC26F6, 0x84B3737A, -0x0972F1B7, 0x39B6DB4D, 0x13E53CC0, 0x67C41D72, -0x94BAAC78, 0x663A9C6C, 0x36927448, 0xCFBC2610, -0x980F53BA, 0x7E56C96A, 0x04C62DFB, 0xA471D579, -0xDF9B2EE1, 0xE12DEBB7, 0x2DB9B042, 0xF0C74B96, -0x6A3762E9, 0xF4DC39D9, 0x761A5884, 0xFA363D3B, -0x92766759, 0xF3EAD441, 0x878269ED, 0x1AFFAFE5, -0xCB432764, 0xFE19475C, 0xCF8776DA, 0x1F0AD906, -0x7D99AC20, 0xC27317FB, 0x439944A4, 0x65D14C2D, -0x43E45262, 0xCDE6B3BD, 0xE25C67CD, 0x321AA2E6, -0x352A2764, 0x5569EF42, 0x005C370D, 0x290801E0, -0x61883035, 0x2A2DBC48, 0xE2D559FF, 0x01F5DF13, -0x69B61558, 0xE94BF364, 0x3CA76FCA, 0x2E016483, -0xDB675F9C, 0x4FA5B6DC, 0x59A6C3EC, 0x56C6E6CF, -0x24CD59F5, 0x46911834, 0x683B9E39, 0xB5AF6174, -0x5C31E269, 0x679C9A12, 0x3787D3E6, 0xF1727EE6, -0xB070882F, 0xFC37EACA, 0xBEE0783F, 0xF6218369, -0x19372940, 0x3FF7D890, 0x69736919, 0xDD961CB9, -0x883010F1, 0x6E472D5B, 0x2447E00D, 0xF39E1F0E, -0x1DBD442F, 0xBE1977E0, 0xC8655F42, 0x37C84253, -0x3480DAC4, 0x4CFE1DC8, 0xF1521AD5, 0xA45C4F8C, -0x87FBAEE0, 0x3E41E9E2, 0xF47771E5, 0x16C74CDF, -0xA33D4035, 0x38513A10, 0xABF3264D, 0xB8D80DF6, -0xD9AD7256, 0xF78375B8, 0xD7661CF7, 0x1C363AF9, -0xD425FA32, 0x001D7B98, 0xDB96A1CC, 0xA092E683, -0x65CF5316, 0x5F282689, 0x9F52F912, 0x8958A1B7, -0x6457A3F7, 0xAB43FADD, 0x061328C7, 0x9D31B5E3, -0x75A77F6D, 0x4A764D4A, 0x488CE83E, 0x29887218, -0x9A04BDD0, 0xEF331070, 0xBCD2F884, 0x6BF66A6F, -0xB85143CB, 0xFA529278, 0x9EA3A354, 0x4A73BDAF, -0x0CBB7563, 0xD01AE35F, 0xD2AC3DAA, 0xFC8243B7, -0xD805D97B, 0xC162A75F, 0x1D49AC67, 0x9E1BC38C, -0x1D06AAE8, 0xEAF80CD8, 0xCE825DD4, 0xACA3F06A, -0x83D092EE, 0x3F2BAABC, 0x2482D120, 0xF301680C, -0x7DAC373F, 0xF5D6178D, 0xB7E9217F, 0xCCFE8C13, -0x976024E0, 0xA2F39F8C, 0xB6C65734, 0x10AE514A, -0x696584CF, 0x2542113C, 0x479CB20F, 0x8D3A22E3, -0xF7C4B88C, 0xF4F7FBE2, 0x2F553308, 0x9EA71E3A, -0x7B958F48, 0x0927DAAB, 0xF08949B7, 0x7CD46C0E, -0x7A892BBC, 0x882F32CE, 0x34C490C8, 0x8483ED04, -0x07EB4EFC, 0x4BEBCD82, 0x83B15EE8, 0x8F3B78AC, -0xF95EFDA9, 0x816BEBF9, 0x269BDA58, 0xEE373342, -0xE09FDA9F, 0xC7651AAB, 0xB8D398B2, 0xC7F449B2, -0x031310F5, 0xC869706F, 0xDA22F127, 0x8C68DF91, -0xE676068A, 0xB85AAAC7, 0xD32F35BC, 0xE22DF031, -0xFE142BD9, 0xD4FB2700, 0x2D197707, 0xA3A43A64, -0x0C02B050, 0xE945AD56, 0x7DEE0A5D, 0x1075DE3E, -0xD99AD91C, 0x6A7BB71D, 0x1774B3B8, 0x2228B112, -0x0DEEE844, 0x38074EBE, 0x6DACF57B, 0x7E0094B7, -0xCE46F8EC, 0x4DAF34F4, 0x5B961907, 0xC8236FF7, -0xFD380AA7, 0x61EBA84A, 0xAE4892EB, 0x0F1B6365, -0xB0C4C9A0, 0x04E6012D, 0xA5F90D01, 0xD6C8882E, -0xBCB9C1EB, 0x0E5E0FEC, 0x53A46889, 0xA2C0FA51, -0x520DA459, 0x3FD95FA2, 0x6E1D6FE8, 0xBC093220, -0xAB16390A, 0x163E3D6D, 0x0A63517C, 0x3BF38F3D, -0x88A1F66D, 0x96263536, 0x412DF008, 0x12FB126D, -0x44441D7A, 0x31C9F726, 0xF66F60CF, 0xAE1453D4, -0xDAEAD71B, 0x54EAEE0F, 0x948B73BB, 0x31EA3E74, -0x355D4FDC, 0x2A1F3A9E, 0x586D08DF, 0x123AC2E8, -0xF5AC0065, 0x8874ACAB, 0x05B03D63, 0x01BD6A4C, -0x7A6A9880, 0x2BC16F93, 0xC4112F0C, 0x8287B40D, -0x48EABF08, 0x29E56860, 0x0F505C84, 0x447DC08B, -0x1665119C, 0x00347E37, 0x482EF03E, 0x01B15D44, -0xE6C1B9FF, 0xB165E436, 0x0CF690F7, 0x7FC5BD01, -0xB784C7F4, 0x9BE04EBB, 0x9F614431, 0x6C37A5A9, -0x2D0DB87D, 0xF6511369, 0xE115073A, 0xF96C6AB6, -0x04A13C3C, 0xBF30B2DA, 0x93D18FC6, 0xF67D2E47, -0xCA089151, 0x51A6BC39, 0x8C1FCA93, 0xFBF2F2BB, -0xAD0A3F33, 0x82AA2767, 0x81BF2313, 0x758A82B8, -0xE103788E, 0xC00C4B5C, 0x5F52FF58, 0xABAD38F7, -0xDA68EE9A, 0x9B6D405D, 0x803449D9, 0x6178B345, -0x3C785FB4, 0xFEBABE55, 0x0E2458AB, 0x021F0D71, -0x39201ED1, 0x741B1A7D, 0xE0B0AFF4, 0x45652CFF, -0x907DA678, 0x313A93B4, 0x0B0D6B0D, 0x42C96E43, -0xEEE3E7E1, 0xE83C83E9, 0x9052B867, 0xF9514243, -0x61F20CB2, 0x57E1AC64, 0xC2443123, 0x432C96D4, -0x616A824F, 0x3C8D1E06, 0x8E64222A, 0x65C1A21D, -0x8686308A, 0x2A576A2F, 0x1CA0FF20, 0x2C8F9D3A, -0xC98C9C69, 0x35322A29, 0xDFD33C93, 0x9634F411, -0x0B4F8FFC, 0x3AED4B01, 0xEBBC7012, 0xED2387EA, -0x48BF42AF, 0xD60399D6, 0x7A9B8CA9, 0x53886337, -0x2DBB9429, 0x0A6AF764, 0xDE4D8F78, 0x1EDECEE4, -0x4F8EE99E, 0xAF23EAFD, 0x929550B1, 0x2CBD8621, -0x22A8FAA2, 0xBE2A0A8D, 0x06F7E794, 0x16E1F3EC, -0x093AAEAA, 0x92D429F8, 0xBB79A7E7, 0x43EF89BB, -0x0E097511, 0x748E68B0, 0x322C00AC, 0xA62EF42A, -0xD03BB8BC, 0x9FF67810, 0xDE24BF03, 0x140CA6FD, -0x68F16B41, 0x1B7C68C7, 0x32646342, 0xC5E714F8, -0xEFFFD2B8, 0x27843628, 0xF8445F51, 0xB9E8519B, -0x8EB01D04, 0x356FBF2F, 0x32E96BAD, 0x6A629BDE, -0x52063313, 0x200069B0, 0xE161CF71, 0x84FB7A12, -0x1805ADC0, 0x80F75012, 0xFE9E629E, 0x93395C33, -0xFF075A91, 0xB61E46B8, 0xCA9FE7C8, 0x97DCCBCA, -0xCEFFB6F8, 0x30EE7985, 0x1FABC829, 0x20B3F57B, -0x27042B07, 0xE12C5151, 0x23482B8A, 0x7B9B8EB2, -0xC997FEB3, 0x76AB2497, 0xD5CDA590, 0x9EBE90FD, -0xE3732B18, 0xFF28CEC9, 0xC6582320, 0x6EF106FA, -0x8ED74023, 0x1A0B69E5, 0x4A95DD91, 0xB41AF82C, -0x83DF69D3, 0xC548861C, 0x2F60BA93, 0xFC815984, -0x1A848B67, 0x1EAE87C4, 0xF7479103, 0x8E16DB51, -0x040B95B9, 0x2A9DB812, 0x987AFCD1, 0x866DF413, -0xBF9558ED, 0xACF1AF2F, 0xA65305CC, 0x168336F3, -0x1E59B97F, 0x3F9F447C, 0x3D54B30D, 0xE939D598, -0x36A40885, 0x02396794, 0xEB0F0A67, 0xCEAEA12F, -0xC58B4AC8, 0xE6D49760, 0x0F8F2776, 0x66A8F436, -0x31BACD7D, 0x376993DE, 0x32BD0431, 0x68BDC728, -0x63EA6748, 0xE6B00E29, 0x7448CABC, 0x42A6517D, -0xBB1313C4, 0xA04DC8FF, 0x3D402237, 0xA382645F, -0x52ED55D6, 0x92D7D7B7, 0x541230FF, 0x7AFC0420, -0x3DC4624F, 0xD9B2193D, 0xA73B9704, 0xBBDE0FF1, -0x9EB56615, 0x8AB080B6, 0x3C4D8E14, 0x5001B43D, -0x1EBFAA23, 0xD4AACD27, 0xCFAAB4BB, 0x6FFEE61F, -0xAE5A7426, 0xDB942949, 0x452C0B16, 0x738E0637, -0x36A5122D, 0xFF1F7A4E, 0x743D35CF, 0x847D54A9, -0x42C3EABA, 0xD46728C5, 0x30B2708D, 0x4F6BE0BC, -0x3C26790D, 0xB0B67C8A, 0xEE07EFDC, 0x9E380611, -0xEAD6804C, 0x4EF66024, 0x8459AE38, 0x1DEAAFFB, -0xF76573AE, 0x6CB1C8F0, 0xFFCC267E, 0x26A215F7, -0x0B1A057C, 0x7DAB9CB7, 0xD40BCBA9, 0xE561F9FE, -0xA44013A6, 0x7B22C0B9, 0x998A921F, 0xBD25244B, -0x15E07FED, 0xF15B2E31, 0x54E80016, 0xA12BCE7F, -0x658A2093, 0xB642C47B, 0xD731FC00, 0xC00E302D, -0x55B251DC, 0x342939EB, 0x6EADB2F7, 0x0CF93318, -0x61EBD85A, 0x99B715EF, 0x679C8D3A, 0x9CC1B803, -0xABEF955E, 0xB8CFF9D4, 0x707A839F, 0xF5D02A7E, -0x59E0D903, 0x5A425E3B, 0xBB61163C, 0x96ECE9AA, -0x797B82AA, 0xA9FA6BB6, 0x797C00DC, 0xC1C1FC4C, -0x8F7FDA66, 0x77902514, 0x6D1B843D, 0x4F881FA4, -0xC24AD625, 0xBC237A45, 0x9A2E0F44, 0x82FAA3F3, -0xD70E3489, 0x4F2B3417, 0x65CF65E4, 0xEAAE6A93, -0x4BEAEC2C, 0x4918723D, 0x7D8F30B4, 0x7706F59A, -0xCB2A7452, 0x5083D2D6, 0x4724B426, 0x84EB15DC, -0xBAA2C6CF, 0x71FA984A, 0xDDF7A3DF, 0xB115BF1A, -0x258AF0E3, 0xA1637D87, 0x03585DF8, 0x5EA4B80D, -0x8641F318, 0x66EE2F24, 0xC81E505E, 0x5E640639, -0xDB7739B8, 0x1A3B861F, 0x0F5ECC51, 0xB21C00DD, -0x680FF30B, 0xDE697468, 0x57A43B33, 0xD7EF6B3B, -0x4BFC7D25, 0x710F0752, 0xABAA9752, 0xCFCFD84D, -0x3BCC1CDC, 0x2381C524, 0xB60CAD92, 0xE05BC1AA, -0x2B887D88, 0xCD4566C5, 0x0D2976E7, 0xCB000A2C, -0x667BECF6, 0xEFC7F221, 0x7A7584D1, 0xC41D8B2E, -0xD9BB7D3F, 0x7CEB5626, 0x7D8165A0, 0xEE178F99, -0x3E8A8CB7, 0x693D4501, 0xB0E228A5, 0xD55B73C1, -0xAF9043BF, 0x6C627A2C, 0x7B9F490C, 0x7EA61899, -0x92B980AF, 0x6D13C758, 0x2C007C73, 0x74336E0D, -0xA39F13AC, 0x533F05D7, 0x75536CFB, 0x9708DE27, -0xE2A14E87, 0x36673FEF, 0x71BA654F, 0xB98CD2FC, -0x27F29A6E, 0x82478171, 0x1C2815F0, 0x8A8F4549, -0x048A8D9B, 0x7CEE51F2, 0xA1648AC3, 0x004F8B8F, -0xB6FE8EF0, 0x6D10A0A1, 0xAD7A24D8, 0x75039717, -0x97847786, 0x2791CC05, 0x6937FD6F, 0x60F98115, -0x5FAB6D35, 0xC0550A70, 0xC0F4D817, 0x7B5BFDDB, -0xEF63B4D2, 0x6C87C6C5, 0x956D6B87, 0x69179257, -0x10973C90, 0x8CDBE860, 0xC7C761EE, 0xF823E34E, -0x6FA2CF3B, 0xA903ABCB, 0xC82C9B01, 0x60FE96E6, -0xE5EC33C0, 0x73A3011C, 0x2A1B9054, 0xCF16F92D, -0x4FAF6CC8, 0xD9DD74FE, 0xB3C639ED, 0x3F47AF63, -0xC8E99D12, 0x92D95986, 0x835ACA6F, 0xD52930A2, -0xC7DD54A5, 0x617FDD15, 0xE9A6D295, 0xF56C6087, -0x7813B662, 0x1F8EA244, 0x1CDE3BAD, 0x58FC0F7B, -0x02E31A5A, 0xA78EAC74, 0x10C06107, 0x22BA3C63, -0xF84AD224, 0x6A8BF66C, 0x2A5CAAC5, 0x8ADC3FB5, -0x9683451A, 0x1B52FCB4, 0x95491BA5, 0xFE6C3713, -0xE9098CEF, 0x73C01EF9, 0x6E85EF1A, 0xEE189743, -0x2E9E5286, 0xC1FAA665, 0xD861E384, 0x701C834D, -0xDC5CA5CC, 0x52A3A6C4, 0xF2AF2C43, 0xC37C6465, -0x6E94AD69, 0x98808AF4, 0xED8A99F2, 0x377257D3, -0xE60F2096, 0x615EFCB8, 0x67A2BB3A, 0xB4DDD40F, -0x1D47F918, 0x86F77D6E, 0xFD05D2B8, 0xE18C330C, -0xA48260A4, 0x5615B83B, 0xBCD7D855, 0xF8073219, -0x8622BB89, 0xD35CE05B, 0x17162483, 0x137BDB69, -0xECD0F226, 0x61F8982A, 0x3C10ABD4, 0x2F33ABF4, -0x9358B547, 0x58B277A7, 0x92456A7C, 0x4384B49A, -0x5F1FF0EC, 0xA153EA4D, 0xA8E49100, 0xD3A75723, -0xD1ADC606, 0x76C314B7, 0xBC6AB227, 0x257312AF, -0x8B6AA1E3, 0xD87FF5E8, 0x2BAED373, 0xC848AB63, -0xB72B1E5E, 0x730A73D8, 0x4915E5B6, 0xDF7D77AD, -0xEAE247D7, 0x9556DDA8, 0xDE0C9C47, 0xA4E3296E, -0x31F5BC94, 0x05258B24, 0x2837374F, 0xC7E4C81B, -0x5A1AC819, 0x068074AE, 0xDF876732, 0xC0192EF9, -0x7FFD84D8, 0xFF1CE148, 0x821B4AA3, 0x56674838, -0xF9A147F4, 0x182EF58B, 0x16E17174, 0xDE27029E, -0x8BEC55AD, 0x40646F89, 0xDBFF92FC, 0x9F24C017, -0x711EAD18, 0xA663E1EF, 0xEF92F684, 0x4BD05E67, -0x7E089B13, 0xCBF619BE, 0xCEBEF231, 0xC947586C, -0x0F526C47, 0x6672600F, 0xDAAB63DD, 0x950D4FD0, -0x199C3EC2, 0x0F201C9D, 0x06BCC8D3, 0xA7672C6D, -0xB39C7D0C, 0xC74B0805, 0xC9BBD249, 0xACDD5396, -0xAB7BDF8E, 0x12012B8E, 0x67236047, 0x0AE0741B, -0x1D747E56, 0x7EC6C00C, 0xD08E8341, 0xB0ABDAD6, -0x4FA4BDF6, 0x90CE8D0E, 0x6E734117, 0x3EF9192E, -0xACA32DA2, 0xFDB9C58E, 0x256626B5, 0x5EA961B3, -0xFBC15776, 0x36602B5F, 0xF8D08644, 0x5B693C23, -0xC62EA3B1, 0xC664C7C3, 0x73BE8859, 0x17F44E8F, -0xF9B8D923, 0xD168A3A5, 0x6CCD110C, 0xD353181F, -0xC0E774EC, 0x5F9E127C, 0x6C824511, 0xFDA13494, -0xCB588BA6, 0x47148694, 0xAB877E87, 0xE97F757B, -0xF54D0A2A, 0x0FE11891, 0x5D8747FB, 0xE7800C7E, -0xEF96298F, 0x400F458A, 0xE2D04518, 0x4B4E6EFC, -0x9B15002C, 0x3CE1B537, 0xF5ACB9B8, 0x67030647, -0x475FD148, 0x1E03A40A, 0x896C7C05, 0x85F70B68, -0xC590CA84, 0x53B5440E, 0x1400F78F, 0x3ABE7F8A, -0x19CA67FF, 0x68B54A34, 0x555988AC, 0x4AB16B4A, -0x7511FA63, 0x248EC9EC, 0xC25AFE4F, 0x19F578E1, -0xE92AF03D, 0xAF9DE18F, 0x2798C7A7, 0x6B46990F, -0x41D45894, 0x74696A0A, 0xC6AAF5F8, 0x72CC10E0, -0xDB9CA283, 0xD6BBD0F3, 0x58EA4C06, 0xDEA5E8B9, -0x1908EBDB, 0x95D33DD5, 0x20D7013C, 0xE725C282, -0xFD48C92F, 0xDBBA7D19, 0xC7BEBEA9, 0xB186B799, -0xDD0DD17B, 0xD8090A41, 0xF98BC20B, 0xDD7E4B9D, -0xEBAE4247, 0x4376FDC4, 0x7F3EFAC6, 0xA9B9A951, -0x4AE390C4, 0x651863AF, 0x2CD42DBC, 0xC2A13962, -0xEF0FC443, 0xAEE63246, 0x09B83E19, 0xC3C940AB, -0x00B12826, 0xC0A30412, 0xFCF6ABCC, 0x3CFE721A, -0x62C1F4C6, 0xE963A359, 0xAE11F3D6, 0xE490D12A, -0xC45C928B, 0x05CCA78A, 0x1982E93F, 0x577F81CA, -0x66D50D6E, 0xB4C7030F, 0x93092C3E, 0x118B08FF, -0x178545B7, 0xEED74838, 0xF7D2CE48, 0x238969BC, -0xB8EFAEAE, 0x75726A3B, 0xB1E0220F, 0xC4D60EB6, -0x0EBC0243, 0x5FE0D6CA, 0x35456B45, 0x1F64AC2A, -0x58484A1F, 0x2A11455D, 0x33BC4403, 0x56E4E62D, -0x60B41E2B, 0xDB65D3F8, 0x7EC18D34, 0xF575DC85, -0x6E0B9995, 0x1C14C91E, 0xB2A94718, 0xAEC4A823, -0x993D374E, 0xF1E4210B, 0x8CFCC03A, 0x99BD1C28, -0xA928E3F9, 0xBB957D0E, 0x77C865EF, 0x7FF50A45, -0x4279A638, 0xE628FFA1, 0xBCCA171E, 0x284C9CEC, -0xA476E346, 0x7E2F9C08, 0xBF65044F, 0x5B7C3D5B, -0x6E60EE5D, 0xF5C99509, 0xFA352B7E, 0x6FDE8E8A, -0xF2340FE1, 0xDF542B6C, 0x510CB30B, 0x367E7016, -0x198A0A95, 0xA4DF508E, 0x593C2338, 0xB12BCDE1, -0x554AD3C0, 0x4DDAB1C1, 0xD2BD1850, 0xF6E126CA, -0xF87289C7, 0x86EC92A5, 0x4E033906, 0x52DC5F3F, -0xCC6E2E59, 0xFF751753, 0xDF8B8BA2, 0xDBF5954A, -0xBD367488, 0x6A0CDF1F, 0x4103139C, 0xDE49DBB0, -0x5A8428F4, 0xA26872B1, 0x96BF7203, 0x99D5E78E, -0x243850A6, 0x389DAD80, 0x6335D33F, 0xEC67B0A5, -0x029C0CA9, 0xF5F6F6C9, 0xDF574C15, 0xE6D3EC29, -0x1AA349BA, 0x453E7258, 0x7DB79BE3, 0x51FCA7F6, -0x2B42FCA5, 0xBF0E4871, 0x58063C40, 0x193580E2, -0x25605322, 0xBC49C479, 0x0ED70FC4, 0xA78B59A0, -0xE6CE3E8C, 0x92EE657A, 0x63D12529, 0xF95DAF45, -0xF92C3BF3, 0x7D514200, 0x694DF84A, 0xEF177E2D, -0x4E119CCF, 0xA025C55D, 0xF96974D6, 0x26D13E7F, -0x799ADC27, 0xD7925EC1, 0x8AE60BF7, 0xF9EF1A2E, -0x89EADD3A, 0x9C28CACF, 0x63377EB7, 0x6D1EF7E5, -0x6585B16C, 0x9972D115, 0x65F8F5E6, 0xF93DECB4, -0x6D71605D, 0xC6FDBCB8, 0xD937BA31, 0xCED727EE, -0xC34C5605, 0x25FA70B6, 0x5C0B7FB0, 0x8F9340F5, -0xA3376693, 0x4498B66A, 0x2D21F377, 0xC0A4C6EA, -0x0780736B, 0xF42D7F07, 0xE56D47E5, 0xB48C25D6, -0xA48DA0DA, 0xFE69693F, 0xF01E19CA, 0x8A0C5C8F, -0xDF702C23, 0xE18A93F0, 0xD4D5C91E, 0xD2A706F7, -0x674F9E28, 0xAF0F80C7, 0x648D49E8, 0x6BE8640F, -0xF5FCFFD5, 0x8EDC391E, 0xE583D8BC, 0x8426C090, -0xF456A27D, 0x07249BF4, 0x054A2F45, 0xAC46B73B, -0xB89EEDFB, 0x48EAF867, 0x69B2D7CC, 0xCA0CA0F1, -0x38CD0428, 0x029808CF, 0x86EE75DC, 0xF4FEE9F0, -0x6987D5E9, 0x56AB5537, 0x3DDD0940, 0x4742FF89, -0x2C3B179E, 0xD05B5CB1, 0x3C4E9033, 0x6BCF0141, -0xF2F6D3E2, 0xAD297B1F, 0xB1CC23D4, 0x5452038B, -0x1751FCBE, 0x24AA465F, 0x94C62D18, 0xF49B2EC8, -0x97AC47DF, 0xD66C19B5, 0x09AAB297, 0x89936144, -0xD15C026B, 0x4CEC8778, 0x94050D61, 0xD812E96F, -0xB6BD7B12, 0xA5F9BE77, 0x531A5C7A, 0x3605BA71, -0xD500CE54, 0xE325964C, 0x323432FE, 0x580A9DC8, -0xD25A3135, 0x089D6C9C, 0x58856F73, 0x7DFCEE30, -0x7DE2580F, 0xF4E4488B, 0x71821DDF, 0xD194F5DC, -0x7D070394, 0xBA28BF76, 0xAAF0A38E, 0xD4F6275E, -0x1B742E66, 0xD9E68EA9, 0x68B0F939, 0x52AF9D7B, -0x54A39705, 0x20F844C1, 0xE6981DDC, 0x80322E62, -0x536235B9, 0x7A57F4FC, 0x14EBF376, 0x64BE2E5A, -0x70A18910, 0x0FE09587, 0x10E9CA78, 0x8F90D3D2, -0xAE74717D, 0xA544EAED, 0x6746AF3E, 0x430CB3FC, -0xBC185576, 0xEAA35DC3, 0xDA6309D2, 0x40643F87, -0x68859117, 0xA17AC84D, 0xD7922CA8, 0xEF7C0BEF, -0x83337348, 0x9B4B1790, 0x8876A77E, 0xF293C9C7, -0x20D399CD, 0xA78224BA, 0xFD1279C8, 0x8B7837C1, -0x0F1DD415, 0xAE3FBD2E, 0xC4F77B52, 0x51E79FB3, -0x7A856D9D, 0x14BFDAD7, 0x993FB625, 0x667C65EF, -0x32F83338, 0xAA06EDCE, 0xACE7A099, 0xD26DAE89, -0xDC6891CE, 0xCD2F6F04, 0x27425FB8, 0x7C301D8D, -0x1EDEBE1A, 0xBE540AF8, 0x1D356C6A, 0x963E8639, -0x9920CA55, 0xDEFE5F44, 0x107D5545, 0x3D079BE4, -0xEF673F66, 0xDB3C2954, 0xDD76D666, 0x1DFBEF59, -0x8F384B34, 0xBE6F773C, 0x079DD187, 0x2314AC8B, -0x5FEB0114, 0x59E85CF3, 0x9BFE9190, 0xB360A31B, -0x4F7EF967, 0xFEB0D561, 0xBFE779F2, 0xF33702B3, -0xBB263417, 0x09607C65, 0xA877F109, 0xBB43CFF1, -0x4A190DB2, 0x9B7BD38F, 0xAEB7C449, 0x3DB3A460, -0x7D928522, 0xD18AC966, 0x187FE766, 0x97629792, -0xF59D506E, 0x6FBA202C, 0x77035FF3, 0xDA068CDE, -0xE195779A, 0xAEB92298, 0xD2A44EDD, 0x12577D85, -0xA3B47B9E, 0x5BD07CB7, 0x4B6AE3FC, 0xBE35B6E2, -0x9D7F7AF2, 0x9A38EA75, 0xD87FB055, 0x3339F2A3, -0xD7CB82B4, 0x357721E4, 0xBEF46553, 0x9DE28CA3, -0x1B1EC2DF, 0xE29B9CC0, 0xEFAE347E, 0xE5864917, -0xA097B712, 0x6B67041E, 0x5B29542F, 0x01D96EED, -0xF9A6DC07, 0xC0B5E3F0, 0x21E1899C, 0xE9373A86, -0xF3176509, 0x950844A2, 0x7D24FFEB, 0x5DC0BCA0, -0xC442B7C1, 0x37DC6EC1, 0xC65C8BA5, 0x18F0FA85, -0x2AD80D2D, 0xC68CDCBB, 0x6AE5EC93, 0xE3955DBD, -0x3E80C4B3, 0x50FED127, 0x743CABC0, 0xD0E91707, -0x9BF7EB4B, 0x7A632755, 0x9A192482, 0x8F923E9E, -0xE2E70FE5, 0x5F50AA16, 0x0EC496D1, 0xC6EC4862, -0x040A0274, 0x2FC951C2, 0xF65D3A80, 0x8D585163, -0xC6B529D1, 0xD2CAEE6E, 0xE3E112B7, 0x3244312F, -0x1B393E58, 0x2444D538, 0xBE69AC21, 0xC92A0506, -0xD1A74434, 0x49C3EA05, 0x0E53B319, 0x3843CE03, -0x8DB8415E, 0x766B6FC7, 0x515B9E7A, 0x3BA05B32, -0xBFAFC449, 0x31302A57, 0x1960A211, 0x66A097E0, -0xBC65A9B4, 0x89E83065, 0x36FDBF2C, 0xDCD4664A, -0x0ED6CFBF, 0xDD4DC6DC, 0xD76D2F00, 0xB6DA6540, -0x9A396444, 0x28F185DE, 0xA0FEFA1D, 0xF476E0ED, -0xEF15505A, 0x183365BF, 0x481FFD90, 0x29ABEE75, -0x1EC90B07, 0xC10B2657, 0x0DBF6DDB, 0x52AD02B7, -0xE87DDB54, 0xD3704106, 0xD4E2C592, 0x0CB2DD05, -0x4BAA2FFB, 0x02611368, 0xD50F8F1C, 0x416FF25C, -0x9A69782D, 0x268C6474, 0x2ECD4D64, 0x196DE2F5, -0x47A8561C, 0x8C7CE6C9, 0xD2B1E2D2, 0xA038C165, -0x3AB8844B, 0x4A699830, 0x0FFC0B17, 0x89B685AA, -0xDA276D85, 0xE934C4CD, 0xF511226F, 0x9CDD2B1F, -0x94F75492, 0x55ECEB42, 0x42F0A3D3, 0xD7EB482C, -0xA78D0373, 0x62F088A6, 0x7ECF4602, 0x7A3404B6, -0x40B36495, 0x60441DF4, 0x6722F539, 0xCFE76C48, -0xB6B94C9F, 0x9ADB4B6A, 0x1EBBA65F, 0x5B5081AF, -0xB764423C, 0xB6F910E3, 0x14AC4B6F, 0x5C811E82, -0xAA36E5F1, 0x24EC82AF, 0xA2F1C050, 0x0504324C, -0x304CED0F, 0x01E31DD9, 0xC82EC7E6, 0xD55AFFF9, -0xFFB3047B, 0x3006F2E9, 0xC725BCD1, 0x7DCC1082, -0xA9A22CF8, 0x64D5AF9D, 0x389C34AD, 0x7DFF37C6, -0x41F1509D, 0x1845B3FE, 0x055C23F0, 0xC6291F5F, -0xCDD3C7DD, 0x5F0356B4, 0x7FD2C387, 0x494A091E, -0x50C69D3E, 0xFE769A5A, 0x63904701, 0x8960ABF2, -0xE68EDF3A, 0x0AB57C8E, 0x0B9D0A6C, 0x51888148, -0x50C5D533, 0xC69038FA, 0x3ACBE661, 0x0CAEB601, -0x8C14AB6C, 0xBA86D94F, 0x0724056B, 0x0FEFFCBA, -0x12449DDB, 0xABFFECCE, 0xB12A2BD7, 0x7260A0E8, -0xBE184A48, 0xCFD3CA3F, 0xDF088660, 0x78EE9B67, -0xA9EDB113, 0x4FD5D353, 0x8E348CC6, 0xD578C337, -0xF0493BE9, 0xCCFB54EC, 0x9CEEF85C, 0x0CAAE15E, -0x371AD12F, 0x9C5B9270, 0x2495F0DE, 0x06DE2DBB, -0x911AE7EC, 0xEEDE3363, 0x6DD38D6C, 0x2AF7F3D9, -0x51C8D118, 0xF23818A7, 0x95438AEA, 0x3A8A798F, -0x230D2BEF, 0x3D16273C, 0x9C36FF83, 0x785C9537, -0x3E42AF2F, 0x12A16741, 0xE58D0DC4, 0x33EBEFF9, -0x6F1972DA, 0x128C9BAA, 0x858D6032, 0xDAF185E1, -0xAE355065, 0xDE0086F3, 0x0F661A65, 0xF4334169, -0xB1559BA6, 0x3892109A, 0xE903BA00, 0xAE0CBD58, -0x073C21A0, 0xFCADB299, 0xB4E39AF1, 0x78475459, -0xB46DC847, 0xDBA97661, 0x15D118F5, 0x01ED48D0, -0x99F658BC, 0x399FDC8E, 0x44D4A919, 0x7C2CE4B9, -0xCA0367CC, 0xCC2B9828, 0x16AACAA6, 0x7AA5B6BA, -0xFEC77C66, 0x231B22F9, 0xC8BE0D04, 0x6FF2788C, -0x5F9CEBB5, 0x901EAA5D, 0xDE682BBF, 0x998E70D4, -0xBD9CCCDA, 0x6995441E, 0x5702F360, 0xBC035EED, -0x20F60B51, 0xD57361D8, 0xC071113B, 0x73CE6CE4, -0xC6569DC9, 0xD24B89ED, 0xA6052276, 0x8CEE2026, -0xFBF5B58E, 0xF692DF81, 0x6B7CDD7C, 0xF5B6C04C, -0xEC1BBA29, 0xD6AC8CDD, 0x320491F8, 0x1D812AC7, -0x631B0051, 0xD08A4D2A, 0x569746DD, 0xAA653FCF, -0xA92E8E70, 0xC59A6705, 0x278EA1FF, 0x63E5FA17, -0x1C20E82D, 0x550F7CE3, 0x55CED415, 0x5F9C4C4A, -0x7D746311, 0x5B07976A, 0x12477E31, 0xAB8113AA, -0x796EDCEA, 0x4A90E4B4, 0xB36E6188, 0xEE7D5E0F, -0x15CEA060, 0xB81AB2CA, 0x296D22B0, 0xFA0753E2, -0x0D0D15BB, 0xD4AF8BD7, 0x951FA575, 0xCBEBD58A, -0x0AF5C362, 0x9EF43FB0, 0xD97E5184, 0xA14469BC, -0xCAE5D55E, 0x93D4CDF9, 0x95B013A8, 0x6998F35C, -0xF1DDC0B1, 0x476F9FC7, 0xB6472B70, 0x1D55AC5C, -0xF0E0C0C8, 0x95372BF5, 0x75CCCDBE, 0x9F9D2003, -0xCAAD0D51, 0xEE54CC2E, 0xE5EBDBF0, 0x9B248BB3, -0x4BF07D19, 0x542997E9, 0x17447C4B, 0xCF2B2768, -0x86118A5B, 0x57579F12, 0xC5CD9E74, 0x97ED5724, -0x01BD2EE4, 0x2A0403A6, 0x01833741, 0xA1E8D364, -0x4D1A2EEA, 0x62760377, 0xA10D6861, 0x09C68E2F, -0xAB482850, 0xACD24B74, 0x5038C8CA, 0x71DE3A93, -0x671D25E4, 0x9EA7AC1A, 0x3E7287F5, 0x9FC963CF, -0x73F90AB6, 0xC775D840, 0x00B868D9, 0xF6A9BE3D, -0x17FFB472, 0x5D2389E3, 0x0D42A149, 0x2FAB1235, -0x90A7998E, 0xD895F6EE, 0x19921013, 0xEE42EA48, -0xC5D19A17, 0x5507890A, 0x9F893B29, 0x4FF39F19, -0xD6EF85AD, 0x3FFB1599, 0xF1761017, 0xFC51B90D, -0x8F6C566B, 0x44BAC7A4, 0x2B2E3755, 0xABECB8DB, -0x5C4A1629, 0x837CC4F7, 0x3E732B0A, 0x803CE303, -0x71865D8D, 0x346665AB, 0x58BF809B, 0x100626AA, -0x9446AB13, 0xD53ADCDA, 0x75C0BFCD, 0x95853304, -0xF4758E87, 0xD6B64517, 0x13293D0D, 0xEC9368FB, -0xD449A2CC, 0xAA17B0BE, 0x9D0B85C0, 0x77BEED16, -0x7699CAE7, 0xC776D10D, 0x962D48CE, 0x838D00BE, -0x279AEBF9, 0x22EF837B, 0x58E46DAD, 0xB56B6305, -0x3232D58B, 0x167969DB, 0x5B63F5B5, 0x7E82B175, -0x05DDB402, 0x5AB29BBA, 0xF3B627D5, 0x97168C85, -0xAD9EE022, 0x48F0CEEA, 0x84104C22, 0x690FCC19, -0xCA2F2474, 0x76F95539, 0x9FD2B987, 0x79EFC557, -0xCEE5DA4D, 0x27EB98F6, 0xA0628916, 0x8E05614F, -0x8AC89026, 0x7705135E, 0x3F7E42B8, 0x7BCD773B, -0xF98B9741, 0xCB8A514E, 0x9298220D, 0x5665FA3A, -0xE66A1FF7, 0xAC4ECB71, 0xA7E56FEF, 0x9D1EF7F8, -0x23566B64, 0xB4FE822E, 0x1AA53208, 0xF4545E5D, -0xEA86C879, 0x18F6B7C2, 0xE10A17AC, 0xBD37011F, -0xFBDF81B8, 0xA978A4EB, 0xD42437A7, 0x474E6A41, -0xF8885248, 0xF750BAA9, 0xD238EA62, 0xD69BA74D, -0x266EC6BF, 0xE7EDE077, 0xE8F0A303, 0x8B56A96D, -0x41380980, 0xDDF0B16C, 0x00E83594, 0xA503EBF5, -0x960A258E, 0x499827BD, 0x6C8E6F7B, 0x166C845D, -0xC842C934, 0xBAEFC699, 0xD9846213, 0x832EC19B, -0x1EAD7599, 0x221E7EE9, 0x8176A313, 0xB28D8E39, -0xBAC29A96, 0xB964F91F, 0x3F268150, 0xD4BB7011, -0x347EC445, 0x7FDC9E82, 0xEB70F4C9, 0xA6F38EBF, -0x398CF137, 0xD7F88CF5, 0xCBDDCB3F, 0xA0DAFA74, -0xD29D30AD, 0x822B6919, 0xCE059949, 0x3A946183, -0xDE4C572D, 0xD1E6D844, 0xC43C7DAC, 0xDBBEEDD0, -0xA656DF6D, 0x454C22A9, 0x9FA48790, 0x69B04531, -0x99BB305F, 0x80500F71, 0xFE2363C2, 0xB67F538F, -0x302EC0C3, 0x4A6E3458, 0x57E4CFD4, 0xE65CDAEB, -0xF31ABB31, 0x62DF98AC, 0x894AE781, 0xB1588AB1, -0x45D5CC3E, 0x3520F5B0, 0xC72D0CB7, 0xA1D6CBF9, -0x742FFA63, 0xA0A5224F, 0x5EA1C85A, 0xB81E9F77, -0x31D76C4F, 0x525257F5, 0xBFF85009, 0x2125B270, -0x16E47E6E, 0x9128B981, 0x0D5FBE39, 0xF67A418C, -0xCF3C71CB, 0xAC04ABE1, 0x9B550AAF, 0xB5077F18, -0xFB7C5EC0, 0x64784DB4, 0x1E668B48, 0x84659836, -0x604457BF, 0xF6F69C8D, 0x394301DC, 0xED0211BD, -0x8BAC1A3A, 0xBB752FD2, 0x78B8C036, 0xBCB98E8A, -0x33C595DE, 0xB3F3C5F8, 0x698666AC, 0xA1F42D7A, -0x5751ACC8, 0xC069575B, 0x35D50F99, 0xB294BF38, -0x82A4A331, 0x05147751, 0xCAE18C12, 0x9E89AAF1, -0x3531C372, 0xB2114A88, 0x41797201, 0xDDDDEC10, -0x01185F2A, 0xDED50CDC, 0x72156BAD, 0x88F3DB94, -0x50450DDF, 0x6B1E7ABF, 0x3D317708, 0xFDFF5A15, -0xDC8B1697, 0xCC2248FD, 0xD9196272, 0x4445195D, -0x54D90281, 0x7A891C9D, 0x69FF98D5, 0xADE6D74B, -0x26D27973, 0x0F14734F, 0x3F957FC8, 0x812AC874, -0xEDC0F9B4, 0xD31D6D75, 0x7A2608C3, 0xD89984B1, -0xF581081A, 0xEDB9DF6F, 0x16ECC191, 0x6B945724, -0x1BCE8269, 0x02E6DB68, 0x56362541, 0x9D247CF4, -0xA5265E72, 0x2C8B9413, 0x1157DB4B, 0x3145CFB2, -0xFBDEBCF5, 0x1042B117, 0x284DAE18, 0x10575C21, -0x1DDE578E, 0x80F59EDE, 0xCAB51C04, 0xB594BDA8, -0x08ACEF85, 0x08C8D4C7, 0x7304D433, 0xE87D3A88, -0x31CCFED8, 0x1D8E71E5, 0xC5A2F02C, 0xACBF3B5E, -0xAA161BCA, 0xA10BE577, 0xF9CE41D2, 0x2B86F031, -0x3D4A8D23, 0xED926DE4, 0x3844E21F, 0xFE57BCD0, -0x36DC309D, 0x17137409, 0x9F6A8507, 0x14CF12EB, -0xA770AFB5, 0x7C6DA2E4, 0x856B48B8, 0x2EA235DF, -0x55BD1164, 0x5BD9FF0C, 0x5228C552, 0x9E719AFA, -0x3EC3703B, 0xE06A94F3, 0x296FF0D9, 0xE468D9C9, -0xD2A15CDC, 0x6C4EAAA2, 0x2AF3B8BF, 0x6B6EDC78, -0x42B78972, 0x4C97A66C, 0x161C30BF, 0xCD2816DC, -0x431BDA17, 0xD9653022, 0x67D95E39, 0xBCB18342, -0x227982E7, 0x23C5B11B, 0x514420AB, 0x089F3A5C, -0x2B2F8244, 0x2F2A80C8, 0xB0A90558, 0x75BAA243, -0xE2FC4F62, 0xEB0A6104, 0xB7F221B2, 0x4ECD79DF, -0xB3E08B8B, 0xBA25E1CB, 0xD39F3431, 0xB50202FE, -0x78F15ECE, 0xEFF61ECF, 0xB3CDDD50, 0x3FD064A8, -0x96B028BC, 0xB29DD4E1, 0x7E9EC629, 0xC407F4D1, -0x8C21785B, 0xE11767BA, 0xCFE6DE26, 0x0DA98E22, -0x33AC5670, 0x0FDBC175, 0xF11F8EF5, 0x60638843, -0x8B67E55A, 0x3F27F75B, 0x6691FB98, 0x635A35A9, -0xB317459C, 0xE7419C01, 0x8BAB28D7, 0xE347D791, -0xEFC019A0, 0x45009041, 0xA6DEB3E8, 0x6F7379FF, -0x0FF50390, 0x810BEE78, 0xAD13716B, 0xA7DBD7AB, -0xEF439D4B, 0xDDA744A5, 0x31EDDE8D, 0xA85B71F2, -0xDF439C70, 0xA7E3DA94, 0x525ED453, 0x3D913C32, -0xD104CE61, 0x42F5FFED, 0x14C7625A, 0x4E5B314B, -0xA7EAD1ED, 0xFA01D595, 0xE67BCF06, 0xE63685E2, -0x3A32E9D3, 0x374C25F0, 0xA8E8A41D, 0xA403AEF5, -0x901A194C, 0x17605BC9, 0x8522DD12, 0x27096BAA, -0x017434B7, 0x99C8D2DA, 0x7F96B068, 0x8521CD09, -0x529B46D6, 0x47852810, 0x021BC8BF, 0x93C98329, -0x6FE73A78, 0x44DB69A9, 0xC839D490, 0xCAC42AFE, -0xCF1ECCF4, 0x6F2E5F44, 0x795C8219, 0xA06C667B, -0x80411F31, 0xB09926E1, 0xC62B6C18, 0x77C6E6DD, -0x7622FC07, 0x02162DB2, 0x3EA31334, 0x6CC02B4A, -0xAA6B81C3, 0x4424A9A5, 0x26BD2EF3, 0x334896D6, -0xADDD2711, 0x76035757, 0x80AA328E, 0x2F39C06E, -0x357520CB, 0xF62BDF46, 0xC59343C4, 0x7CA4CAE2, -0x89B03EF3, 0x251A785B, 0xA4755BB9, 0x262D478D, -0x462E6252, 0x6B5F6BED, 0xCA46E77B, 0xA2CF08AD, -0x561E19EA, 0xBF31AA15, 0xD376F44C, 0xCC332150, -0x8C0AEE42, 0xC06D5F91, 0xDADF8613, 0xBE0FA22C, -0xF50AE482, 0xE3615501, 0xECC8D5AA, 0x58A7FD3E, -0xD59B8CC9, 0x09DB0987, 0xF1D9753D, 0x9C79E20E, -0x9A222AEA, 0xC4E58914, 0x6712E0A2, 0x8CD5C80E, -0xEAB8AA56, 0xDBFA8D9C, 0x3515BD21, 0xB65B9E0C, -0xF0D27FEE, 0xE33871C1, 0xEE8FE52F, 0x02ACCB3F, -0xE9197277, 0xB7B70770, 0xA26E3581, 0x82481E7F, -0x005AF99F, 0x8B970B4B, 0xEC74B662, 0x2F21C5A3, -0x049DBA83, 0x495B3E1B, 0x112234B8, 0x95B42A5F, -0x2C8FA833, 0x6D706E30, 0x2AAAEC09, 0xDE7C3377, -0x06CE9D46, 0x7574EAAB, 0xFCB1A08D, 0x462AFB6C, -0x192847B2, 0xCC149AC3, 0x427834CE, 0xE90180A0, -0x946E526E, 0x6018BE4E, 0x20442F52, 0x1D39FA05, -0x35F690AD, 0x29DB3A53, 0x6360158C, 0x3EC815F8, -0xDED650AF, 0xFA168B37, 0x233F8A3D, 0x245009CF, -0x71BB2237, 0x4989A01C, 0xD58AE4F1, 0x62C99EA0, -0x48E9056E, 0x7E1A786D, 0xBF6CBAAB, 0x22669A6B, -0x57857590, 0xE4558CE3, 0xBC6C63EC, 0x6AE02A61, -0xA2ABFBBB, 0xD2B2FE90, 0xDF8BDB43, 0xEC2D59AC, -0x7B6AFDC3, 0x6B001D5F, 0x3DFEE08F, 0xB9A597D6, -0x09DEAC68, 0xE42D9E73, 0x2E33507C, 0x6525F051, -0x0D7143C6, 0x01DD115B, 0x94180279, 0x28FC60D7, -0xC0900603, 0xED4FBE53, 0xFC0677BD, 0x7DA2A878, -0xA8D0EC73, 0xF6A09B2A, 0x24A129EE, 0x169BCA2F, -0xE0BAE526, 0x5C8E2FCB, 0xA218EFFA, 0x842B61FB, -0x87B860CD, 0x106E9B86, 0x930685F0, 0xC5A72109, -0xFB977BD5, 0x9D3B4AC6, 0xDA378FE0, 0x0AAF747B, -0x0408D50D, 0x488785B9, 0x81AE971D, 0x12ADFEF3, -0xF0B64128, 0x3D4C90BB, 0xC994AAA1, 0xB854400E, -0x901AE3DD, 0x7A4A0DE7, 0x18E07456, 0x20C38BCD, -0x94441976, 0xE2E419C2, 0xDBD3C92F, 0x4DD63841, -0xE2994959, 0xF41F196D, 0x0835431A, 0x93A2E9CF, -0xB01FABED, 0xD0135535, 0xEBCEA18D, 0xC4F83A1B, -0x5D72845C, 0x04335E3A, 0x68C4C987, 0x77178710, -0xC5293A9A, 0x44E40AE1, 0xCE454FDE, 0x71DE89B7, -0xA373D9D3, 0x6D19E483, 0x812896D6, 0xC3231C14, -0xE960ABA4, 0xB7FB6F83, 0x1F7C4EB8, 0xD10DBE69, -0x8575CF6E, 0xC03B15D5, 0x4D7F4EF3, 0xF0615F31, -0x34E21762, 0x22D5A7A1, 0x729FA3F8, 0x2E1050FB, -0x8A9F46DC, 0x535EB5A7, 0xD143560E, 0xF8EC3A4B, -0x2249FD06, 0xE8E2AB08, 0x1E734127, 0xBA5B635A, -0xD8F419DB, 0x0B5200D0, 0x8110304F, 0x3497DA80, -0x35CA71CD, 0x0FD8227E, 0x086C74E2, 0xAB68A1AF, -0xE3BD57EC, 0x83B42D29, 0x3C2D672D, 0x05D85CED, -0x64F04926, 0x91364A12, 0x7FC73349, 0xEBA1FC77, -0xECE0D20D, 0xB1DDDB9B, 0xEB6B492B, 0x0FC02BB6, -0x56201D76, 0xED20F79E, 0xFC6034FB, 0x6A539F1D, -0x520FECBF, 0x4E3AECF6, 0x76B01C74, 0xEFC421D4, -0x82AC989A, 0x407A77CD, 0x6D287BFE, 0x26617425, -0xEA2316C3, 0x8616554E, 0x9F4C4535, 0x88C0C6C1, -0xEAC4F0F7, 0x32C7DD93, 0x41D9C37E, 0x2A9CBB2E, -0x0591BAEF, 0x2BE43F21, 0x5E06EE4D, 0xDDDF5525, -0xEC137DBE, 0xF0AA295C, 0xF2C9FDE2, 0x5DF9D693, -0x10A6CAC0, 0xC6846D09, 0xF1DDABF3, 0xD56F8BBC, -0xAA5DCE9D, 0x6F59004F, 0xB8A035BC, 0x61F47282, -0xC89DAC9E, 0xFC7E5B3D, 0x4C5406DD, 0x54CFD147, -0xBB44AB2A, 0x791269C0, 0x8CF66B4D, 0xD01A3190, -0x636F45CA, 0xB32FC209, 0xCB8B9F49, 0xF46D74B9, -0x5AFC9BD0, 0xC4C716C1, 0xF98C54F3, 0x36AFF013, -0xB4D6D90B, 0x5F1299B6, 0xA3BFCFA4, 0xEA336AAD, -0xCCD443DA, 0x74CA40B4, 0x31EF1614, 0x36D3FFEE, -0x876AE252, 0xC8D62E9F, 0x6424F397, 0x1F730F2D, -0xB20FDA53, 0xFCFEE60F, 0x676A61C3, 0x26C5E143, -0xC201573E, 0x4A8C46BE, 0xEF87D0A9, 0xE07E80B4, -0x34F20109, 0x8B936A70, 0x9F8E0305, 0xF3297CA0, -0x4E7BF0E9, 0x0F374BB9, 0xCE78A01E, 0x5FE26DD8, -0xA3826ACF, 0x321F69AB, 0x441AF14E, 0x8AC19CF7, -0x4BFD1AD6, 0x5951ABD1, 0x098C17F0, 0xA9B75F76, -0xA462551B, 0x6B703A12, 0xEDCB57B2, 0x8CD4C933, -0xD338D3D8, 0xE343FC24, 0x9CDD52EB, 0x17A41942, -0x63A8EF50, 0x215BB11A, 0xE1E25CB6, 0xB62C0A88, -0xE58CDEC3, 0xC0E6389A, 0x2B7BEE55, 0xA3FCBD07, -0x7CD451FE, 0xB06F6724, 0x5675A7EA, 0x141D52FC, -0x05E86E9B, 0x53D75C3A, 0xE799AA2A, 0xE474384C, -0x8C85E6E6, 0xA477A8D7, 0xA1E6AB0C, 0x9033E7CD, -0x2F55D504, 0x4DAE81FB, 0xBD229A64, 0x862765C9, -0x5B6A85F0, 0x95A39328, 0x38826CFB, 0xBF7DEBA4, -0x42EFAB62, 0x2D0BBA60, 0xB06731AF, 0x16D4C4B0, -0xCA4B9264, 0x3DF24AE2, 0xFED93848, 0x7CB33B08, -0xAC9CAE9F, 0xA0F80B61, 0xA66CF713, 0x9364865F, -0xDFA1E0B3, 0xFE6DF33F, 0x8039A612, 0x119F60BF, -0xCEEDE309, 0xD28316A8, 0xCD61D2F5, 0x3CBEB015, -0x85C0BF51, 0x6EDBBC15, 0x79F3D207, 0x485EE4FA, -0xCEC302EA, 0x59D8B92D, 0x51C1FB36, 0xF4FE8B71, -0x2DBD5718, 0x84024040, 0xFDD6590F, 0xA1CE9CC9, -0xC4AEAB72, 0x0A2FE8BF, 0x28C33618, 0xBA4E15FB, -0xA9C72819, 0xA3EE45D7, 0xD2DC52F1, 0x3FC84A2E, -0x1C9DF73E, 0x632F9BDE, 0x7E9FBD20, 0x0D689B79, -0x91E8D5C0, 0x6EE7952C, 0x905F192E, 0x2D79E712, -0x8670A7A2, 0x1DBFC4D9, 0x64634429, 0xE636043B, -0x643C6B0F, 0x50AF327B, 0x0E734D61, 0x2D7D6E46, -0xB877DCD6, 0x7CCF4F1A, 0xDF4D8CF8, 0x0E7FA78E, -0x0CBC4EC2, 0xAE9B4A22, 0x4F02D49C, 0x48F09C43, -0x5031B1A0, 0xDCB8A1FC, 0x91C73599, 0xCF00A64D, -0xDFCE561E, 0x8B18157D, 0xE1ED6A81, 0xCF94EF36, -0xB412CE1A, 0x602E2076, 0x716B0F3F, 0xADEB32C0, -0xD4E16094, 0xEC95D41F, 0x75858767, 0x438AD1A1, -0xE61C5527, 0x0D71FBB2, 0x2A99D070, 0x5C018826, -0xCCCC27FD, 0x053883D9, 0xF1D30EF5, 0x676AD38A, -0xDF81AB28, 0x2257FB9D, 0x373313AE, 0x67E1FE8A, -0xF4F66B02, 0xAFF8C7FA, 0x3B60D94D, 0xD44D0FE2, -0x5FCDFE4B, 0xC63010B6, 0x06CFCCF4, 0x09D8DD85, -0xAB79F2BE, 0xD5C0C498, 0x7364E4FD, 0xB295CEDF, -0xDB89A068, 0x59A6A0C7, 0x0C823207, 0x7380FCFE, -0x6E33C4B9, 0x0744E4F2, 0xF663BB33, 0x9EE512CE, -0x870ED35B, 0xB4502654, 0x367CD4FD, 0x5D4238D9, -0xEAB2B86E, 0x6E8ADDAA, 0xF080EDD6, 0x1DC90F46, -0xB1FC9127, 0x63771392, 0x96729BF6, 0xD18E1413, -0x5D85938D, 0xB8CED349, 0xF9B886C1, 0xCA486562, -0xBAA9ED7A, 0x049718D8, 0x7CF8E67A, 0x1702843C, -0x6DCDC34E, 0x93C51F83, 0x2415A4F3, 0xA8D77B3A, -0x0FB823E8, 0x424F03C3, 0x9CAA503C, 0x7AA5433F, -0x3BDD74FE, 0x99D3332E, 0x1E62231B, 0x90A4E595, -0x7EDA974D, 0x43E2CD14, 0x27DB9D9F, 0x561F5CC6, -0xA77EABA6, 0x97867B48, 0xAD6533CE, 0xEB726CF4, -0x5857B217, 0x2D7DA10B, 0xD939C20E, 0x81F1F073, -0xF42DEAF2, 0x3AD7780E, 0x88C77661, 0xD2E819B2, -0xF872F581, 0x999F0C5A, 0x3887ABA4, 0x27F95B6D, -0x991D9458, 0x9D1BB131, 0x6ECC5298, 0x9E9A7B26, -0x6E65F271, 0xE90FA04C, 0x7B692AA0, 0x878943D5, -0x924895E5, 0x041BC73A, 0x448E28B2, 0x61D22D1F, -0xE7969773, 0xBC8E5980, 0x9A198852, 0xB94415C9, -0xA02374BA, 0x340BD5F3, 0x27F2A0FF, 0x39BDB33F, -0xCC042BCF, 0x83D6C135, 0x9C7A8D8E, 0x05823C23, -0x2D7A3F91, 0xE792BCCA, 0xA2D82177, 0x73C82E7E, -0xBEBC9613, 0x9F596CB0, 0x6E784AA7, 0x1B7BDA9F, -0x846391F7, 0x852AD070, 0xF831E8CA, 0x16A78223, -0xF68F5250, 0xE2554493, 0xD38F2AFB, 0x764BA7A8, -0x3CAEFC55, 0x6E9B9037, 0xD87D486E, 0x7352AEA9, -0x11987EE0, 0xDF7E84DA, 0x2838E736, 0xA8C7BAC2, -0xF49E21EE, 0xFAD106E9, 0x7363AC6F, 0x5E9974CB, -0xBA008BB0, 0xAF5DB3FC, 0x7AC3CFD7, 0x2D55EDC6, -0x2C1C9AD7, 0x6A3AA494, 0x5F0E0A3A, 0x37422BFA, -0x83B4D594, 0xB7ECCF66, 0x82FCCDD0, 0x8ECBFD79, -0x664B9341, 0x02F178A2, 0x2095C8E0, 0xFC5F17B7, -0x1810BA9B, 0x964E4CD1, 0xFBAED808, 0xDEE87796, -0x63DE4F69, 0xC99275DD, 0x65242304, 0x7AB5C28B, -0x01BB7A3B, 0xC85D7716, 0x32AFB9A3, 0x2ED2CBB1, -0xB194218F, 0x21FE560D, 0xCB4503A5, 0x5CE0464D, -0xC4AE9A3C, 0x061530CB, 0xEDA38E6B, 0x4029D3E6, -0xB0C20336, 0xA37825C0, 0xC68F8B37, 0x9405AD3B, -0x8B1A8F99, 0xA761DE8B, 0x683B3259, 0xA154C554, -0x6BD835C9, 0x6DEAE35A, 0xBEAE6D49, 0x21D8B074, -0x46C01B31, 0xBE9B3A16, 0x1D611EAA, 0x423AB74C, -0x931F5AF5, 0xBB9E289A, 0xA4101132, 0x4A8BE0D7, -0x3307E4B2, 0xDE78DB5E, 0x347EB5CE, 0x13EEE999, -0x2C2D7955, 0xBA893EBA, 0x5DFC2EC1, 0xE7DD7A5F, -0x5E1C64D8, 0x4552E447, 0x1837D8E4, 0x9711836B, -0x3219F893, 0x04392C84, 0x3E94848C, 0x15E5F481, -0x0EC58819, 0x7341D458, 0x4AE63711, 0x85C1FD1F, -0x97B58BD7, 0xB0550EBE, 0xB9108743, 0x6F53B386, -0x7A73F31B, 0xE07CF8B9, 0x61FF27C8, 0x06A9A8B4, -0xEB0F2BB9, 0x46D275FB, 0xCF39B474, 0xC34F3B6D, -0x52F2F119, 0xD87963BF, 0xC60BF16C, 0x7797D0AD, -0x7EA4DBF0, 0xD21409C7, 0xF678A927, 0x638E67CD, -0x93261AED, 0xEA9B25FE, 0x1EBCAFDC, 0x580CC829, -0x58D1DA1A, 0x658881F8, 0xC48DB682, 0xD42E8CB4, -0x1DF33D74, 0x31C04F68, 0x7D871E29, 0xAE11FD72, -0xD7E8F8F6, 0x530D9D9C, 0x580A0715, 0x0F17B1A3, -0xB863F42F, 0xA6A4DC08, 0x82773E76, 0x9354B309, -0xE17D0770, 0x04E4DE5B, 0x712EA396, 0x49D37B55, -0xAE4109BA, 0x03862DC9, 0x7BCF61D2, 0x43CA2017, -0x23BDD50F, 0x74577459, 0x4E8F4E23, 0xBF924C1A, -0xE4EC70CE, 0x37FBEC66, 0xA6DA8935, 0xE11F4090, -0x5C8F9EE3, 0x19D167EC, 0x9EE4F2C5, 0x64A81E6C, -0xB35642BB, 0x82083A01, 0x001CA1F6, 0xAA69C7E8, -0x685F24D9, 0xE6868E31, 0x38ADD8F0, 0xA2FDD44E, -0xEE0C491D, 0xC60B1E9A, 0xF7A89268, 0xFD784F35, -0xC6B7335C, 0x75EFCEC1, 0xE2D9F7CF, 0xE1C364F8, -0x7CC63B2C, 0xC179E2AD, 0x56C193A5, 0x5134FB69, -0x35058BB5, 0x36F4BCD5, 0xDF4A08C2, 0x14AA2330, -0x760C8CD8, 0x2C562394, 0x0BEB669B, 0x2301973A, -0xAF5C4FF2, 0x1C770AAB, 0x25DD2087, 0x732AADC4, -0x59054958, 0x59DDCBE4, 0x74CFC8A8, 0x7C015016, -0x32A0276E, 0x8F1C2E93, 0x0CE91F71, 0x055C307A, -0x435D967E, 0xF4C33704, 0x5BDF2AD7, 0x8855099C, -0x307B2736, 0xBB6B19CB, 0x626349D3, 0x8F52ABFA, -0x251A1ED6, 0xE0587BC0, 0x12831408, 0xDA83CABF, -0xAB2C7DFD, 0x6BCF0271, 0x72058DF0, 0x17AFC1DD, -0xFFC52C30, 0x551401E0, 0x9EED54DF, 0x14E951E4, -0x14624B3F, 0x4C24650B, 0x5A65F86B, 0xE94F6143, -0xDC7CE9CF, 0x94D5D8F3, 0x093B0A04, 0x22098D01, -0xEDF09E7C, 0x165EDB0F, 0xD09CA774, 0xB96AA141, -0xB5745978, 0x9D820434, 0x42B0E026, 0x96938A25, -0x72E8634B, 0xBE36EC02, 0x42F3F74B, 0x358FA621, -0xBD451484, 0xB43A75D1, 0xB0A57F91, 0x701A7C82, -0x484B3F46, 0x047F78AD, 0x65F7371C, 0xEAC8A954, -0xE59F6354, 0x3EEEFB4E, 0xF131954B, 0x1C00BAC2, -0xE3897637, 0x5FEC83AB, 0x58CFA2C4, 0x1F4C0A6A, -0x97956BC6, 0x63D11D7D, 0xB46179D0, 0x11039A75, -0x1B50E088, 0x68E9476B, 0xAA68DB55, 0x8A4A051E, -0xEFA0DDF5, 0x05A2A674, 0xFFE03E72, 0xC5A0295C, -0x6FD4D834, 0x8E42BB94, 0xF3DFD88E, 0xBA691AD2, -0x3458473E, 0x6269A348, 0x72962FB6, 0x86D5064B, -0x8A153740, 0x54AC97D8, 0xED2CE057, 0x68200474, -0xBBA8E19D, 0xBFDD08F3, 0xB0DF76D1, 0x62F29649, -0x5AB77030, 0x1EE9A00E, 0x7DAB1C90, 0xAB608FFD, -0x8506A853, 0x75B9339B, 0x1AE0CCBA, 0xFB60BB79, -0x8650F92F, 0x4819E1F7, 0x0A7045A8, 0xB5BCE5F1, -0x77A98B27, 0x03DE21E4, 0x3FE3F132, 0x106827EC, -0xD4DC1469, 0xAAC82F9B, 0x1D5953A1, 0x8034B369, -0xD4412B6F, 0x90FB9F25, 0x14279070, 0x6D98AF1C, -0x3D286F37, 0x8324A732, 0x58123E4E, 0xEB051032, -0xC15CD557, 0xEB82DE99, 0x6213434E, 0x39F0FC9C, -0x5EBFE1C5, 0x8CEBF470, 0xFF7D8D8A, 0x740A6A3E, -0x720D080C, 0xB73B74FA, 0x5173F96E, 0x9FC01794, -0xDABF1C81, 0xCA813295, 0xBEA2DB8D, 0x4C7E0CE4, -0x8051BA67, 0xE63399E2, 0x83A15EE4, 0x47F4A718, -0xD8246E6A, 0x0B4F87BE, 0x031648B8, 0x99E3E3E6, -0x4ABCC64F, 0x52768181, 0xE708372B, 0x2D0B1D2C, -0x4DF52402, 0x389BE9F6, 0xDE2F3232, 0x5D43D74E, -0xD37BB898, 0xE7272645, 0x9B5432DA, 0x9D7A9473, -0xA69628A5, 0x583555A7, 0x255B08BD, 0xAD68EAE3, -0x1A79982D, 0xACE09726, 0x15E576AD, 0x260EB406, -0xA7440B46, 0x66B6D317, 0xBE6ECA3B, 0x3ADEA1C1, -0xD80399C3, 0x0EF198D0, 0xFAEE2010, 0xEF2E8E56, -0x5B6CC402, 0x3FD27BE2, 0x970AAB5F, 0x618C17C6, -0x7F5022FB, 0x552FC1FA, 0x5DD82984, 0x09769539, -0x98812D1F, 0xBD8B2539, 0xD78AD9A6, 0x1CE41D07, -0x272A0AB7, 0x5CB7E101, 0x6F42D56A, 0x001D930E, -0x3C17C305, 0x30AAE354, 0x2A4AABE0, 0x922BCB94, -0x73F34C1C, 0xE07E1501, 0xCB55A3E1, 0x0CDC3669, -0xD9C07DE7, 0x2DAB82BF, 0x963EACAA, 0x9B05E0F1, -0xE2DA0EFA, 0x0613BFE5, 0xDFB605E9, 0x5DCCA8FD, -0x6D433873, 0x81A9B4C5, 0xD1D1CB14, 0x9B6A9906, -0xC104767C, 0x30101D37, 0x186FBB79, 0x8F95D488, -0xA3094F43, 0x7F17C981, 0xFD92B3FE, 0xADAB3AB5, -0x20D1406C, 0x9462C8E7, 0x5D64819D, 0xB3E85196, -0x67B854FE, 0x7D039FC6, 0xAD98A85E, 0xF672E041, -0x30FA19A9, 0x4A276EB8, 0xB7041D2E, 0x57BB21E2, -0x4E251667, 0x15C5401E, 0xDAB59431, 0xD6C6FD1F, -0x1726EB70, 0x900F4E84, 0xD327DE33, 0x7A0AE04B, -0x76B1174E, 0xFD547B94, 0x370832DC, 0xDDE65CDD, -0x74672C02, 0x164703FE, 0x34CAD31F, 0x3E692DED, -0x4BC38FA5, 0x143F99E5, 0x61BB640E, 0xB957BC8D, -0xC9DD9E35, 0x2B5CB310, 0xADD6EAD0, 0x91981D46, -0xED803D57, 0x61D7737C, 0x92D3AC3E, 0x36A034CB, -0xE1395DC5, 0x5F2070F8, 0xC5EE9F8A, 0x70546B88, -0xC9EA230C, 0x58DC3073, 0x57CBBEB7, 0xA0B78CFE, -0x0B3FE75B, 0x07ADACCD, 0xC292C338, 0xD70CD7E5, -0x729D8F4E, 0x218FA041, 0x10EC1199, 0xAC1EC51D, -0x5DECC8D1, 0xBA36230A, 0xBC41F5A5, 0x75864896, -0xB4403D4A, 0xFEEE8F44, 0x8D94A256, 0x62BA0115, -0x3A570C61, 0x9221C583, 0xD2981A6B, 0xFD8AAF5A, -0x2A102D59, 0x64083BDD, 0xBD1AADE6, 0x7E6D1E99, -0x20568A6D, 0x8DFA704B, 0x87D27122, 0x2EFDAB7D, -0xF3AF9D39, 0xD8DED0B2, 0x2D4B34B9, 0x12F3E32C, -0xA6BCBE65, 0x680029A1, 0x094B07B3, 0xDA5918ED, -0xF7D0A86D, 0x1A7E18C8, 0x9285A97F, 0x2040282C, -0x5B133531, 0xA48237AC, 0x3557BC1B, 0x7E6ED77B, -0x436234C7, 0x9B2094DE, 0x5D967593, 0x8867D1C4, -0x88EC3948, 0xE7F84AD4, 0x1871B3E6, 0xE8E992C6, -0xA16DC2F8, 0x0DFDF590, 0x9B56238D, 0x329017F5, -0xBF9BD409, 0x68BD9B1C, 0x4036C4FF, 0x3BF6D93C, -0xAE100602, 0x90B43508, 0xA85B4013, 0x2C66EA54, -0x227D32D7, 0x0BA526D1, 0x075213B8, 0x1A3DED07, -0xD458DFFD, 0xDC8ACD43, 0xAC7809AB, 0x2D25408A, -0xD8F0C887, 0xAD8CD30D, 0x4054F61E, 0xA9F0CCA3, -0xBFEBD31D, 0x6D2BAB1E, 0xF8E42D8B, 0x6C94A4E4, -0x1158D2A3, 0x93F44EFE, 0x8AD05A25, 0x8C229D32, -0xB213D76E, 0xDFE63822, 0x561986EC, 0x806CA082, -0x6DB3BF8D, 0x1E850D30, 0x8F7A44C0, 0x75BB3328, -0x86C7BE12, 0xDE5C44BD, 0xDF4D048E, 0x968712C3, -0xB1B41CF8, 0xCC194FE9, 0xDA2E1A8D, 0x72A08662, -0x5ABA2536, 0x223E2013, 0xA5A923A5, 0x7565B5DD, -0xBCA0A2B0, 0x0C29864B, 0xAAD8CB87, 0xE4C7E559, -0x77E19E51, 0x194E54ED, 0x54DD1B54, 0x0FAD37A7, -0x0EF6B0E3, 0x0E3A2FC8, 0xA0063995, 0xE17AE20E, -0xDC11B7F8, 0x85F1A76D, 0xD97858D4, 0xB763E49C, -0xB5BE7EC4, 0x3CE924C4, 0x4246019D, 0xD33DBB27, -0x737863A7, 0x32C26BDD, 0x714897A3, 0x36091018, -0xF26BC990, 0xDDB640B0, 0x448F5B12, 0xD7A5EB4B, -0x5614EEA4, 0xCA4912FB, 0x011F9D6C, 0xA4FC90AB, -0x9FB4982D, 0x20AD146F, 0x4B7AB74E, 0x107A9411, -0x71DBA90A, 0xD510E3D2, 0x248D0D35, 0xB666229E, -0x61EE1EEA, 0x702031B5, 0x36992A7B, 0xC90C08CB, -0x6478995A, 0xE6C2BA7A, 0x8A9179AC, 0xC8EE2956, -0x27B042C8, 0x48DB81D9, 0xAA39F2CB, 0x5E4D5F3C, -0x24FFD6B9, 0x5B562C2F, 0x00FD33B6, 0x435F5F52, -0xF392FFC1, 0x0E927C40, 0x5508CBAB, 0x976AA567, -0xA13E7C52, 0x532109E9, 0x16B9021F, 0x60C615A1, -0x1D23C258, 0xFD783147, 0x63600FB1, 0xAAA245F0, -0x9B3DC1E1, 0x7B270D0D, 0x5B1632CE, 0x8B871F7F, -0xC535EFF8, 0x73109C6A, 0xEB83D02D, 0xF7AE76FB, -0x2E39E502, 0xA4128216, 0xF90D57E5, 0xFF0C465E, -0x02008029, 0xE5CBBA1F, 0x4280FA3C, 0xCDBD75C8, -0xCB4AF342, 0x17695A4E, 0xAA6162B5, 0x8660A679, -0xD1A8701C, 0x47694CA7, 0xDA8D43FD, 0x44A4BC1B, -0xAB34B9AA, 0xE55563DD, 0x08D4142B, 0x81197AC8, -0x997B1DC2, 0x2E7CC50A, 0x7A326A21, 0xA76419DB, -0xEA8B5428, 0x65729140, 0x051DAF66, 0x8871BCA9, -0xA175E5BF, 0x60310C98, 0xB7DE8929, 0x35E2459E, -0x08EB4547, 0x904D7B2B, 0x29382CC4, 0xCEC8664E, -0x1E8C9C2C, 0x3B942134, 0x9CEC5D55, 0xDA548376, -0x2E4EFD61, 0x26F65F09, 0x5A3DD7CA, 0x2FD4E58D, -0x6B71B8C2, 0x13189115, 0x2B5542BA, 0x1CE85C2C, -0x5B9FE09D, 0x68704BFE, 0xB15313B9, 0x3EF2729E, -0x583ECC31, 0xA3DED8CA, 0xFCD27C3D, 0x904DAB39, -0xFE1069A4, 0xE99A57BA, 0x112EB80C, 0xE1483C74, -0x8A27B0D7, 0xA58F7325, 0x7CD050A1, 0x626D4F3E, -0x51643657, 0xA967FC59, 0x5BACBC0B, 0x2CF3E459, -0x7D8988D9, 0x53913DF8, 0x2381A6FC, 0x64D6D441, -0x48AE9101, 0x185D9539, 0x1B044AEC, 0xB5ABCEDD, -0xFA8ECA52, 0x8CCDD142, 0x96FD4442, 0xD865FEDF, -0xCE4EE2FA, 0xA5160AE9, 0xC91B2B3A, 0xF993F45F, -0x1509132C, 0x920ECC5F, 0xD813DDC1, 0x834B68E4, -0xD5E876A0, 0x61DE0E41, 0x4C143913, 0xC7293985, -0x17E226E7, 0x38830927, 0xDC604DF2, 0x799D1430, -0x846585AB, 0xE5D21E38, 0x6381D136, 0x1B60633B, -0x23B7AE14, 0x554E53CC, 0x5807A210, 0x30560866, -0x12F79E62, 0xE27B5D45, 0x3889C1E5, 0x47F845FF, -0xFFD9DE98, 0xB10E09D2, 0x4A184A72, 0x083D2971, -0x8AB7478D, 0x92380377, 0x57A724EC, 0xBBBD5CA6, -0xE2FB9D32, 0xAB6ADFC6, 0x3916DED4, 0x4E19438F, -0xE21E15CF, 0x6AF4BCC9, 0x8D08924A, 0x1662BAA9, -0x3064AD27, 0xB86D7EE4, 0x88624C62, 0x1A0BF3E7, -0xF3E4A287, 0x6787F006, 0x01375D4B, 0x998BB38F, -0x6D669A29, 0xD760B093, 0xC4768853, 0xF041100F, -0x35DE10DD, 0xE06C8BB8, 0x2C79A902, 0x60600DAD, -0x6E11CF5C, 0x18778777, 0x7CCE406C, 0xE54AF2EA, -0x7472C475, 0x73DBEE7E, 0xE533DC40, 0xB07407DD, -0xF6ACA8D3, 0xE71BD7D1, 0x4BD3514D, 0xC5C362CA, -0x0690E5A1, 0x0FFDC8D8, 0x58188645, 0x8636413C, -0x3412A033, 0xAF4FC340, 0xA5DFEAB8, 0xB87272E3, -0xA4A9219F, 0x29696E90, 0x35D2F627, 0x8794DBD7, -0x5D2D87F8, 0xFA73559D, 0x7D22F440, 0xF50197E9, -0xEB74B829, 0x8F9649CF, 0x16F47D30, 0x5C7D9870, -0x36FF6C0B, 0x313A92ED, 0x303B3654, 0xE3E33CCA, -0x02C26ECC, 0x26949920, 0x4445DF20, 0x01FDBC98, -0x49138C6F, 0x1B5555E2, 0x122B45D2, 0x4B2E0202, -0x7B6014D4, 0xFAE0CD09, 0x77E165A0, 0xFBE76980, -0xF5808BD3, 0xFD110E5E, 0x97450E11, 0x297F9B1F, -0x607A2C41, 0xE384DFC9, 0x25D9A8DC, 0xF919D955, -0x5E025993, 0xCC318847, 0x9717D2D5, 0x48F0DD1F, -0x6CC4A8EB, 0x9BD0F4E1, 0x506F2A93, 0x18B8748E, -0x16FFBA48, 0x552E4955, 0xB963F64F, 0xA1A34AC8, -0x62E95CC7, 0x4D87EA89, 0x21E8C031, 0xC1F0ED07, -0x28B7BB22, 0x0B838D04, 0x6361B440, 0xA653521C, -0x92DA3F78, 0x4241CFED, 0xFAFCBD41, 0x3EFAB6BC, -0x25F30607, 0x41BB70DA, 0x9FF3440A, 0x2502039E, -0x3813EC82, 0xC6A4FD6B, 0xF8537C8C, 0x098ED49F, -0xE0A0BD6E, 0x6BA2F2B3, 0xC35C9D9D, 0x1256E66A, -0x790B2490, 0xD5C69889, 0x39E712FE, 0xCF73DE0B, -0x41B3B614, 0x745ABD73, 0x654C79D8, 0x5B15923D, -0x8C15F218, 0x585CCCF0, 0x624F7B44, 0x76BDDFDB, -0x96F26B52, 0xE13058A1, 0x086C950E, 0x29519DEA, -0xA42CFE04, 0x0D7A190B, 0xD0678C6A, 0xABB78679, -0xBA48A2E4, 0x5F3DA10A, 0x11F04183, 0xAC720A3F, -0x6A807781, 0x6F146BFB, 0xE8A67934, 0x54578834, -0xAA60C8F0, 0x2061A1E6, 0x9E87799B, 0x68D91F86, -0x8974F540, 0xB1C3F101, 0x99C21E56, 0xB57BA73F, -0x8B2DAA3E, 0xF1E2D24E, 0x48F7D4EE, 0x7039FDB3, -0xC666EEDC, 0x251F972E, 0x4D53F6BF, 0x6CC73EE7, -0xCB07F7B9, 0x69ECB8CA, 0x363FD80C, 0x3B587AB3, -0x738C1E5C, 0x5C9C1D92, 0xE7B52396, 0xEDE6324B, -0xFE5B5045, 0xC90D8B3E, 0x371A0128, 0xF2C8DCF8, -0x5B648CB5, 0x12F8E8FF, 0x5FE4BA71, 0xB925CFBE, -0x7416E14F, 0x76489FFE, 0x1F4DE367, 0xA400F039, -0x66390E83, 0x1AE79CEC, 0xDB573E98, 0xB6021F29, -0xD01615E5, 0x02A2281F, 0xE85019C1, 0x027BB41F, -0x8D9177C3, 0x79026E78, 0xF158B623, 0xBEFF5858, -0x7B63518E, 0x8F42C08C, 0xB388227D, 0x940D607A, -0xA4C79541, 0x9800CC91, 0xA356B535, 0x285BABB9, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xE411E520, 0xA0024528, 0x442B4428, 0x96070009, -0x46106246, 0x8FFB2522, 0xD4027504, 0x0009AFF5, -0x00000FB3, 0x00200004, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x16D49357, -0x0009000B, 0x4F222FE6, 0xDE947FFC, 0xE114D594, -0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769, -0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F, -0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B, -0x0009B00D, 0xE60095AC, 0xC84060E2, 0x2F028F03, -0x8FF93652, 0x7F047601, 0xA05A4F26, 0x4F226EF6, -0x410BD185, 0xD4850009, 0x0009440B, 0x450BD584, -0xD7840009, 0xD284E1FF, 0x2712611D, 0xD4835029, -0xE1FFCB01, 0x1209E501, 0x12112212, 0xE7202452, -0x4718D57F, 0x2572D27F, 0xD17FE700, 0xD680D47F, -0xE2012270, 0x24702172, 0xD67E2620, 0x2641E4FF, -0xD57DE600, 0x666DE104, 0x76016063, 0x4000626D, -0x8FF83212, 0xD5790545, 0x2520E201, 0xD279D778, -0x2710E100, 0xE5802212, 0x655C6613, 0x666DD476, -0x76046763, 0x374C626D, 0x8FF83253, 0xD4732712, -0xD573E101, 0xD6732410, 0x2542E400, 0xE03AE501, -0xD272D771, 0xE0390654, 0x27110654, 0x000B4F26, -0x7FC82211, 0xD76FD16E, 0xDC70DB6F, 0xD271DE70, -0xD572D471, 0x1F12D672, 0x1F76710C, 0x1FB877FC, -0x1FEA1FC9, 0x72041F2B, 0xDE6FDC6E, 0x1F13EB10, -0x1F511F44, 0x1F771F65, 0xD86C1F2C, 0xDD6DD96C, -0xD26DEA00, 0x89003A22, 0xD1587A01, 0x88016010, -0x56F98B03, 0x4218E201, 0xD1682622, 0x0009410B, -0x440BD467, 0xD5670009, 0x0009450B, 0x6010D14C, -0x8B108801, 0xE650D14B, 0x46186212, 0x8B083266, -0x56FAD147, 0x2120E200, 0xCB016062, 0x2602A003, -0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A, -0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801, -0x51F76792, 0x217252F6, 0xD6555191, 0x55FB2212, -0x52FC6462, 0x55612542, 0x2252E400, 0x61436643, -0x05DE6013, 0x36CC4608, 0x02DE2652, 0xC9036021, -0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C, -0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518, -0x60822C62, 0x89018801, 0x0009A168, 0x6272D742, -0x8B132228, 0xD726D541, 0x6552D441, 0x51436672, -0x316C365C, 0x27622668, 0x14138D05, 0x6262D63D, -0xB1A57201, 0xD61E2622, 0x2622E200, 0x52916692, -0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C, -0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000, -0x001E1015, 0x00201278, 0x002018A0, 0x00201922, -0x0020128C, 0x001C3510, 0x001C3624, 0x001E212C, -0x0020397C, 0x00203514, 0x00203984, 0x00203990, -0x0020399C, 0x002039F8, 0x002039FC, 0x002039A4, -0x002039A5, 0x002039A8, 0x00117700, 0x00203A12, -0x00203578, 0x001142D8, 0x00203A14, 0x00203A16, -0x001C3D30, 0x00117718, 0x001C3D00, 0x001C1000, -0x001C36F8, 0x00117734, 0x001C3684, 0x00117710, -0x001C3520, 0x00117600, 0x00117740, 0x001C1028, -0x0020358C, 0x002039AC, 0x7FFFFFFF, 0x00201734, -0x002032BE, 0x002022E8, 0x00203DC0, 0x002039FA, -0x00203584, 0x002039EC, 0x001C3D2C, 0x001C36B0, -0x0020351C, 0x0011775C, 0x8801C90F, 0xA0CF8901, -0xD17C0009, 0x36206212, 0xD47B8904, 0x2421E200, -0x2162A0CC, 0x6211D179, 0x89012228, 0x0009A0C3, -0xE202D775, 0x75016571, 0x3123615D, 0x27518D02, -0x0009A0BC, 0xD27255F2, 0x62226052, 0x40094019, -0xC90F4009, 0x8F19880A, 0x52F31F2D, 0x40196022, -0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009, -0x51F255F8, 0xE701CB01, 0x2502D263, 0xE1002172, -0x2211D564, 0x74016452, 0x2542A098, 0x8B3F8805, -0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802, -0xE5FFD45D, 0x655D6742, 0x8B102758, 0x6272D75B, -0x8B0C3260, 0x55F257F8, 0x2762E101, 0xD5522512, -0xD757E400, 0x62722541, 0xA0777201, 0x52F32722, -0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E, -0xD5508B6C, 0x615257F4, 0x7101E240, 0x64722512, -0x1F4DD14D, 0x42182419, 0x8B033420, 0x6262D64B, -0x26227201, 0xE200D640, 0x2621B0AA, 0x0009A056, -0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022, -0x40094009, 0x8803C90F, 0xD7418B16, 0x647251F4, -0x7401D23D, 0x65122742, 0x1F5DE640, 0x46182529, -0x8B033560, 0x6262D63B, 0x26227201, 0xE200D62E, -0x2621B086, 0x0009A010, 0xD738D137, 0xD22A6412, -0xE5007401, 0x21423A76, 0x22518F06, 0xEA00D634, -0x72016262, 0x2622B074, 0x2FB2D532, 0x95406652, -0xD4305BF1, 0x36205241, 0x60618910, 0x8B01C803, -0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0, -0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006, -0xE200D615, 0xD1152621, 0x2121E200, 0xE20256F5, -0x42186662, 0x26284228, 0x1F6D8D0C, 0xD61FD11E, -0x460B6511, 0x2008645D, 0x57F58904, 0x6272D11C, -0x27222219, 0xD11BE201, 0x66122822, 0x8B012668, -0x0009AE17, 0x450BD518, 0xD1180009, 0xAE10E600, -0x07D12160, 0x00203A0C, 0x00203A10, 0x00203A18, -0x001C3DC0, 0x0011772C, 0x001C3B88, 0x002039F4, -0x0011773C, 0x00117744, 0x0000F000, 0x00117764, -0x00117748, 0x00117768, 0x0011776C, 0x01FFFFFF, -0x0011774C, 0x00203584, 0x001142D8, 0x00114774, -0xFDFFFFFF, 0x00203DC0, 0x0020246C, 0x002039FA, -0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, -0xD11F7FF4, 0x6212DE1F, 0x67E25411, 0xD41E1F41, -0x1F722F22, 0x6743D51D, 0x7794D21D, 0x5A425841, -0x6C726942, 0x6D225B16, 0xE6006052, 0x2502CB20, -0x7601E540, 0x3253626D, 0x62F28BFB, 0x212255F1, -0x55F21151, 0x2E52D613, 0x14A21481, 0xD4122492, -0x11B627C2, 0x674226D2, 0xD911DA10, 0x2A72E801, -0x1A8C490B, 0x4218E201, 0x7F0C1A2C, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x000068F6, -0x001C3B9C, 0x001C3D98, 0x001C3700, 0x001C3500, -0x001C5960, 0x001C8960, 0x0020358C, 0x001C3D00, -0x00201610, 0x2F962F86, 0x2FC62FA6, 0x2FE62FD6, -0x4F124F22, 0x7F884F02, 0xE018DEB2, 0xD4B261E0, -0x61E30F14, 0x62107101, 0x440BE01C, 0x20080F24, -0x8F126D03, 0xD4AD1F08, 0x6740DDAD, 0x657CD4AD, -0x470BD7AD, 0xD2AD0009, 0x621C6120, 0x46086623, -0x36284608, 0x3D6C4608, 0xE01C1FD8, 0xE58004FC, -0x604C66E2, 0x3050655C, 0x2D628F17, 0x01FCE018, -0xDEA3E500, 0x641CA008, 0x6753655D, 0x607037EC, -0x31DC6153, 0x80147501, 0x3243625D, 0xD49D8BF4, -0xE200D59D, 0xA27F2421, 0x20082521, 0xE0188B13, -0xE50001FC, 0xA009DE96, 0x655D641C, 0x32EC6253, -0x62536722, 0x32DC6672, 0x75041261, 0x3243625D, -0xA2698BF3, 0x88012D10, 0xE0188B16, 0xE40001FC, -0x671C2D40, 0x624DDE8A, 0x8B013273, 0x0009A25C, -0x6DE3644D, 0x7D046243, 0x32EC6643, 0x652236DC, -0x74086162, 0x2512AFEF, 0x8B198804, 0x01FCE018, -0x2D70E700, 0x1FD56D1C, 0x627DDE7D, 0x8B0132D3, -0x0009A242, 0x6173677D, 0x31EC65E3, 0x75046412, -0x365C6673, 0x61426262, 0x21297708, 0x2412AFED, -0x8B198805, 0x01FCE018, 0x2D70E700, 0x1FD46D1C, -0x627DDE6F, 0x8B0132D3, 0x0009A226, 0x6173677D, -0x31EC65E3, 0x75046412, 0x365C6673, 0x61426262, -0x212B7708, 0x2412AFED, 0x8B598831, 0x61E6DE67, -0x61E31F19, 0x64E27104, 0x1F4A6216, 0x1F2B6416, -0x75E46513, 0x66536712, 0x1F4C7604, 0x64521F7D, -0xD75F6E66, 0x27E0D25F, 0xDE5F6062, 0xC9013245, -0x65622E00, 0x4609060A, 0x4609D15C, 0x46094509, -0x21501F4E, 0xB2B0646D, 0x620D1F6F, 0x8B012228, -0x0009A1EA, 0xD756DE55, 0x661C61E0, 0x6410D150, -0x470B654C, 0x7FFC54FF, 0x2FE25EFE, 0x51FE7FFC, -0x2F12E040, 0x55FBD14F, 0x57FD56FC, 0x04FE410B, -0xD24D7F08, 0xE11C640D, 0x1D412D10, 0xD44B6522, -0x67421D52, 0x1D73DE4A, 0xD24A65E2, 0x67221D54, -0x1D75D249, 0xD2496E22, 0x66221DE6, 0x1D67A1BC, -0x89018830, 0x0009A08E, 0xE340D538, 0x33FC6156, -0x23126456, 0x71046153, 0x67521341, 0x13726416, -0x7EE46E13, 0x65E66212, 0x66E3D731, 0x13246EE2, -0x760427E0, 0x6062D22F, 0x3255DE2F, 0x2E00C901, -0x060A6E62, 0xD12D4609, 0x4E094609, 0x13434609, -0x646D21E0, 0xB2501F5E, 0x620D1F6F, 0x8B012228, -0x0009A18A, 0xDE25D522, 0x61E06450, 0xD724654C, -0x470B54FF, 0x7FFC661C, 0x06FEE054, 0x7FFC2F62, -0xEE4001FE, 0x2F123EFC, 0x55E2D125, 0x57E456E3, -0x64E2410B, 0xD21C7F08, 0xE11C640D, 0x1D412D10, -0xD61A6522, 0x67621D52, 0x1D73DE19, 0xD2196EE2, -0x62221DE4, 0xD2181D25, 0x1D266222, 0x6222D217, -0x1D27A15A, 0x00117800, 0x00202A18, 0x00203996, -0x002035BC, 0x00203A7C, 0x002018D0, 0x00203995, -0x00117804, 0x00203A14, 0x00203A16, 0x00117810, -0x00203991, 0x10624DD3, 0x00203992, 0x00203993, -0x00114AA4, 0x00200F68, 0x001C5864, 0x001C6864, -0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC, -0x00200FC0, 0x8B048833, 0x470BD7A2, 0xA123EE00, -0x88282DE0, 0xA0D38901, 0xDE9F0009, 0x62E1E143, -0x3216E054, 0x0FE68F02, 0x2E21E240, 0x622D62E1, -0x8B013217, 0x0009A0BC, 0xE50185E1, 0x8B013056, -0x0009A0B6, 0x2D10E101, 0x64E1B111, 0x06FEE054, -0x6261E143, 0x3517652D, 0xE6408945, 0x8B0C3563, -0xE058E41A, 0xE5000F45, 0x72C0E05C, 0x60230F55, -0x6703C907, 0xA014E060, 0x66530F75, 0x46214621, -0x46214621, 0x45214621, 0xE0587618, 0x0F654521, -0xE0034521, 0xE05C2509, 0xE0070F55, 0xE0602209, -0xE8540F25, 0x858238FC, 0x640D65F3, 0x1844B170, -0xDD7A8584, 0x85866C0D, 0x610D4C08, 0x410860C3, -0xE00F0EFE, 0x18154D0B, 0x2E296207, 0x668260C3, -0x85620FE6, 0x4D0B5185, 0x2E0B600D, 0x548460C3, -0xB13C0FE6, 0xE05465F3, 0xE5400EFE, 0xE06C62E1, -0x3653662D, 0x0F668D41, 0xC9036023, 0x40004008, -0x61036403, 0xD965E070, 0x0F46E5FF, 0xE074655C, -0x60530F96, 0x6263490B, 0x42214221, 0x42214221, -0x42006723, 0x4200327C, 0x6C074621, 0x4621E054, -0x606309FE, 0x4008C903, 0x790630FC, 0x6A036D2D, -0x65F3E800, 0x64D3B124, 0xE0706EA2, 0x2AE22EC9, -0x01FE6694, 0x666CE074, 0x470B07FE, 0x2E0B6063, -0x65F32AE2, 0xB0FA64D3, 0x628D7801, 0x32E3EE06, -0x7D018FE7, 0x0EFEE054, 0xE05462E1, 0x420006FE, -0x760C8561, 0x701B302C, 0xE4006103, 0xE70465F3, -0x68667401, 0x3973694D, 0x8FF92582, 0x65F37504, -0x641DB0DD, 0x0EFEE054, 0x64E1B09C, 0x0009A054, -0xD43B56F8, 0xEA01D23B, 0x26A0420B, 0x0009A04C, -0x06FCE01C, 0x8829606C, 0x5CF88B08, 0xE200D636, -0x52612C20, 0x642DB04B, 0x0009A03E, 0x666CE681, -0x8B043060, 0x420BD231, 0xA03554F8, 0xE6820009, -0x3060666C, 0xD22E8B04, 0x54F8420B, 0x0009A02C, -0x666CE683, 0x8B0A3060, 0xDA2755F8, 0x2590E900, -0xD82855A1, 0x2852D628, 0xA01D52A2, 0xE6922620, -0x3060666C, 0xD2208B08, 0x5C21D824, 0x6CCC52F8, -0x28C1E600, 0x2260A010, 0x666CE693, 0x8B063060, -0xD61F59F8, 0xE201EA00, 0xA00529A0, 0xD6162621, -0xD21DD41C, 0x6562420B, 0x4F067F78, 0x4F264F16, -0x6DF66EF6, 0x6AF66CF6, 0x000B69F6, 0x4F2268F6, -0xE240614D, 0x89323123, 0x3127E21F, 0x8B27D713, -0xD406614D, 0xE00171E0, 0x5671440B, 0x26596507, -0x1761A025, 0x00200FBC, 0x00117804, 0x00203470, -0x00203A9C, 0x002018C0, 0x00117800, 0x00115F00, -0x00116058, 0x0020397C, 0x00203990, 0x00203A1A, -0x00203A16, 0x00203AB4, 0x002018D0, 0x001C3704, -0xE001D490, 0x6672440B, 0x26596507, 0x4F262762, -0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912, -0xD7893127, 0x614D8B08, 0x5671D286, 0x420B71E0, -0x260BE001, 0x1761A006, 0x6672D282, 0xE001420B, -0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618, -0x6252D57E, 0x89FC2268, 0x0009000B, 0x4618E680, -0xD57A4628, 0x22686252, 0x000B89FC, 0xA0010009, -0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680, -0xD5734628, 0x22686252, 0x000B8BFC, 0x2FE60009, -0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D66D, -0x54E11615, 0x16464218, 0x422855E2, 0x57E31657, -0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE, -0x2FD62FC6, 0x4F222FE6, 0x6C53DD62, 0x6E43BFD6, -0x2DE2BFBB, 0x0009BFD2, 0x2C1251D5, 0x1C4154D6, -0x1C5255D7, 0x1C6356D8, 0x6EF64F26, 0x000B6DF6, -0x61636CF6, 0xA004E600, 0x62564109, 0x24227601, -0x36127404, 0x000B8BF9, 0xD6530009, 0x8562E500, -0xA00B674D, 0x655D610D, 0x40006053, 0x305CD44F, -0x024D4008, 0x3270622D, 0x75018905, 0x3213625D, -0x000B8BF1, 0x000BE000, 0x2FE6E001, 0x54416743, -0x4E08EE7F, 0x4E28D246, 0x25E96543, 0x60436E21, -0x9E7562ED, 0x4529C903, 0xE60032E3, 0x8D456103, -0x21184509, 0xD23F8B05, 0x002C6053, 0xA08AC93F, -0x60136603, 0x8B268801, 0x880C6053, 0xD53A8B04, -0xC93F8453, 0x6603A07F, 0x8B048808, 0x84E2DE36, -0xA078C93F, 0x880D6603, 0x8B03D633, 0xC93F8461, -0x6603A071, 0x88096260, 0x622C8F09, 0xE014DE2C, -0x655C05EC, 0x60233258, 0xA064C93F, 0x60236603, -0xA060C93F, 0x88026603, 0xE0078B5D, 0x60432509, -0x8905C810, 0x6053D225, 0xC93F002C, 0x6603A053, -0x6053DE23, 0xC93F00EC, 0x6603A04D, 0x88016013, -0x60538B19, 0x8B04880C, 0x8423D21E, 0xA042C93F, -0x88086603, 0xD51B8B04, 0xC93F8452, 0x6603A03B, -0xD618880D, 0x84618B03, 0xA034C93F, 0x60606603, -0xA030C93F, 0x88026603, 0xE0078B2D, 0x60432509, -0x8923C810, 0x6053DE10, 0xC93F00EC, 0x6603A023, -0x00000BB8, 0x00203470, 0x001C3704, 0x001C373C, -0x001C3700, 0x001C370C, 0x00114000, 0x00114008, -0x001142D8, 0x001142E4, 0x001142E8, 0x001142F5, -0x001142ED, 0x001142FD, 0x00114309, 0x6053D209, -0xC93F002C, 0x60136603, 0x8B038802, 0xC8106043, -0x76028900, 0xC93F6063, 0x40004018, 0x1741240B, -0x6EF6000B, 0x00114301, 0x0009A16E, 0x2FE62FD6, -0xDD944F22, 0xA0049EB2, 0xD4930009, 0x420BD293, -0x62D265D2, 0x8BF822E8, 0x0009A004, 0xD28FD490, -0x55D1420B, 0x22E852D1, 0xA0048BF8, 0xD48D0009, -0x420BD28A, 0x52D255D2, 0x8BF822E8, 0x0009A004, -0xD286D489, 0x55D3420B, 0x22E852D3, 0xA0048BF8, -0xD4860009, 0x420BD281, 0x52D455D4, 0x8BF822E8, -0x6EF64F26, 0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, -0x6E636C73, 0x6D53B01A, 0x64D357F4, 0xB05F65E3, -0xB07566C3, 0xB0A40009, 0xB0A80009, 0xB0AC0009, -0xB0AC0009, 0xB0AF0009, 0xB03154F5, 0x6CCD6C03, -0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0x3412D170, -0xD6700529, 0x2650D770, 0x2742000B, 0x0009A018, -0x2FD62FC6, 0x4F222FE6, 0x6E636C73, 0x6D53BFEE, -0x64D357F4, 0xB03365E3, 0xB08D66C3, 0xB00F54F5, -0x6CCD6C03, 0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, -0xE503D162, 0xD763D462, 0x21524518, 0x2472000B, -0xD45FD15E, 0x2162E600, 0x2462000B, 0xBF734F22, -0xBF73E40A, 0xD25C0009, 0x4118E104, 0xE40AE500, -0xBF692212, 0xD7592252, 0xCB206072, 0x000B4F26, -0x4F222702, 0x410BD156, 0xD556E400, 0x4F26452B, -0xD1552FE6, 0x66126E63, 0x92104418, 0x44084528, -0x45002629, 0x265B4408, 0x264B4400, 0x21624708, -0xD14E4708, 0x217227EB, 0x6EF6000B, 0x1FFF03F0, -0x4F222FE6, 0xE101DE4A, 0xBF3DE40A, 0x67E32E12, -0xE500776C, 0xE204E130, 0x2752E40A, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x27222712, 0x27522752, 0x27522752, 0x27522752, -0x27522752, 0x175ABF18, 0x2E62E600, 0x000B4F26, -0xD2346EF6, 0xE441E101, 0x000B2212, 0xD1322242, -0xE605D432, 0x000B2162, 0x000B2462, 0xD2300009, -0xE40AE601, 0x2262AF00, 0x2FC62FB6, 0x2FE62FD6, -0x7FFC4F22, 0x6C43DB2B, 0xED0060B2, 0x2B02CB03, -0xC90360B2, 0x6E03A008, 0x89073DC2, 0xE46460B2, -0xB07CC903, 0x7D016E03, 0x8BF52EE8, 0x8F043DC2, -0xD4212FE1, 0x460BD621, 0x62F10009, 0x6023622D, -0x89FFC801, 0x7F046023, 0x6EF64F26, 0x6CF66DF6, -0x6BF6000B, 0x001C3B88, 0x00203AC8, 0x002018D0, -0x00203AD0, 0x00203AD8, 0x00203AE0, 0x00203AE8, -0x0025E720, 0x00203DBC, 0x00203980, 0x001C5968, -0x001C3B40, 0x000F8000, 0x001D4004, 0x001C3500, -0x002015E4, 0x00201610, 0x001C5814, 0x001C59D0, -0x001C5830, 0x001C6268, 0x001C59A4, 0x001C639C, -0x001C581C, 0x001C5860, 0x00203AF0, 0x002018C0, -0x8F014411, 0x6043604B, 0x0009000B, 0x5651D52B, -0x46286052, 0x306C000B, 0x2FC62FB6, 0x2FE62FD6, -0x4F124F22, 0xBFF14F02, 0x6B036E43, 0xDD25DC24, -0x0009BFEC, 0x3C0530B8, 0x4609060A, 0x46014609, -0x020A3D65, 0x42094209, 0x32E24209, 0x4F068BF0, -0x4F264F16, 0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6, -0x2FE62FD6, 0x4F124F22, 0xBFCF4F02, 0x6C036E43, -0xBFCBDD13, 0x30C80009, 0x060A3D05, 0x46094609, -0x36E24601, 0x4F068BF5, 0x4F264F16, 0x6DF66EF6, -0x6CF6000B, 0x4F222FE6, 0xE102DE0B, 0xE403E500, -0xBFB92E12, 0xE6062E52, 0xE7004618, 0x2E62E403, -0x4F262E72, 0x6EF6AFB0, 0x0009000B, 0x001C1040, -0xCCCCCCCD, 0x10624DD3, 0x001D4004, 0x2F962F86, -0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0xE5007F98, -0x6453E710, 0x6B534728, 0xEE1ADCBC, 0x6153655D, -0x315C4108, 0x75014108, 0x6043317C, 0x0F16665D, -0xED0060B3, 0x21B136E3, 0x81128111, 0x11D28113, -0x11D411D3, 0x74048FEA, 0xD8B167F2, 0x1871D9B1, -0x58F12872, 0x1981D1B0, 0x59F22982, 0x5DF45AF3, -0x54F65EF5, 0x21921191, 0x11A211A3, 0x11D411D5, -0x11E611E7, 0x11481149, 0xDAA855F7, 0x57F8EE00, -0x52F9DDA7, 0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6, -0x2D72EAEF, 0x6AAC2622, 0x6DE36EED, 0x61E34D08, -0x41083DEC, 0x31EC4D08, 0x60B33D9C, 0x2DB14108, -0xE05081D1, 0xE79F4108, 0x41084008, 0x81D2677C, -0x318C60B3, 0x3472E200, 0x1DD281D3, 0xD4931D13, -0x1D248D01, 0x65D3D48F, 0x7E01B0B2, 0x34A264ED, -0xDA8C8BDA, 0x68A22FD2, 0x4829DD91, 0x64A22D82, -0x694D7DFC, 0x2D92D286, 0x4E296E22, 0x2DE27D0C, -0x6AD36822, 0xD784618D, 0x6D722A16, 0xD583D489, -0x5E7224D2, 0x14E2D688, 0xEE005174, 0x58761414, -0x1486D186, 0xE7105978, 0x62521498, 0x142A65E3, -0x64E326E2, 0x644DE600, 0x48086843, 0x4808384C, -0x6053381C, 0x28B10C86, 0x60B309CE, 0x60538191, -0x60430ACE, 0x605381A2, 0x60B30DCE, 0x605381D3, -0x740108CE, 0x09CE1882, 0x19E3624D, 0x32730ACE, -0x8FE01A64, 0xD96A7504, 0x6C92E003, 0x2CB14018, -0xDA6F6D92, 0xE05081D1, 0x40086E92, 0x619281E2, -0x811360B3, 0xE6006492, 0x67921442, 0x17A3D468, -0xE1FF6892, 0xE7031864, 0x46086563, 0x7501364C, -0x665D2612, 0x8BF83673, 0xE003DC5A, 0x40186DC2, -0x6EC22DB1, 0x81E1D25F, 0xEE0061C2, 0x64C21112, -0x1423E024, 0xD45B65C2, 0x67C215E4, 0x8172E580, -0x66E368C2, 0x655C8183, 0x6963666D, 0x6A6D7604, -0x3A53394C, 0x29E28FF8, 0xDC54DB53, 0x740424B2, -0x7F6824C2, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, -0x000B69F6, 0x614268F6, 0xC8036011, 0xE5008F03, -0x3420D23C, 0x60118B06, 0x8802C903, 0xD2398B06, -0x8B033420, 0x65135612, 0x24225264, 0x6053000B, -0x2FE62FD6, 0x7FEC4F22, 0x62536E53, 0x6D43E550, -0x4508E400, 0xE101A001, 0x60435224, 0x81212211, -0x60538123, 0x56E28122, 0x8BF53620, 0x16E4D238, -0xE61464F3, 0x65E3420B, 0xE4FC65E1, 0x2E512549, -0x65F361F1, 0x2F112149, 0xD13154D1, 0xE614410B, -0x607157D1, 0x2701CB01, 0x7F141DE1, 0x6EF64F26, -0x6DF6000B, 0x2FE62FD6, 0x7FEC4F22, 0x66536E53, -0x6D43E5FC, 0x20596061, 0x2601CB01, 0x326052E2, -0x12E48B06, 0x31E051E2, 0x52D18B04, 0x1E22A002, -0x5664AFF0, 0x64F3D21E, 0x420BE614, 0x67E165E3, -0x2719E1FC, 0x67F12E71, 0x271954D1, 0x65F3D118, -0x410BE614, 0x52D12F71, 0xCB016021, 0x1DE12201, -0x4F267F14, 0x000B6EF6, 0x00006DF6, 0x002039AC, -0x0020357C, 0x00203584, 0x0020358C, 0x002035B4, -0x00203998, 0x002039A0, 0x00100208, 0x001014C0, -0x001E210C, 0x001C3D00, 0x002039EC, 0x001000C8, -0x00117880, 0x00117780, 0x00040020, 0x0026C401, -0x00200D42, 0x4F222FE6, 0xDE42624C, 0x42004208, -0x3E2CA005, 0xD4405252, 0xBF695624, 0x65E22E62, -0x352052E1, 0xD63D8BF6, 0x4F262622, 0x6EF6000B, -0x2FC62FB6, 0x2FE62FD6, 0xDC394F22, 0x52C1DB39, -0x362066C2, 0x6061891C, 0x8801C903, 0xDE348918, -0xBF38DD35, 0x650364E3, 0x66B28503, 0x3262620D, -0xD4328907, 0x0009BF76, 0x4D0BD431, 0xAFE60009, -0xBF3D0009, 0xD42F64E3, 0x00094D0B, 0x0009AFDF, -0x2262D22D, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, -0x2FD62FC6, 0x4F222FE6, 0xDD29DC28, 0x6E4360C2, -0x04DE4008, 0xE614D127, 0x65E3410B, 0xD127D726, -0x55E227E2, 0x35E05254, 0x21228F04, 0x400860C2, -0x122202DE, 0x605365C2, 0x75014008, 0x0DE606DE, -0xC90F6053, 0x60632C02, 0x6EF64F26, 0x000B6DF6, -0x85436CF6, 0x650D5643, 0x622D6262, 0x35277204, -0xE1008F0C, 0x2268960C, 0xD6158B03, 0x72015261, -0xD6131621, 0x6262E101, 0x26227201, 0x6013000B, -0x000001FF, 0x0020358C, 0x00203584, 0x001C3D00, -0x002035B4, 0x0020397C, 0x002018C0, 0x0020357C, -0x00203B18, 0x00203B1C, 0x001C3D28, 0x002039EC, -0x002039AC, 0x00200D42, 0x002039F0, 0x002039F4, -0x00117754, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, -0x7FF84F22, 0x6C22D241, 0xC80360C3, 0xDE40896E, -0xDA41DB40, 0x52B1D941, 0x362066B2, 0x60618945, -0x8801C903, 0xDD3B8941, 0x420BD23D, 0x650364D3, -0x60A12F02, 0x89328801, 0x85145153, 0x8840600C, -0x1F118F0C, 0xD5376191, 0x641D450B, 0x8B262008, -0xD7356691, 0x646D470B, 0x8B202008, 0x420BD233, -0x51F154F1, 0xC8208511, 0xD1318904, 0x021EE050, -0x01267201, 0x420BD22F, 0x200864F2, 0x64D38907, -0x4D0BDD2D, 0xD12D65F2, 0xAFC4E601, 0xD22C2162, -0x420B65F2, 0xD72B64E3, 0xAFBCE601, 0xD2262762, -0x420B65F2, 0xAFB664D3, 0xDE270009, 0xDA28DD27, -0x52D1DB28, 0x362066D2, 0x60618918, 0x8801C903, -0xD4228914, 0x450BD516, 0x56030009, 0x8F0436E0, -0xE2016503, 0xAFEC2A20, 0xD41F2B52, 0x420BD216, -0xD7180009, 0x4118E101, 0x2712AFE3, 0xC80460C3, -0xD21A8902, 0x0009420B, 0x4F267F08, 0x6DF66EF6, -0x6BF66CF6, 0x000B6AF6, 0x000069F6, 0x001E2100, -0x0020358C, 0x00203584, 0x00203A14, 0x001142D8, -0x002014A6, 0x00115EA2, 0x00114774, 0x00200D8A, -0x0020351C, 0x002016C2, 0x002014D0, 0x001E212C, -0x00201534, 0x001C3D30, 0x00117880, 0x0020357C, -0x0020399C, 0x00203998, 0x002035B4, 0x00200644, -0xE601D203, 0x1265D503, 0x000B2252, 0x00001266, -0x001C1010, 0x0000C34F, 0x0009000B, 0x0009000B, -0x0009000B, 0x0009000B, 0xE000000B, 0xE000000B, -0x0009000B, 0xE4FDD59D, 0xD69D6152, 0x25122149, -0x74016052, 0x2502CB01, 0xD19A6752, 0x25722749, -0xC8406010, 0x60628902, 0x2602CB04, 0xE1F76462, -0x26422419, 0xE7016062, 0x2602C9CF, 0xE5026062, -0x2602CB10, 0x47186062, 0x2602CB03, 0x000B1652, -0xD58D1673, 0xD28ED78D, 0xE100D48E, 0x2511E600, -0x22102711, 0x2461AFCE, 0xD28B664C, 0x362C4600, -0xCB106060, 0x2600000B, 0xD287654C, 0x352C4500, -0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D283, -0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D27F, -0x6650352C, 0x2619E1EF, 0x2560000B, 0xD27A664C, -0x362C4600, 0xCB086060, 0x2600000B, 0xD276654C, -0x352C4500, 0xE1F76650, 0x000B2619, 0x664C2560, -0x4600D272, 0x6060362C, 0x000BCB08, 0x654C2600, -0x4500D26E, 0x6650352C, 0x2619E1F7, 0x2560000B, -0xD669624C, 0x326C4200, 0xC9086020, 0x40214021, -0x000B4021, 0x624C600C, 0x4200D664, 0x6020326C, -0x4021C908, 0x40214021, 0x600C000B, 0x644CD160, -0x6240341C, 0x602C000B, 0x644CD15E, 0x6240341C, -0x602C000B, 0x4F222FE6, 0x645C6E43, 0x3467E60A, -0xBFEB8914, 0x640C0009, 0x880160EC, 0xE00F8B02, -0x2409A002, 0x44094409, 0xE60A624C, 0x89053263, -0x644CBFE2, 0x6023620C, 0x8B00C880, 0x6023E200, -0x000B4F26, 0x4F226EF6, 0x6062D64B, 0x8B038801, -0x0009B256, 0x0009A003, 0xE640D248, 0xD6482260, -0x4F26E200, 0x2622000B, 0xD6434F22, 0x88026062, -0xB29F8B01, 0xD6420009, 0x4F26E200, 0x2622000B, -0xD43ED53D, 0xE701E100, 0x000B2512, 0xD23B2470, -0x000BE604, 0x4F222260, 0xD13BD43A, 0x0009410B, -0xE1FDD53A, 0xD23A6650, 0xE7002619, 0x4F262560, -0x2270000B, 0xD5374F22, 0x6152D237, 0x611DD737, -0x64522512, 0x242BE6FF, 0xD4352542, 0x666DD22E, -0x2762420B, 0xE1FBD52D, 0x27196750, 0x000B4F26, -0x4F222570, 0xD128D42F, 0x0009410B, 0xE7F7D527, -0x26796650, 0x000B4F26, 0xD5242560, 0x62509425, -0x000B2249, 0xD5212520, 0x6250E4BF, 0x000B2249, -0x4F222520, 0x8522D224, 0x2008600D, 0x88018911, -0x88038944, 0x88058946, 0x88068948, 0x8808894E, -0x88098954, 0x880A895A, 0x880B8960, 0xA06D8966, -0xB06F0009, 0xA06A0009, 0xFF7F600C, 0x001E2148, -0x001E1108, 0x001E1000, 0x00203A4C, 0x00203A4E, -0x00203A6D, 0x00203A30, 0x001E103F, 0x001E105F, -0x001E102F, 0x001E1090, 0x00203A54, 0x001E100B, -0x00203A50, 0x00203B20, 0x002018C0, 0x001E1028, -0x00203A6C, 0x001D4020, 0x98760000, 0x001C1000, -0x00203B2C, 0x00203B3C, 0x00203A24, 0x0009B04C, -0x600CA035, 0x0009B055, 0x600CA031, 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, -0x00203A6D, 0x00203A24, 0x00203A30, 0x001E1100, -0x001E100C, 0x00203A50, 0x001E1000, 0x001E1001, -0x00203A58, 0x00203A38, 0x00203A3C, 0x00203A40, -0x00203A5C, 0x00203A60, 0x00203A64, 0x00203A68, -0x00203E20, 0x00203E2A, 0x00203A4A, 0x002027F2, -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, 0x64E3BC86, 0xBC8B64E3, -0x62EC7E01, 0x8BF732D7, 0xBC8EEE01, 0x64E364E3, -0x7E01BC93, 0x32D762EC, 0x4F268BF7, 0x000B6EF6, -0xD1186DF6, 0xD418920D, 0x72122122, 0x2422D617, -0xD7177204, 0x72202622, 0x2722D116, 0x000B7230, -0x137A2122, 0x00203A4A, 0x002028FE, 0x001E1015, -0x00203A50, 0x001E1001, 0x00203A24, 0x001E1100, -0x00203A4E, 0x00203A3C, 0x001E1000, 0x00203A40, -0x00203A4C, 0x002027F2, 0x001E100C, 0x00203A38, -0x00203A54, 0x00203A58, 0x00203A5C, 0x00203A60, -0x00203A64, 0x00203A68, 0x4F222FE6, 0xD6707FFC, -0x88016060, 0xE2018951, 0x2620BFBB, 0xD56ED16D, -0xDE6E6010, 0x64E36552, 0x7402C840, 0x8D22D16C, -0xD26C7502, 0xE601D76C, 0xE7042722, 0x76016255, -0x626C2421, 0x8FF93273, 0xD4637402, 0x6242E601, -0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C, -0xE417D562, 0x67557601, 0x3243626C, 0x8FF92171, -0xA0207102, 0xD25E0009, 0xE601D75B, 0xE7042722, -0x76016255, 0x626C2421, 0x8FF93273, 0xD4527402, -0x6242E601, 0x640D8528, 0x67494419, 0x275D657E, -0x81E4607C, 0xE417D553, 0x67557601, 0x3243626C, -0x8FF92171, 0x92897102, 0xD2462E21, 0x5E23D74E, -0x64F22FE2, 0x604365F2, 0x2700C980, 0xC9606043, -0x80716103, 0xC9036043, 0x80724519, 0x65F2605C, -0x817266F2, 0x46194629, 0x606C4529, 0x4018645C, -0x8173304C, 0x21185E23, 0x64F22FE2, 0x6E4C62F2, -0x602C4219, 0x66F262F2, 0x46294018, 0x461930EC, -0x42298174, 0x652C606C, 0x305C4018, 0x81758F07, -0x0009BC97, 0x2228620C, 0xA00A8908, 0x60130009, -0x8B038840, 0x0009B009, 0x0009A003, 0xE202D62F, -0x7F042622, 0x000B4F26, 0x4F226EF6, 0x8552D52A, -0x8830600D, 0x88318903, 0xA0348923, 0x85550009, -0xD428D727, 0x85532701, 0x610DD627, 0x24124118, -0x460BD426, 0xD7230009, 0xD226D425, 0x6572420B, -0xE230D120, 0x42286712, 0x2729E620, 0x37604628, -0xD6218B03, 0xA016E200, 0xD61F2622, 0xA012E202, -0xD1182622, 0x6212E530, 0xE6204528, 0x46282259, -0x89083260, 0xD41AD119, 0xE601D513, 0x2160450B, -0x472BD718, 0x4F264F26, 0x0009000B, 0x0000060A, -0x00203A6C, 0x001E1000, 0x00203A58, 0x00203E20, -0x00203E2C, 0x00203DC4, 0x00203A40, 0x00203DF4, -0x00203DF2, 0x00203DC6, 0x00203A24, 0x00203A50, -0x00203A3C, 0x00203A38, 0x002018C0, 0x00203B48, -0x00203B4C, 0x002018D0, 0x00203A54, 0x001E100B, -0x00203B60, 0x00114004, 0x4F222FE6, 0x84E9DE86, -0x2448640C, 0xB17B8901, 0xD2840009, 0x26686620, -0x60E08902, 0x2E00C9BF, 0x000B4F26, 0x000B6EF6, -0x2FE60009, 0xDE7E4F22, 0x60E0D67E, 0xCBC0D47E, -0x62602E00, 0xC803602C, 0x40218904, 0x70014021, -0x6603A002, 0x66034009, 0xD678616D, 0xE500A004, -0x75016262, 0x74042422, 0x3213625D, 0xD2748BF8, -0x0009420B, 0xC9BF84E2, 0x4F2680E2, 0x6EF6000B, -0x2FE62FD6, 0x7FFC4F22, 0x6260D66E, 0x89402228, -0xD565E100, 0x60502610, 0xCB40D46B, 0x2500440B, -0x8D052008, 0x62E06E03, 0x7104612C, 0x2F11A006, -0xD466D65E, 0xDD666760, 0x657C4D0B, 0xE23C6D1D, -0x8B033D27, 0xD264D463, 0x0009420B, 0x4D214D21, -0xA005D762, 0x66E6E400, 0x357C4508, 0x74012562, -0x35D3654D, 0xD75E8BF7, 0x6E72E003, 0x81E14018, -0x6E7260F1, 0x81E2700C, 0xD45A6172, 0xDD5A8113, -0x65724D0B, 0xD64AD259, 0x2212E101, 0xC93F6060, -0x7F042600, 0x6EF64F26, 0x6DF6000B, 0x2FC62FB6, -0x2FE62FD6, 0xD2524F22, 0x6B436E73, 0x420B6C53, -0x20086D63, 0x64038D1C, 0xE50ED13C, 0x32526210, -0x60C38916, 0x804124B0, 0x814160D3, 0xA007E500, -0x655D61BC, 0x00EC6053, 0x364C6653, 0x80647501, -0x3213625D, 0xD6308BF5, 0xC9BF6060, 0x2600A008, -0xD239D440, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, -0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 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, 0xBF8F666C, 0x7F3C655C, -0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, -0xD11C68F6, 0x6012D21C, 0xCB20E405, 0x2102E500, -0x000B2242, 0x00002252, 0x001E1017, 0x00203996, -0x001E1015, 0x001E10BF, 0x00117800, 0x001E10FC, -0x00200644, 0x0020399C, 0x00202A56, 0x00203B64, -0x002018D0, 0x00203B80, 0x002018C0, 0x0011788C, -0x00203998, 0x0020357C, 0x00201534, 0x001E2130, -0x00202A18, 0x00203B88, 0x002039FC, 0x00203A04, -0x00203DC0, 0x001C3500, 0x001D4004, 0xD564D163, -0xE400D764, 0x2142E20F, 0x17411154, 0xD5622722, -0x9669D762, 0x15412572, 0x96661562, 0xE6011565, -0xD55F1165, 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, -0x0009BE85, 0xC81060E3, 0xBE828901, 0x60E30009, -0x8901C840, 0x0009BEA4, 0xC80160E3, 0xDD3D8938, -0xC80260D0, 0x2F008D03, 0x460BD63B, 0x60F00009, -0x8902C804, 0x460BD639, 0x62F00009, 0xC8806023, -0x60D08902, 0x2D00C97F, 0xC8016023, 0xD6348906, -0x0009460B, 0x0009A007, 0x51630601, 0x8902C808, -0x460BD630, 0x60F00009, 0x8902C810, 0x420BD22E, -0xD52E0009, 0x88026052, 0xD22D8B03, 0xA005E604, -0x88012260, 0xD22A8B02, 0x2260E601, 0x2522E200, -0xC88060E3, 0xD227892D, 0x60E36E20, 0x8902C880, -0x420BD225, 0x60E30009, 0x8902C840, 0x420BD223, -0x60E30009, 0x8902C802, 0x420BD221, 0x60E30009, -0x890DC804, 0xDD20D11F, 0x0009410B, 0x0009BF11, -0x0009BF4C, 0xD51ED41D, 0x2470E708, 0x25D2BF85, -0xC80860E3, 0xD21B8905, 0x4F267F04, 0x422B6EF6, -0x7F046DF6, 0x6EF64F26, 0x6DF6000B, 0x001C581C, -0xA000A000, 0x001D0100, 0x001D4000, 0x00040021, -0x001C589C, 0x001E1021, 0x00201A46, 0x00201A68, -0x002020C8, 0x00201A80, 0x00201A8E, 0x00203A50, -0x001E100B, 0x001E1028, 0x00201AFA, 0x00201B06, -0x00201A96, 0x00201AB4, 0x12345678, 0x001E1000, -0x0010F100, 0x00201AE2, 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, 0x00203A4A, -0x00203A4C, 0x00203A4E, 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, 0x00203995, -0x00203994, 0x00203996, 0x002035BC, 0x7FFC4F22, -0xE680D1A8, 0x666C6212, 0xD2A72F22, 0x67F36563, -0x420B7542, 0x7F04E404, 0x000B4F26, 0xE6800009, -0xD2A1666C, 0xE7006563, 0x422B7540, 0xE6806473, -0xD29D666C, 0xE7006563, 0x422B7543, 0x2F866473, -0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FC04F22, -0xDB97D296, 0x72012F22, 0xD1961F21, 0x66125211, -0x8B013620, 0x0009A0F9, 0xC9036061, 0x8B018801, -0x0009A0F3, 0xD290DC8F, 0x64C3420B, 0x6503D18F, -0x60111F02, 0x8B048801, 0x420BD28D, 0xAFE464C3, -0x54530009, 0x844CEE84, 0x890130E0, 0x0009A0C3, -0x6610D188, 0x6023626C, 0x8B718801, 0x6210D186, -0x89662228, 0xDA86D285, 0xE0036122, 0x64221112, -0x4018D881, 0xDD83E500, 0x814167A3, 0x77042850, -0x647266A2, 0x6ED3D580, 0x1F457E04, 0x65521F56, -0x64E368D2, 0x1F8874F8, 0x684369E2, 0x1F637894, -0x1F991F74, 0x62826142, 0xD779D978, 0x1F2BD679, -0x67726292, 0x1F1A6062, 0x2602CB20, 0xD176E600, -0xE5401F57, 0x1F7D1F2C, 0x76011F1E, 0x3253626D, -0x51F38BFB, 0x52F555F4, 0x25222A12, 0x55F757F6, -0x27525AF8, 0x5DF92DA2, 0x2ED251FB, 0xD56B5EFA, -0x54FC24E2, 0x281257FD, 0xD160D869, 0x25722942, -0x69126782, 0x1974D866, 0xDD666A12, 0x56FE60A1, -0x2A01CB01, 0xDA646412, 0xE9012842, 0x4A0B2D42, -0x52FE2692, 0xD661EE01, 0x22E24E18, 0x72016262, -0x60B22622, 0xCB01D14F, 0x2B02E202, 0x2120A03F, -0x8B3C2228, 0xE601D55A, 0x2160E700, 0xE01C2572, -0xC801004C, 0xD8578B0C, 0x1F8FD257, 0xE6002822, -0x7601E57D, 0x3253626C, 0x56FF8BFB, 0x2622D253, -0xE2FE69B2, 0x2B922929, 0x0A4CE01E, 0xE01F65F2, -0x014C25A0, 0x741057F1, 0xEA062710, 0xDD4CE600, -0x8446DE4C, 0x2D007601, 0x696C6844, 0x2E8039A3, -0x8FF67E01, 0xDE487D01, 0x2EA0EA94, 0xE1007E01, -0x7E0F2E10, 0xD12FE205, 0x64102E20, 0x6023624C, -0x89088801, 0x55F2D22A, 0x64C3420B, 0xEE01D132, -0xAF1A4E18, 0x55F221E2, 0x8553D13C, 0x620D6612, -0x89063262, 0xD63BD43A, 0xE801460B, 0xAF0CD73A, -0xD91F2782, 0x64C3490B, 0xEE01D127, 0xDA38D437, -0x4A0B4E18, 0xAF0021E2, 0x7F400009, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x4F2268F6, -0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1, -0x81F2D209, 0x67F38542, 0x854381F3, 0x81F4E40C, -0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26, -0x00000009, 0x001C3D9C, 0x002023FC, 0x0011779A, -0x001C36F8, 0x002035B4, 0x002014A6, 0x00203A16, -0x002014D0, 0x002039A5, 0x002039A4, 0x002039A0, -0x001C3B9C, 0x001C3704, 0x001C3D98, 0x001C3BB4, -0x001C5960, 0x001C3500, 0x001C3D30, 0x001C8960, -0x0020358C, 0x001C3D00, 0x00201610, 0x00117730, -0x002039A8, 0x001C582C, 0x2000A000, 0x0000A000, -0x0011778C, 0x00117792, 0x00117788, 0x0020397C, -0x0020357C, 0x00201534, 0x001E2130, 0x00203DA0, -0x002018C0, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, -0x4F222FE6, 0xD19B7FEC, 0x2F12E000, 0x6103D49A, -0x1F4281F2, 0xDD9ADA99, 0xD69A6813, 0xE0014808, -0x460BDE99, 0x38EC4800, 0x65A21F03, 0x352052A1, -0xA23E8B01, 0x60510009, 0x8801C903, 0xA2388B01, -0x52530009, 0x32E0DE91, 0xD9918B10, 0x64A3490B, -0x4B0BDB90, 0xDE906403, 0xD791D690, 0xEC01D591, -0x2E02E100, 0x271026C0, 0x2502AFDF, 0xC8018551, -0xA1578B01, 0x62510009, 0x4200622D, 0x5E53366A, -0x85E2226D, 0xC903642C, 0x85E36603, 0x6053650D, -0x40214021, 0x4500C93F, 0x322A6703, 0x6053252D, -0xC901D17F, 0x60106C03, 0x8801D97F, 0xDB7F8B05, -0x2120E200, 0xCB0160B2, 0xD17D2B02, 0x88016011, -0x65A28B0A, 0x8D042448, 0x9B9E6251, 0xA00322B9, -0x919B2521, 0x2521221B, 0x37B3EB10, 0x2448895E, -0xD4738B07, 0x22286241, 0x60638903, 0xA05781F8, -0xD5706473, 0x46084608, 0x85E26273, 0x46006B50, -0x362C4200, 0x2BB8C910, 0x8F1F6463, 0x26686603, -0xD2698911, 0x062D6043, 0x4119616D, 0x6B0E6019, -0x81F820BD, 0x880160C3, 0x646C8F2C, 0x880F6073, -0xA0278B1B, 0xD2610009, 0x052D6043, 0x4119615D, -0x670E6019, 0x645C207D, 0x81F8A01C, 0x890F2668, -0x6043D25B, 0x6B5D052D, 0x60B94B19, 0x201D610E, -0x60C381F8, 0x8F0D8801, 0x6473645C, 0xEC00A00A, -0x6043D254, 0x625D052D, 0x60294219, 0x207D670E, -0x81F8645C, 0x880285F8, 0x85E1890A, 0x8D07C820, -0xE6DC6203, 0x60232269, 0x81E1A002, 0x644CE4FF, -0x6210D149, 0x89012228, 0x644CE4FF, 0x654DEBFF, -0x35B06BBC, 0xDB368B2B, 0x64A34B0B, 0x410BD135, -0x54036403, 0x85446E03, 0xC948DB40, 0xDC408808, -0xBEAC8B01, 0x64B3E502, 0x65E34C0B, 0xDB3DEC01, -0xD13D2DC2, 0x621260B2, 0x72017001, 0x21228805, -0x2B028F08, 0x666CE680, 0x6563D238, 0x7549E700, -0x6473420B, 0xA030D436, 0x7FFF0009, 0x85E28000, -0x20B9EBFC, 0x610381E2, 0x942A85E3, 0x62032049, -0x450885F8, 0x81E2201B, 0xC90160C3, 0x40084018, -0x40084008, 0x4000225B, 0x6023220B, 0x85E481E3, -0x4118E108, 0x81E4201B, 0xE40262A2, 0x20B98521, -0x67A28121, 0xCB016071, 0x85F82701, 0x89033042, -0xECE785E2, 0x81E220C9, 0x490BD41E, 0xA03B0009, -0x7E030009, 0x001C3D30, 0x00203DAC, 0x0020358C, -0x001E212C, 0x00203470, 0x001C3D00, 0x00117780, -0x002014A6, 0x00201670, 0x0011770C, 0x002039A4, -0x002039A5, 0x002039A0, 0x002018C0, 0x001C36F8, -0x00203A1A, 0x00203DBC, 0x00203BA0, 0x00203C20, -0x00203CA0, 0x00203D20, 0x00203990, 0x00203584, -0x002014D0, 0x00203A1C, 0x00203A20, 0x002023FC, -0x00203DA4, 0x00203DA8, 0x602262F2, 0x40094019, -0xC90F4009, 0x8B0B880A, 0x60E2DE8C, 0x40094019, -0xC90F4009, 0x8B038808, 0xCB0160A2, 0x2802A006, -0x65E2DE87, 0x2E527501, 0x286266A2, 0x52F366F2, -0x2622AE83, 0xD2838551, 0xDE83C802, 0xA0958B01, -0x420B0009, 0x4E0B64A3, 0x5E036403, 0x85E46503, -0x4918E908, 0xD77D209B, 0xE04C81E4, 0xDC7C0B7E, -0x7B01D97C, 0x61C207B6, 0x71016690, 0x8D062668, -0xD4792C12, 0x420BD279, 0xA070EB01, 0x62512DB2, -0x4B18EB0F, 0x22B9E102, 0x32104118, 0x85518B0F, -0x2029E2FC, 0x60518151, 0xCB0172E0, 0x85E12501, -0x202994A3, 0x85E481E1, 0xA0522049, 0x675181E4, -0x4719677D, 0x667E6779, 0x7701276D, 0x6903607C, -0x88014918, 0x25918F3E, 0x6B12D161, 0x21B27B01, -0x660D85E3, 0x40216063, 0xC93F4021, 0x6C034600, -0x262D322A, 0xC8016063, 0xDB5ED15D, 0x967D8901, -0xE6002C6B, 0x666C67CD, 0x40006063, 0x622D021D, -0x8D0E3270, 0x60436403, 0xE9FF021D, 0x8B013290, -0x01C5A007, 0x626C7601, 0x3292E904, 0x646C8BEB, -0x60434400, 0xD15004BD, 0x0B457401, 0x669D6911, -0x89073670, 0x602D6211, 0x890388FF, 0xE201DB4B, -0x2B2021C1, 0xECFC8551, 0x815120C9, 0xCB016051, -0xDC472501, 0x64A34C0B, 0x51F366F2, 0x85EF2612, -0x54F2D244, 0x650D420B, 0x0009ADE7, 0xE500DC42, -0x420B2C52, 0x4E0B64A3, 0x54036403, 0x85446E03, -0x6703E908, 0x65034918, 0x27998541, 0xDB323790, -0x8F0BD932, 0x6013610D, 0x8B07C820, 0xC9486053, -0x8B038808, 0xE501BD4B, 0x0009A005, 0x2128D233, -0xBD448901, 0x64B3E500, 0x490B65E3, 0xADBCEC01, -0x85F22DC2, 0x7001EE04, 0x31E7610D, 0x8D0281F2, -0xADA97A08, 0x7F140009, 0x6EF64F26, 0x6CF66DF6, -0x6AF66BF6, 0x000B69F6, 0xF7FF68F6, 0x2FE68000, -0xD2234F22, 0x60E36E22, 0x8D02C840, 0xBBE522E2, -0xE2400009, 0x2E284218, 0xBBF08901, 0x60E30009, -0x8905C810, 0xD21CD41B, 0x0009420B, 0x0009BBEF, -0xC80560E3, 0xBD6D8901, 0x60E30009, 0x8902C802, -0xABEC4F26, 0x4F266EF6, 0x6EF6000B, 0x001C3D3C, -0x00117760, 0x002014A6, 0x00201670, 0x0020351C, -0x00203DC0, 0x00203990, 0x00203584, 0x002014D0, -0x002039FC, 0x00203A04, 0x002039F8, 0x002039FA, -0x00201534, 0x002018D0, 0x00203A1C, 0x00008000, -0x001C3510, 0x00203DB4, 0x002018C0, 0x89014F22, -0x611B600B, 0x611BB00A, 0x000B4F26, 0x600B600B, -0x611BA004, 0x8DF12107, 0x8BF84011, 0x620D2F26, -0x8F3E3020, 0x40180019, 0x8B0B3016, 0x31043104, -0x31043104, 0x31043104, 0x31043104, 0x412462F6, -0x601C000B, 0x41296219, 0x20084018, 0x31048926, -0x31043104, 0x31043104, 0x31043104, 0x31043104, -0x31043104, 0x31043104, 0x31043104, 0x61193104, -0x3204221D, 0x32043204, 0x32043204, 0x32043204, -0x32043204, 0x32043204, 0x32043204, 0x32043204, -0x212D3204, 0x601962F6, 0x4024000B, 0x000BE000, -0x621362F6, 0x41294228, 0x31044224, 0x31044224, -0x31044224, 0x31044224, 0x31044224, 0x31044224, -0x31044224, 0x31044224, 0x31044224, 0x31044224, -0x31044224, 0x31044224, 0x31044224, 0x31044224, -0x31044224, 0x31044224, 0x602D4224, 0x62F6000B, -0x080A0C0E, 0x00020406, 0x1A1C1E20, 0x12141618, -0x2E303234, 0x26282A2C, 0x3A3C3E40, 0x6C625648, -0x41112F26, 0xE2208F18, 0x890B3123, 0x321CD204, -0xD1026220, 0x412B312C, 0x00090009, 0x0020349A, -0x00203450, 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, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x42707372, -0x3D206675, 0x554E203D, 0x202C4C4C, 0x6E49677A, -0x4E497274, 0x6D754E51, 0x0000003D, 0x61766E49, -0x2064696C, 0x72657375, 0x20726F20, 0x2079656B, -0x00214449, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63, -0x3D646E61, 0x00000000, 0x203A3051, 0x00000020, -0x203A3151, 0x00000020, 0x203A3251, 0x00000020, -0x203A3351, 0x00000020, 0x203A3451, 0x00000020, -0x2B434741, 0x73696F4E, 0x61432065, 0x7262696C, -0x6F697461, 0x6166206E, 0x6F206C69, 0x6974206E, -0x0D0A656D, 0x00000000, 0x00000072, 0x00205220, -0x62735576, 0x7473725F, 0x00000A0D, 0x62735576, -0x7375735F, 0x646E6570, 0x00000A0D, 0x62735576, -0x7365725F, 0x000A0D6D, 0x00000044, 0x44387570, -0x72637365, 0x6F747069, 0x3D584572, 0x00000000, -0x00000047, 0x72746E49, 0x6D652051, 0x2C797470, -0x49677A20, 0x4972746E, 0x754E514E, 0x00003D6D, -0x654C7245, 0x0000006E, 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, 0x020C020B, 0x020E020D, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x010E010D, 0x00020003, 0x01090108, 0x0002010A, -0x00030003, 0x02020201, 0x02040203, 0x02060205, -0x02020200, 0x02040203, 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, -0x0200010F, 0x02020201, 0x02040203, 0x02060205, -0x02020200, 0x02040203, 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, -0x010F010F, 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, 0x40030405, -0x02090100, 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, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x6621D2A8, 0x2008606D, 0xA1B18B01, 0x88100009, -0x88118922, 0x88128920, 0x8813891E, 0x8821891C, -0x8822891A, 0x883A8918, 0x883B8916, 0xE6448914, -0x30604608, 0xE6488910, 0x30604608, 0xE658890C, -0x30604608, 0x963D8908, 0x89053060, 0x3060963B, -0x96398902, 0x8B013060, 0xE010000B, 0x8B018820, -0xE020000B, 0x892B8837, 0x89298832, 0x89278835, -0x89258836, 0x89238830, 0x89218838, 0x891F8839, -0x891D8834, 0x891B8833, 0x4608E64C, 0x89173060, -0x3060961B, 0x96198914, 0x89113060, 0x30609617, -0x9615890E, 0x890B3060, 0x30609613, 0x96118908, -0x89053060, 0x3060960F, 0x960D8902, 0x8B0C3060, -0xE030000B, 0x05100165, 0x02300A10, 0x04300330, -0x06300530, 0x0B300A30, 0x88400C30, 0xA1428B01, -0x88410009, 0xA13E8B01, 0x88430009, 0xA13A8B01, -0x88480009, 0xA1368B01, 0x884A0009, 0xA1328B01, -0x884B0009, 0xA12E8B01, 0x884C0009, 0xA12A8B01, -0xE6800009, 0x3060666C, 0xA1248B01, 0xE6810009, -0x3060666C, 0xA11E8B01, 0xE6820009, 0x3060666C, -0xA1188B01, 0xE6830009, 0x3060666C, 0xA1128B01, -0xE6840009, 0x3060666C, 0xA10C8B01, 0xE6850009, -0x3060666C, 0xA1068B01, 0xE6860009, 0x3060666C, -0xA1008B01, 0xE6870009, 0x3060666C, 0xA0FA8B01, -0xE6880009, 0x3060666C, 0xA0F48B01, 0xE6890009, -0x3060666C, 0xA0EE8B01, 0xE68A0009, 0x3060666C, -0xA0E88B01, 0xE68B0009, 0x3060666C, 0xA0E28B01, -0xE68C0009, 0x3060666C, 0xA0DC8B01, 0xE68D0009, -0x3060666C, 0xA0D68B01, 0xE68E0009, 0x3060666C, -0xA0D08B01, 0xE68F0009, 0x3060666C, 0xA0CA8B01, -0xE6900009, 0x3060666C, 0xA0C48B01, 0xE6910009, -0x3060666C, 0xA0BE8B01, 0xE6F80009, 0x3060666C, -0xA0B88B01, 0xE6F90009, 0x3060666C, 0xA0B28B01, -0xE6FA0009, 0x3060666C, 0xA0AC8B01, 0xE6FB0009, -0x3060666C, 0xA0A68B01, 0xE6FC0009, 0x3060666C, -0xA0A08B01, 0xE6FD0009, 0x3060666C, 0xA09A8B01, -0xE6FE0009, 0x3060666C, 0xA0948B01, 0xE6FF0009, -0x3060666C, 0xA08E8B01, 0xE6D00009, 0x3060666C, -0xA0888B01, 0xE6D10009, 0x3060666C, 0xA0828B01, -0xE6D20009, 0x3060666C, 0xA07C8B01, 0xE6D30009, -0x3060666C, 0xE6D48977, 0x3060666C, 0xE6D58973, -0x3060666C, 0xE6D6896F, 0x3060666C, 0xE6D7896B, -0x3060666C, 0xE6D88967, 0x3060666C, 0xA0038963, -0x00000009, 0x00114000, 0x666CE6D9, 0x895A3060, -0x666CE6DA, 0x89563060, 0x666CE6DB, 0x89523060, -0x666CE6DC, 0x894E3060, 0x666CE6DD, 0x894A3060, -0x666CE6F0, 0x89463060, 0x666CE6F1, 0x89423060, -0x666CE6F2, 0x893E3060, 0x666CE6F3, 0x893A3060, -0x666CE6F4, 0x89363060, 0x666CE6F5, 0x89323060, -0x666CE6F6, 0x892E3060, 0x666CE6F7, 0x892A3060, -0x4608E650, 0x89263060, 0x3060969A, 0x96988923, -0x89203060, 0x30609696, 0x9694891D, 0x891A3060, -0x30609692, 0x96908917, 0x89143060, 0x3060968E, -0x968C8911, 0x890E3060, 0x3060968A, 0x9688890B, -0x89083060, 0x30609686, 0x96848905, 0x89023060, -0x30609682, 0x000B8B01, 0xE0FFE040, 0x600C000B, -0xE000000B, 0x6243D157, 0xE4028512, 0x662D670D, -0xE500A00E, 0x6053655D, 0x305C4000, 0x4008D152, -0x622D021D, 0x8B023260, 0xA0047108, 0x7501041C, -0x3273625D, 0x60438BEE, 0xC90A000B, 0x674C76FE, -0x025C606C, 0x3723622C, 0x20088906, 0x70FF8902, -0x6603AFF6, 0xE000000B, 0x0009000B, 0x4F124F22, -0x326052F2, 0x34508910, 0x3470890E, 0x3750890D, -0x3268890A, 0x04273458, 0x60733758, 0x440BD43B, -0x306C011A, 0x6203A001, 0x4F166263, 0x000B4F26, -0x2FE66023, 0x4F124F22, 0x6E434F02, 0x614C54F4, -0x2F164118, 0x666C677C, 0x64EC655C, 0x46184718, -0xBFD34518, 0x65034418, 0x60537F04, 0xC980E702, -0x6E034718, 0x37ED4728, 0x62594519, 0x010A652E, -0x312C225D, 0x4F06601C, 0x4F264F16, 0x6EF6000B, -0x03400240, 0x05400440, 0x07400640, 0x09400840, -0x11400B40, 0x0A401240, 0x4F220A50, 0x614C8451, -0x3127620C, 0xA00C8901, 0x8452E400, 0x3127620C, -0xA0068901, 0x8453E401, 0x3127620C, 0xE4038D01, -0x6263E402, 0x60437201, 0x677C072C, 0x62532F76, -0x072C7201, 0x055C066C, 0x666C677C, 0xBFA8655C, -0x7F046413, 0x000B4F26, 0x605C600C, 0x8F068801, -0x606C6243, 0x8B018801, 0x720AA001, 0x000B72F6, -0x00006023, 0x00114000, 0x00114008, 0x00203374, -0xE040D690, 0x056E614C, 0x9274D78F, 0x352C357C, -0xE400E718, 0x626C6650, 0x89043120, 0x624C7401, -0x8FF73273, 0x000B7501, 0xE2FF6043, 0x622C644C, -0x890D3420, 0x8801605C, 0x965D8B03, 0xA005346C, -0x62436243, 0x324C4208, 0x326C9657, 0x6023000B, -0x6043000B, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, -0x4F222FE6, 0x92497FF4, 0x6B533526, 0x00296943, -0xE13FCA01, 0x6E03EAFF, 0x6AAC2F10, 0x6D43EC00, -0x62D0E808, 0x34A0642C, 0xBFCE8939, 0x3B0065E3, -0x6CCC8F0A, 0x420062C3, 0x362C6693, 0x1FC18461, -0x4109610C, 0x2F10A02D, 0x891C2CC8, 0x65E364D0, -0x644CBFBB, 0x89163B02, 0x70FF60C3, 0x049C4000, -0x644C65E3, 0x1F02BFB1, 0x8D1A30B2, 0x56F21FC1, -0x356C6593, 0xC9038451, 0x89122008, 0x660C8451, -0xA00E4609, 0x7C012F60, 0x328362CC, 0x8FC87D02, -0xA0061F21, 0x06250009, 0x12C008FC, 0x62CC09B4, -0x50F11F21, 0x8B128808, 0x7CFF6CCC, 0x60C34C00, -0x65E3049C, 0x644CBF89, 0x8B083B06, 0x849139CC, -0x2008C903, 0x84918903, 0x4209620C, 0x60F02F20, -0x4F267F0C, 0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, -0x68F6000B, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, -0x4F222FE6, 0x92727FFC, 0x3426E100, 0x6B436953, -0x2F12666C, 0xCA010029, 0x8D032668, 0xE2F06E03, -0x2F22622C, 0x6AACEAFF, 0x6C93ED00, 0x66C0E808, -0x34A0646C, 0xBF508913, 0x3B0065E3, 0x6DDC8B0A, -0x39DC4D00, 0xC9038491, 0x8B082008, 0xCB0F60F2, -0x2F02A005, 0x62DC7D01, 0x8FE83283, 0x60F27C02, -0x4F267F04, 0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, -0x68F6000B, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, -0x4F222FE6, 0x4F024F12, 0x3F3C9332, 0x4308E35B, -0x605333FC, 0x80341351, 0xE7606063, 0x80381362, -0x4708E012, 0xE03F8136, 0xD11237FC, 0x27008138, -0x80788074, 0xE9166053, 0x60638012, 0x21414918, -0x6B938013, 0xEDFF6AB4, 0x6AAC61B0, 0x6C1C4A18, -0x68C82CAB, 0x6DDD688D, 0x234238D0, 0x8B131398, -0xD207D406, 0x0009420B, 0x432BD306, 0x09B40009, -0x0000FE10, 0x001142D8, 0x000DDD00, 0x001160B0, -0x002018C0, 0x00115E88, 0x342292E3, 0x8F02E100, -0xA1616593, 0x92DD0009, 0x352CE7FF, 0xEE04677C, -0x622C6250, 0x89043270, 0x621C7101, 0x8FF732E3, -0xE8FC7501, 0x3488688C, 0x9ACBE064, 0x40086893, -0x0F4438AC, 0x661C6583, 0x644CBE18, 0x64E36E0C, -0x65E37401, 0x45086643, 0x35EC4608, 0x4508364C, -0x45004608, 0x369C4600, 0x61A39AB5, 0xE0656763, -0x400837AC, 0x62637114, 0x321C0F76, 0x94AB7004, -0x61430F26, 0x359C6263, 0x7004324C, 0x0F267114, -0x7004361C, 0x0F666753, 0x700437AC, 0x7A140F76, -0x37AC6753, 0x66537004, 0x364C0F76, 0x74147004, -0x354C0F66, 0x0F567004, 0x395C958F, 0xED006A93, -0x6BD3E956, 0xEC054908, 0x4008E065, 0x60B302FE, -0x644C042C, 0x60E32F46, 0xE06A07AC, 0x01FE4008, -0x061C60B3, 0x058C60E3, 0x4008E065, 0x677C01FC, -0x655C666C, 0x641CBDED, 0x7F046403, 0x60D36DDC, -0xE0660F44, 0x04FE4008, 0x054C60B3, 0x2F56655C, -0x07AC60E3, 0x4008E06B, 0x60B301FE, 0x60E3061C, -0xE065058C, 0x01FC4008, 0x666C677C, 0xBDD0655C, -0x6403641C, 0x65F37F04, 0x60D37510, 0xE0650544, -0x07FE4008, 0x057C60C3, 0x2F56655C, 0x07AC60E3, -0x4008E06A, 0x60C301FE, 0x60E3061C, 0xE065058C, -0x01FC4008, 0x666C677C, 0xBDB2655C, 0x6403641C, -0x61F37F04, 0x60D37120, 0xE0660144, 0x02FE4008, -0x052C60C3, 0x2F56655C, 0x07AC60E3, 0x4008E06B, -0x60C301FE, 0x60E3061C, 0xE065058C, 0x01FC4008, -0x666C677C, 0xBD94655C, 0x6503641C, 0x64F37F04, -0x60D3349C, 0xE0670454, 0x07FE4008, 0x057C60B3, -0x2F56655C, 0x07AC60E3, 0x4008E06C, 0xA00501FE, -0x0BB860B3, 0x03C2013E, 0x013F0462, 0x60E3061C, -0xE065058C, 0x01FC4008, 0x666C677C, 0xBD70655C, -0x6203641C, 0xE1B87F04, 0x64F3611C, 0x60D3341C, -0xE0680424, 0x05FE4008, 0x075C60B3, 0x2F76677C, -0x07AC60E3, 0x4008E06D, 0x60B301FE, 0x60E3061C, -0xE065058C, 0x02FC4008, 0x666C677C, 0xBD50655C, -0x6703642C, 0xE2C07F04, 0x66F3622C, 0x60D3362C, -0xE0670674, 0x07FE4008, 0x027C60C3, 0x2F26622C, -0x07AC60E3, 0x4008E06C, 0x60C302FE, 0x60E3062C, -0xE065058C, 0x02FC4008, 0x666C677C, 0xBD30655C, -0x6203642C, 0xE7C87F04, 0x66F3677C, 0x60D3367C, -0xE0680624, 0x06FE4008, 0x026C60C3, 0x2F26622C, -0x07AC60E3, 0x4008E06D, 0x60C302FE, 0x60E3062C, -0xE065058C, 0x02FC4008, 0x666C677C, 0xBD10655C, -0x6103642C, 0x66937F04, 0x62F37608, 0x60D3326C, -0x02147D01, 0xE60562DC, 0x7C013263, 0x7B018D02, -0x0009AEFA, 0x0009A17B, 0xE7FF9BD5, 0x677C35BC, -0x6250EE08, 0x3270622C, 0x71018904, 0x32E3621C, -0x75018FF7, 0xDDD89CC8, 0x3D4534C8, 0x4008E064, -0x4E090E0A, 0x0FE46593, 0x702435BC, 0x64EC661C, -0x0F56BCB4, 0x64E36E0C, 0x65E37401, 0x45086243, -0x35EC4208, 0x4508324C, 0x45004208, 0x329C4200, -0x61B37B0C, 0x38BC6823, 0x7114E06E, 0x40086B23, -0x91A23B1C, 0x70040F86, 0x68236413, 0x0FB6359C, -0x7004381C, 0x0F867414, 0x7004342C, 0x67539896, -0x0F466253, 0x7004378C, 0x6B537814, 0x7114321C, -0x3B8C0F76, 0x351C7004, 0x0FB69789, 0x397C7004, -0x70040F26, 0xED006893, 0x0F56EC05, 0x6AD3E956, -0xE06E4908, 0x02FE4008, 0x012C60A3, 0x2F16611C, -0x078C60E3, 0x4008E073, 0x60A304FE, 0xE06E064C, -0x0BFE4008, 0x05BC60E3, 0x4008E065, 0x677C01FC, -0x655C666C, 0x641CBC85, 0x7F046403, 0x60D36DDC, -0xE06F0F44, 0x04FE4008, 0x054C60A3, 0x2F56655C, -0x078C60E3, 0x4008E074, 0x60A30BFE, 0xE06E06BC, -0x0BFE4008, 0x05BC60E3, 0x4008E065, 0x677C01FC, -0x655C666C, 0x641CBC65, 0x7F046403, 0x751065F3, -0x054460D3, 0x4008E06E, 0x60C307FE, 0x655C057C, -0x60E32F56, 0xE073078C, 0x0BFE4008, 0x06BC60C3, -0x4008E06E, 0x60E301FE, 0xE065051C, 0x0BFC4008, -0x666C677C, 0xBC44655C, 0x610364BC, 0x6BF37F04, -0x60D37B20, 0xE06F0B14, 0x01FE4008, 0x041C60C3, -0x2F46644C, 0x078C60E3, 0x4008E074, 0x60C301FE, -0xE06E061C, 0x0BFE4008, 0x05BC60E3, 0x4008E065, -0xA00501FC, 0x0136677C, 0x028212C0, 0x01370142, -0x655C666C, 0x641CBC1D, 0x7F046203, 0x349C64F3, -0x042460D3, 0x4008E070, 0x60A304FE, 0x655C054C, -0x60E32F56, 0xE075078C, 0x0BFE4008, 0x06BC60A3, -0x4008E06E, 0x60E301FE, 0xE065051C, 0x0BFC4008, -0x666C677C, 0xBBFC655C, 0x610364BC, 0xEBB87F04, -0x65F36BBC, 0x60D335BC, 0xE0710514, 0x07FE4008, -0x047C60A3, 0x2F46644C, 0x078C60E3, 0x4008E076, -0x60A30BFE, 0xE06E06BC, 0x01FE4008, 0x051C60E3, -0x4008E065, 0x677C0BFC, 0x655C666C, 0x64BCBBD9, -0x7F046103, 0x622CE2C0, 0x3B2C6BF3, 0x0B1460D3, -0x4008E070, 0x60C302FE, 0x677C072C, 0x60E32F76, -0xE075078C, 0x02FE4008, 0x062C60C3, 0x4008E06E, -0x60E302FE, 0xE065052C, 0x02FC4008, 0x666C677C, -0xBBB6655C, 0x6703642C, 0xEBC87F04, 0x66F36BBC, -0x60D336BC, 0xE0710674, 0x06FE4008, 0x026C60C3, -0x2F26622C, 0x078C60E3, 0x4008E076, 0x60C302FE, -0xE06E062C, 0x02FE4008, 0x052C60E3, 0x4008E065, -0x677C02FC, 0x655C666C, 0x642CBB93, 0x7F046103, -0x72086293, 0x362C66F3, 0x7D0160D3, 0x62DC0614, -0x3263E605, 0x8D027C01, 0xAEE27A01, 0x6EF30009, -0xE2B068F3, 0x6AF3E05A, 0x389C7E18, 0x69F3622C, -0x7A084008, 0x67F36DF3, 0x392C61F3, 0x6CA30FE6, -0x77207D10, 0xE4007128, 0xEB0565F3, 0x604C6654, -0x66D4626C, 0x2E604221, 0x048C6674, 0x626C2C20, -0x09444221, 0x21207001, 0x32B3620C, 0x71016403, -0x8FEB7E01, 0xE05A7C01, 0x6EF34008, 0x7E300BFE, -0xEC19ED00, 0x66B365A3, 0xBB7E64DC, 0x62DC7D01, -0x2E0032C3, 0x7E018FF6, 0x666CE6B0, 0x6BF36EF3, -0x7B283E6C, 0xEC4CA010, 0xCCCCCCCD, 0x64D36DDC, -0x644C74F4, 0xBB6865B3, 0x67F366E3, 0x77306503, -0x075460D3, 0x62DC7D01, 0x8BEF32C3, 0x7B306BF3, -0x61B367B3, 0xED8064B3, 0x71027701, 0x6DDC7403, -0xDC37E500, 0x605CDE37, 0x091C084C, 0x0A7C668C, -0x699C4628, 0x49284618, 0x05BC6AAC, 0x4A18269B, -0x70046803, 0x655C26AB, 0x620C38CC, 0x38EC265B, -0x286232D3, 0x65038FE7, 0x644CE4B8, 0x3C4C6CF3, -0x6EF37408, 0xE2B0E658, 0x3E4C6AF3, 0x74086BF3, -0x460861F3, 0x622C68F3, 0x7A0869F3, 0x314C7B18, -0x386C64F3, 0x6DA3392C, 0x742867B3, 0x66C4E500, -0x626C605C, 0x422166E4, 0x66142760, 0x2D20058C, -0x4221626C, 0x70010954, 0x620C2420, 0x3263E605, -0x74016503, 0x8FEA7701, 0xE05E7D01, 0x02FD4008, -0x6D2DE9D0, 0x699C7D07, 0xEE00A00B, 0x66B365A3, -0x64ECBAFB, 0x620367F3, 0x60EC379C, 0x70010724, -0x62EC6E03, 0x8BF132D3, 0x4008E05F, 0xEAB008FD, -0x6DF36AAC, 0x6BF36C8D, 0x7C0D3DAC, 0x7B28A012, -0x0000A280, 0x001BC000, 0x64E36EEC, 0x644C74F4, -0xBADA65B3, 0x62F366D3, 0x329C6103, 0x7E0160E3, -0x62EC0214, 0x8BEF32C3, 0x3D9C6DF3, 0x67D36ED3, -0xEC8061D3, 0x77027E01, 0x6CCC7103, 0xDBB9E400, -0x604CDAB9, 0x067C041C, 0x08EC654C, 0x666C4528, -0x46284518, 0x09DC688C, 0x4818256B, 0x70046603, -0x699C258B, 0x620C36BC, 0x36AC259B, 0x265232C3, -0x64038FE7, 0x4008E064, 0x70E007FC, 0x706C0CFC, -0x0F8668CC, 0x0DFC7098, 0x6ADC706C, 0x708C0FA6, -0x9BBF0EFE, 0xE2543EB2, 0x697CE100, 0x42088F02, -0x0009A163, 0x4008E063, 0x6EF305FE, 0x3E2C96B3, -0x64E3356C, 0xEDFFE703, 0x32D06250, 0x622C8D07, -0x681C7101, 0x24203873, 0x8FF57505, 0xE0647401, -0x0AFC4008, 0x64AC65E3, 0x661CBA18, 0xE063670C, -0x62734008, 0x42080BFE, 0x7701327C, 0x3A2C6AB3, -0x48086873, 0x948F6EA3, 0x3E4C387C, 0x3B8C74FF, -0x38283A4C, 0xEC003B4C, 0x6083DD88, 0x655C05EC, -0xE0652F56, 0x67B04008, 0x65A066E4, 0x677C01FC, -0x655C666C, 0x641CBA1D, 0x7C017F04, 0xE40462CC, -0x2D003243, 0x7D018FE9, 0xE063E554, 0x67F34508, -0x375C4008, 0x966805FE, 0x356CEDFF, 0x6DDC6473, -0xEE04E100, 0x666C6650, 0x890636D0, 0x621C7101, -0x246032E3, 0x8FF57505, 0xE0647401, 0x02FC4008, -0x642C6573, 0x661CB9CA, 0x6E23620C, 0xE0634E08, -0x72013E2C, 0x0BFE4008, 0x47086723, 0x6AB3372C, -0x68733AEC, 0x6EA338E8, 0x3E1C9140, 0x3B7C71FF, -0x3B1C3A1C, 0x0F96704C, 0xEC00E904, 0x6083DD60, -0x644C04EC, 0xE0652F46, 0x67B04008, 0x65A066E4, -0x677C01FC, 0x655C666C, 0x641CB9CB, 0x7C017F04, -0x329362CC, 0x8FEA2D00, 0xE0767D01, 0x09FE4008, -0x70B4E454, 0x67F34408, 0x374C05FE, 0xEDFF9617, -0x356C6473, 0xE1006DDC, 0x6650EE04, 0x36D0666C, -0x71018906, 0x32E3621C, 0x75092460, 0x74018FF5, -0xE064A006, 0x05BA0BB8, 0x05C905BB, 0x05DD05CA, -0x65734008, 0x661C07FC, 0x647CB970, 0x6623620C, -0x4608E063, 0x46004008, 0x362C0BFE, 0x68237201, -0x3A6C6AB3, 0x48004808, 0x91676EA3, 0x3E1C382C, -0x3B8C71FF, 0x38683A1C, 0xEC003B1C, 0x6083DD35, -0x644C04EC, 0xE0652F46, 0x67B04008, 0x65A066E4, -0x677C01FC, 0x655C666C, 0x641CB973, 0x7C017F04, -0xE50862CC, 0x2D003253, 0x7D018FE9, 0x4008E063, -0x05FEE654, 0x64F34608, 0xECFF9741, 0x357C346C, -0xEE006CCC, 0x6250ED04, 0x32C0622C, 0x7E018906, -0x38D368EC, 0x75092420, 0x74018FF5, 0x4008E077, -0x700405FE, 0x649306FE, 0xEA54B9A7, 0x65F34A08, -0x640C35AC, 0x66ECB91A, 0x6613610C, 0x4608E063, -0x46004008, 0x361C0BFE, 0x68137101, 0x3A6C6AB3, -0x48004808, 0x92136EA3, 0x3E2C381C, 0x3B8C72FF, -0x38683A2C, 0xEC003B2C, 0xE077DD0B, 0x05FE4008, -0x06FE7004, 0x6493B981, 0x0009A010, 0x060105DE, -0x00000602, 0x0000B280, 0x001BC000, 0x001142E4, -0x001142E8, 0x001142ED, 0x001142F5, 0x60836403, -0x677C07EC, 0x67B02F76, 0x65A066E4, 0x666C677C, -0xB906655C, 0x7F04644C, 0x61CC7C01, 0x3123E208, -0x8FD22D00, 0xA0FC7D01, 0xE0630009, 0x05FE4008, -0x96D067F3, 0x356C372C, 0xEEFF6473, 0x32E06250, -0x622C8D08, 0x681C7101, 0x3863E608, 0x75052420, -0x74018FF4, 0x4008E064, 0x657302FC, 0xB8B5642C, -0x650C661C, 0x4008E063, 0x0BFE6253, 0x325C4208, -0x6AB37501, 0x68533A2C, 0x6EA34808, 0x385C94AC, -0x74FF3E4C, 0x3A4C3B8C, 0x3B4C3828, 0xDD96EC00, -0x06EC6083, 0x2F66666C, 0x4008E065, 0x66E467B0, -0x01FC65A0, 0x666C677C, 0xB8BA655C, 0x7F04641C, -0x62CC7C01, 0x3243E404, 0x8FE92D00, 0xE5547D01, -0x4508E063, 0x400867F3, 0x05FE375C, 0xEEFF9685, -0x6473356C, 0xE1006EEC, 0x666C6650, 0x890736E0, -0x621C7101, 0x3283E808, 0x75092460, 0x74018FF4, -0x4008E064, 0x65730AFC, 0xB86764AC, 0x620C661C, -0xE0636623, 0x40084608, 0x0BFE4600, 0x7201362C, -0x6AB36823, 0x48083A6C, 0x6EA34800, 0x382C915E, -0x71FF3E1C, 0x3A1C3B8C, 0x3B1C3868, 0xDD6FEC00, -0x04EC6083, 0x2F46644C, 0x4008E065, 0x66E467B0, -0x01FC65A0, 0x666C677C, 0xB86A655C, 0x7F04641C, -0x62CC7C01, 0x3253E508, 0x8FE92D00, 0xE0637D01, -0xE6544008, 0x460805FE, 0x973864F3, 0x346CECFF, -0x6CCC357C, 0xED08EE00, 0x666C6650, 0x890636C0, -0x62EC7E01, 0x246032D3, 0x8FF57509, 0xE0777401, -0x05FE4008, 0x06FE7004, 0xB89E6493, 0x4808E854, -0x358C65F3, 0xB811640C, 0x610C66EC, 0xE0636613, -0x40084608, 0x0BFE4600, 0x7101361C, 0x6AB36813, -0x48083A6C, 0x6EA34800, 0x381C920A, 0x72FF3E2C, -0xA0063B8C, 0x05023A2C, 0x052A0503, 0x0572052B, -0x38680573, 0xEC003B2C, 0xE077DD41, 0x05FE4008, -0x06FE7004, 0x6493B871, 0x60836403, 0x677C07EC, -0x67B02F76, 0x65A066E4, 0x666C677C, 0xB808655C, -0x7F04644C, 0x61CC7C01, 0x3123E208, 0x8FE42D00, -0xD3347D01, 0x0009430B, 0xE079620C, 0x0F244008, -0x88306023, 0xA24D8B01, 0x88400009, 0xA2498B01, -0x22280009, 0xA2458B01, 0xE5FF0009, 0x655CD42A, -0xE03AE601, 0x8F043250, 0xE0790464, 0x4008E210, -0xE05B0F24, 0x05FE4008, 0x3566963B, 0xA1498B01, -0x60230009, 0x640CCB01, 0x6E23B842, 0xE118660C, -0x890F3613, 0x4008E063, 0x04FE4608, 0x97294608, -0x460070E0, 0x05FE347C, 0x346CB85C, 0xE0606203, -0x0F244008, 0xCB0260E3, 0x640CB82A, 0xE118660C, -0x890F3613, 0x4008E063, 0x04FE4608, 0x91114608, -0x460070E0, 0x05FE341C, 0x346CB844, 0xE0616203, -0x0F244008, 0xCB0560E3, 0x640CB812, 0xA00D660C, -0x09B4E07A, 0x0000064D, 0x001142FD, 0x00114301, -0x00114309, 0x00114400, 0x001142D8, 0x4008E118, -0x8F043613, 0xE0610F64, 0xA0104008, 0xE07A0DFC, -0x06FC4008, 0x626C70A4, 0x04FE4208, 0x97B44208, -0x420070E0, 0x05FE347C, 0x342CB814, 0xE0796D03, -0x00FC4008, 0xCB07DB8E, 0x430BD38E, 0x610C640C, -0x4008E07A, 0x709C0F14, 0xE61802FC, 0x8D1C3163, -0xE05D682C, 0x01FC4008, 0x09FC70FC, 0x04FE70FC, -0xD385661C, 0x659C430B, 0xE07A6503, 0x01FC4008, -0x611C70A4, 0x04FE4108, 0x97864108, 0x347C4100, -0x430BD37E, 0xA003341C, 0xE0616C03, 0x0CFC4008, -0xE500D67B, 0x640D8562, 0x4008E05B, 0x0AFEA036, -0x6053655C, 0x305C4000, 0x4008D676, 0x622D026D, -0x8F2A32A0, 0xD3746E03, 0x64AD430B, 0x2228620D, -0xD6728927, 0x066C60E3, 0x4008E060, 0x460002FC, -0x3E676E2C, 0x62638B00, 0x4008E060, 0x0F243867, -0x62638D03, 0x4008E061, 0xE06102FC, 0x400861DC, -0x0F243167, 0x8F01682C, 0x626362D3, 0x346764CC, -0x6D238D01, 0xA00466C3, 0x75016C63, 0x3243625C, -0xE0608BC6, 0x07FC4008, 0x617CE400, 0xE904D55C, -0x666C6650, 0x8B013617, 0x6673677C, 0x624C7401, -0x25603293, 0x75018FF4, 0xE03AD656, 0xE400056C, -0x8D012558, 0xE2026243, 0x4008E061, 0x67830EFC, -0x3E283828, 0x9119E500, 0x6053655C, 0x3A1002BC, -0x622C8D0B, 0x3A609613, 0x32778907, 0xE0618B02, -0x02FC4008, 0xA01D6053, 0x25580B24, 0x32878908, -0x62838B00, 0xA0156053, 0x064D0B24, 0x099E096C, -0x8F083277, 0xE07B6623, 0x0F164008, 0x02FC7098, -0x01FE7068, 0x626C662C, 0x32876053, 0x0B648F02, -0x646336E8, 0x625C7501, 0x8BCD3293, 0xE014D635, -0xE4000644, 0xD53461DC, 0x6250E708, 0x3217622C, -0x6DDC8B01, 0x740162D3, 0x3673664C, 0x8FF42520, -0xE4007501, 0xD52D61CC, 0x622C6250, 0x8B013217, -0x62C36CCC, 0x664C7401, 0x25203673, 0x75018FF4, -0x0009A0EC, 0x4008E079, 0x642C02FC, 0x430BD319, -0x660C6E43, 0x3653E518, 0xE0638910, 0x46084008, -0x460804FE, 0x70E09722, 0x347C4600, 0xD31305FE, -0x346C430B, 0xE0626203, 0x0F244008, 0xCB0660E3, -0x430BD30C, 0x660C6403, 0x3653E518, 0xE0638928, -0x46084008, 0x460804FE, 0x70E09708, 0x347C4600, -0xD30605FE, 0x346C430B, 0x6C03A01D, 0x0000064D, -0x001142E8, 0x001148E0, 0x001148BA, 0x00114934, -0x00114000, 0x00114008, 0x00114774, 0x00114011, -0x001142E4, 0x001142D8, 0x001142ED, 0x001142F5, -0x4008E062, 0x60E30CFC, 0xD39CCB08, 0x6403430B, -0xE07A610C, 0x4008E618, 0x8D1C3163, 0xE05D0F14, -0x07FC4008, 0x09FC70FC, 0x04FE70FC, 0xD394667C, -0x659C430B, 0xE07A6503, 0x01FC4008, 0x611C70A4, -0x04FE4108, 0x9D744108, 0x34DC4100, 0x430BD38D, -0xA003341C, 0xE0626D03, 0x0DFC4008, 0xE500D68A, -0x640D8562, 0x4008E05B, 0x01FEA02C, 0x6053655C, -0x305C4000, 0x4008D685, 0x622D026D, 0x8F203210, -0xD3836E03, 0x641D430B, 0x2228620D, 0xD681891D, -0x066C60E3, 0x4008E062, 0x460002FC, 0x3167612C, -0x62638B00, 0x64CCE062, 0x34674008, 0x8F010F24, -0x626362C3, 0x356765DC, 0x6C238D01, 0xA00466D3, -0x75016D63, 0x3243625C, 0xE0628BD0, 0x07FC4008, -0x617CE400, 0xE904D570, 0x622C6250, 0x8B013217, -0x6273677C, 0x664C7401, 0x25203693, 0x75018FF4, -0x61CCE400, 0xE708D569, 0x666C6650, 0x8B013617, -0x66C36CCC, 0x624C7401, 0x25603273, 0x75018FF4, -0x61DCE400, 0x6650D562, 0x3617666C, 0x6DDC8B01, -0x740166D3, 0x3273624C, 0x8FF42560, 0xA0057501, -0x064D0009, 0xE200D65B, 0x0624E03A, 0xE03AD659, -0x2228026C, 0xE039894B, 0x2228026C, 0xE05B8947, -0x0EFE4008, 0x3E669690, 0xE0798941, 0x00FC4008, -0x8D023E66, 0xCB02640C, 0xD344640C, 0x0009430B, -0xE05C660C, 0x07FC4008, 0x4608701C, 0x617C05FE, -0x977A4608, 0x357C4600, 0x6613356C, 0x430BD346, -0xD54464E3, 0x62032008, 0x0029150F, 0x6603CA01, -0x2668E03B, 0x05648D20, 0xC8F06023, 0xD53F8909, -0x76FF6650, 0x84512560, 0x805170FF, 0x70FF8452, -0x60238052, 0x890FC80F, 0x6260D639, 0x26207201, -0x70018461, 0x84628061, 0xA0057001, 0xD6318062, -0xE03BE200, 0x162F0624, 0x4008E05B, 0x964302FE, -0x8B653266, 0xD72BD428, 0xD52E6040, 0x4028C93F, -0x40084008, 0x50726203, 0xC802D12B, 0xE604891A, -0x46284618, 0x2522226B, 0xE2086040, 0x6503C93F, -0x66034508, 0x45004508, 0x46284218, 0x6263252B, -0x42084208, 0x252B4200, 0x4218E208, 0x252B4228, -0x2152A062, 0x4618E614, 0x226B4628, 0x60402522, -0xC93FE428, 0x45086503, 0x45084028, 0x45004008, -0x40084418, 0x254BE728, 0x47184000, 0x4728250B, -0xD412257B, 0x2152A044, 0x064D09B4, 0x001148E0, -0x001148BA, 0x00114934, 0x00114000, 0x00114008, -0x00114774, 0x00114011, 0x001142FD, 0x00114301, -0x00114309, 0x001142D8, 0x00114A24, 0x001142F5, -0x001142ED, 0x001C3694, 0x001C3BB4, 0x001142E8, -0xE214D429, 0x42186040, 0x4028C93F, 0x40084008, -0xD6264228, 0x2602202B, 0xE7286040, 0x6503C93F, -0x45084508, 0x45004028, 0x40084718, 0x4008257B, -0x4000E728, 0x250B4718, 0xD21D4728, 0x2252257B, -0xD71C6240, 0x0724E044, 0x3F3C932C, 0x4F164F06, -0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, -0x2FE668F6, 0x6243D114, 0xE4028512, 0x6E2D670D, -0xE500A00F, 0x6053655D, 0x305C4000, 0x4008D10F, -0x622D021D, 0x8B0332E0, 0x041C7108, 0x644CA004, -0x625D7501, 0x8BED3273, 0x4618E602, 0x604D2469, -0x6EF6000B, 0x000001F0, 0x001142E8, 0x001C3694, -0x001C3BB4, 0x001142D8, 0x00114000, 0x00114008, -0xD766D565, 0x62725151, 0x321CE340, 0x51522722, -0x337C5271, 0x1721321C, 0x52725153, 0x321C644C, -0x1722D15F, 0x66125255, 0x2162362C, 0x316C5173, -0x61521713, 0xD65B5274, 0x1724321C, 0x52755154, -0x1725321C, 0x52765158, 0x1726321C, 0x51776262, -0x1717312C, 0x51785261, 0x1718312C, 0x51795262, -0x1719312C, 0x517A5263, 0x171A312C, 0x517B5264, -0x171B312C, 0x517C5265, 0x171C312C, 0x517D5266, -0x171D312C, 0x517E5267, 0x171E312C, 0x527F5168, -0x321CD645, 0x6262172F, 0x76946132, 0x2312312C, -0x52316162, 0x321CD641, 0x515C1321, 0x351C5532, -0x61621352, 0x41295235, 0x1325321C, 0x56365561, -0x365C4529, 0x1366E538, 0x55312450, 0x71046143, -0x66722152, 0x75086543, 0x56712562, 0x750C6543, -0x56722562, 0x75106543, 0x56752562, 0x75146543, -0x56732562, 0x75186543, 0x56762562, 0x751C6543, -0x56322562, 0x75206543, 0x66322562, 0x75246543, -0x56742562, 0x75286543, 0x56342562, 0x752C6543, -0x55332562, 0x72306243, 0x55352252, 0x72346243, -0x56362252, 0x24627438, 0x1341E400, 0x17412742, -0x17451742, 0x17461743, 0x23421342, 0x13441744, -0x13451343, 0x1346000B, 0xD510E124, 0x51572410, -0x52581411, 0x57591422, 0x515A1473, 0x525B1414, -0x575C1425, 0x525D1476, 0x1427E700, 0x1468565E, -0x1469565F, 0x15781577, 0x157A1579, 0x157C157B, -0x157E157D, 0x157F000B, 0x001C369C, 0x0020351C, -0x00203578, 0x001C3CA0, 0x001C36F4, 0x001C3B88, -0x6E726157, 0x21676E69, 0x69685420, 0x6F642073, -0x656C676E, 0x746F6E20, 0x65656220, 0x6163206E, -0x7262696C, 0x64657461, 0x0000000A, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, -}; - -const u32_t zcFwBufImageSize=83968; diff --git a/drivers/staging/otus/hal/hpfwspiu.c b/drivers/staging/otus/hal/hpfwspiu.c deleted file mode 100644 index eda7ff5e573c..000000000000 --- a/drivers/staging/otus/hal/hpfwspiu.c +++ /dev/null @@ -1,655 +0,0 @@ -/* - * 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; diff --git a/drivers/staging/otus/hal/hpfwu.c b/drivers/staging/otus/hal/hpfwu.c deleted file mode 100644 index 68fabef180af..000000000000 --- a/drivers/staging/otus/hal/hpfwu.c +++ /dev/null @@ -1,1017 +0,0 @@ -/* - * 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, 0xDE947FFC, 0xE114D594, -0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769, -0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F, -0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B, -0x0009B017, 0xE60095AC, 0xC84060E2, 0x2F028F03, -0x8FF93652, 0xD4887601, 0x4E0BDE88, 0xD4880009, -0x00094E0B, 0x4E0BD487, 0x7F040009, 0xA0524F26, -0x4F226EF6, 0x410BD184, 0xD4840009, 0x0009440B, -0x450BD583, 0xD7830009, 0xD283E1FF, 0x2712611D, -0xD4825029, 0xE1FFCB01, 0x1209E501, 0x12112212, -0xE7202452, 0x4718D57E, 0x2572D27E, 0xD17EE700, -0xD67FD47E, 0xE2012270, 0x24702172, 0xD67D2620, -0x2641E4FF, 0xD57CE600, 0x666DE104, 0x76016063, -0x4000626D, 0x8FF83212, 0xD5780545, 0x2520E201, -0xD278D777, 0xE480E100, 0x22122710, 0x6613D576, -0x666D644C, 0x76046763, 0x375C626D, 0x8FF83243, -0xD5722712, 0xD273D772, 0xE400E101, 0x27102511, -0x000B4F26, 0x7FCC2242, 0xD170D56F, 0xD271DB70, -0x1F51D471, 0xD6717508, 0x1F12D771, 0x1F55710C, -0x1FB975FC, 0x72041F2A, 0x1F13EB10, 0x1F561F44, -0x1F781F67, 0xD86B1F2B, 0xDD6CD96B, 0xDC6CEA00, -0xD26DDE6C, 0x89003A22, 0xD15D7A01, 0x88016010, -0x56F88B03, 0x4218E201, 0xD1682622, 0x0009410B, -0x440BD467, 0xD5670009, 0x0009450B, 0x6010D150, -0x8B108801, 0xE650D14F, 0x46186212, 0x8B083266, -0x56F9D14B, 0x2120E200, 0xCB016062, 0x2602A003, -0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A, -0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801, -0x51F66792, 0x217252F5, 0xD6555191, 0x55FA2212, -0x52FB6462, 0x55612542, 0x2252E400, 0x61436643, -0x05DE6013, 0x36CC4608, 0x07DE2652, 0xC9036071, -0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C, -0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518, -0x60822C62, 0x89018801, 0x0009A168, 0x6272D742, -0x8B132228, 0xD42BD741, 0x6772D541, 0x51536242, -0x312C327C, 0x24222228, 0x15138D05, 0x6262D63D, -0xB1627201, 0xD6232622, 0x2622E200, 0x52916692, -0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C, -0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000, -0x001E1015, 0x00201274, 0x002039F4, 0x002018A2, -0x00203A00, 0x00203A18, 0x00201860, 0x0020196C, -0x00201288, 0x001C3510, 0x001C3624, 0x001E212C, -0x002038F4, 0x0020348C, 0x002038FC, 0x00203908, -0x00203914, 0x00203970, 0x00203974, 0x0020391C, -0x0020391D, 0x00203920, 0x00117700, 0x0020398C, -0x0020398A, 0x002034F0, 0x00117710, 0x001C3D30, -0x001C36F8, 0x00117734, 0x001C3684, 0x001C3D00, -0x001C1000, 0x001C1028, 0x00203504, 0x00203924, -0x00117600, 0x00117740, 0x7FFFFFFF, 0x00201730, -0x0020332A, 0x00202334, 0x00203DA4, 0x00203972, -0x002034FC, 0x00203964, 0x001C3D2C, 0x001C36B0, -0x00203494, 0x0011775C, 0x8801C90F, 0xA0CF8901, -0xD1960009, 0x36206212, 0xD4958904, 0x2421E200, -0x2162A0CC, 0x6211D193, 0x89012228, 0x0009A0C3, -0xE202D78F, 0x75016571, 0x3123615D, 0x27518D02, -0x0009A0BC, 0xD28C57F2, 0x62226072, 0x40094019, -0xC90F4009, 0x8F19880A, 0x52F31F2C, 0x40196022, -0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009, -0xCB0154F7, 0xD27E55F2, 0xE7012402, 0xD47FE100, -0x22112572, 0x72016242, 0x2422A098, 0x8B3F8805, -0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802, -0xE4FFD577, 0x644D6752, 0x8B102748, 0x6272D775, -0x8B0C3260, 0x51F255F7, 0xD26DE701, 0x21722562, -0xD571E100, 0x64522211, 0xA0777401, 0x52F32542, -0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E, -0xD26A8B6C, 0x672254F4, 0x7701D569, 0x61422272, -0x1F1CE640, 0x46182159, 0x8B033160, 0x6262D665, -0x26227201, 0xE200D65A, 0x2621B067, 0x0009A056, -0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022, -0x40094009, 0x8803C90F, 0xD25B8B16, 0x672254F4, -0x7701D557, 0x61422272, 0x1F1CE640, 0x46182159, -0x8B033160, 0x6262D655, 0x26227201, 0xE200D648, -0x2621B043, 0x0009A010, 0xD452D551, 0xD2446752, -0xE1007701, 0x25723A46, 0x22118F06, 0xEA00D64E, -0x72016262, 0x2622B031, 0x2FB2D54C, 0x95736652, -0xD44A5BF1, 0x36205241, 0x60618910, 0x8B01C803, -0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0, -0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006, -0xE200D62F, 0xD12F2621, 0x2121E200, 0xD13CE201, -0x66122822, 0x8B012668, 0x0009AE2B, 0x450BD539, -0xD1390009, 0xAE24E600, 0x2F862160, 0x2FA62F96, -0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22, 0xDE34D133, -0x54116212, 0x1F4167E2, 0x2F22D432, 0xD5321F72, -0xD2326743, 0x58417794, 0x69425A42, 0x5B166C72, -0x60526D22, 0xCB20E600, 0xE5402502, 0x626D7601, -0x8BFB3253, 0x55F162F2, 0x11512122, 0xD62855F2, -0x14812E52, 0x249214A2, 0x27C2D426, 0x26D211B6, -0xDA256742, 0xE801D925, 0x490B2A72, 0xE2011A8C, -0x1A2C4218, 0x4F267F0C, 0x6DF66EF6, 0x6BF66CF6, -0x69F66AF6, 0x68F6000B, 0x000007D1, 0x00203984, -0x00203988, 0x0020398E, 0x001C3DC0, 0x0011772C, -0x001C3B88, 0x0020396C, 0x0011773C, 0x00117744, -0x0000F000, 0x00117764, 0x00117748, 0x00117768, -0x0011776C, 0x01FFFFFF, 0x0011774C, 0x002034FC, -0x00203DA4, 0x002024F8, 0x00203972, 0x001C3B9C, -0x001C3D98, 0x001C3700, 0x001C3500, 0x001C5960, -0x001C8960, 0x00203504, 0x001C3D00, 0x0020160C, -0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, -0xDE957FAC, 0x61E0E014, 0x0F14D494, 0x710161E3, -0xE0186210, 0xD2920F24, 0x0009420B, 0x450BD591, -0x20080009, 0x8F126D03, 0xD28F1F07, 0x6720D48F, -0x657CDD8F, 0x470BD78F, 0xD18F0009, 0x619C6910, -0x46086613, 0x36184608, 0x3D6C4608, 0xE0181FD7, -0xE58004FC, 0x604C66E2, 0x3050655C, 0x2D628F15, -0x01FCE014, 0xDE85E500, 0x641CA008, 0x6753655D, -0x607037EC, 0x39DC6953, 0x80947501, 0x3243625D, -0xD67F8BF4, 0xA34EE200, 0x20082621, 0xE0148B13, -0xE40001FC, 0xA009DE79, 0x644D671C, 0x35EC6543, -0x69436652, 0x39DC6262, 0x74041921, 0x3273624D, -0xA3388BF3, 0x88012D10, 0xE0148B17, 0xE70001FC, -0x6D1C2D70, 0xDE6D1FD4, 0x32D3627D, 0xA32A8B01, -0x677D0009, 0x667365E3, 0x61737504, 0x315C36EC, -0x69126462, 0xAFEF7708, 0x88042492, 0xE0148B18, -0xE40001FC, 0x671C2D40, 0x624DDE60, 0x8B013273, -0x0009A311, 0x6943644D, 0x39EC62E3, 0x72046592, -0x3D2C6D43, 0x615266D2, 0x21697408, 0x2512AFED, -0x8B188805, 0x01FCE014, 0x2D40E400, 0xDE53671C, -0x3273624D, 0xA2F68B01, 0x644D0009, 0x62E36943, -0x659239EC, 0x6D437204, 0x66D23D2C, 0x74086152, -0xAFED216B, 0x88312512, 0xD44A8B3A, 0x6146D94A, -0x75046543, 0x67566442, 0x6E531F48, 0x65527E04, -0x7EE462E2, 0x7E0464E2, 0x6EE21FE9, 0x5EF929E0, -0x7E04D942, 0x1FEA60E2, 0x2900C901, 0xD9406EE2, -0x29E04E09, 0x2F562F26, 0x56FAD93E, 0x6513490B, -0xD13D7F08, 0xE71C6E0D, 0x1DE12D70, 0xDE3B6912, -0x64E21D92, 0x1D43D13A, 0xD23A6512, 0x67221D54, -0x1D75D239, 0x1D666622, 0x6262D638, 0x1D27A2AB, -0x8B398830, 0x6596D92B, 0x67926696, 0x61967904, -0x74E46493, 0x6E436992, 0x1F9B7E04, 0x1FEC6442, -0xD9256EE2, 0x5EFC29E0, 0x7E04D924, 0x1FED60E2, -0x2900C901, 0xD9226EE2, 0x29E04E09, 0x59FC7FFC, -0xDE272F92, 0x2F164E0B, 0xD41F7F08, 0xE21C610D, -0x1D112D20, 0xD2206442, 0xD41C1D42, 0x1D536542, -0x6752D51B, 0xD71B1D74, 0x1D156172, 0x1D666622, -0x6262D61A, 0x1D27A26F, 0x8B358833, 0x490BD919, -0xA268EE00, 0x00002DE0, 0x00117800, 0x00203A1C, -0x002018A2, 0x00202AAC, 0x0020390E, 0x00203A20, -0x00203534, 0x002018EE, 0x0020390D, 0x00117804, -0x0020398C, 0x00117810, 0x00203909, 0x0020390A, -0x0020390B, 0x00200F64, 0x001C5864, 0x001C6864, -0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC, -0x00200FBC, 0x00200FB8, 0x89018828, 0x0009A0C0, -0xE643DEB5, 0x326662E1, 0x1FEE8F02, 0x2E21E240, -0x622D62E1, 0x8B013267, 0x0009A0AA, 0xE50185E1, -0x8B013056, 0x0009A0A4, 0x2D10E101, 0x64E1B225, -0xE64357FE, 0x652D6271, 0x89443567, 0x3563E640, -0xE6008B05, 0x0F65E040, 0xA00FE11A, 0x615372C0, -0x41214121, 0x41214121, 0x45214121, 0x45214521, -0xC9036053, 0xE0406603, 0x71180F65, 0x2209E007, -0x0F25E03C, 0xE044641D, 0xB2A365F3, 0xE33C0F46, -0x853233FC, 0x620DDE95, 0x42086031, 0x6023610D, -0x1323E944, 0x06FE4108, 0xE00F39FC, 0x13144E0B, -0x67075D91, 0x60D32679, 0x0F6654FE, 0x51928542, -0x600D4E0B, 0x60D3260B, 0x0F666492, 0x65F3B237, -0x696156FE, 0xE640659D, 0x89383563, 0xD78359FE, -0x79066591, 0xC9036053, 0x40004008, 0x61036203, -0x0F26E050, 0x470BE0FF, 0x6C07600C, 0x6603605D, -0x46214621, 0x46214621, 0x42006263, 0x4200326C, -0x40214021, 0x4008C903, 0x6D2D30FC, 0xE8006A03, -0xB25765F3, 0x6EA264D3, 0x2EC9E050, 0x66942AE2, -0xD76E01FE, 0x606C470B, 0x2AE22E0B, 0x64D365F3, -0x7801B1FD, 0xEE06628D, 0x8FE932E3, 0x5EFE7D01, -0x61E1E400, 0x410085E1, 0x66E3310C, 0x760C711B, -0xE70465F3, 0x68667401, 0x3A736A4D, 0x8FF92582, -0x65F37504, 0x641DB1E3, 0x64E1B1A4, 0x0009A17B, -0xD45B56F7, 0xEC01D25B, 0x26C0420B, 0x0009A173, -0x06FCE018, 0x8829606C, 0x58F78B08, 0xE400D252, -0x66222840, 0x646DB171, 0x0009A165, 0x666CE681, -0x89013060, 0x0009A0AC, 0xD550D14F, 0x62126A56, -0x212232AC, 0x54116C56, 0x34CC6253, 0x64521141, -0x72085812, 0xD44A384C, 0x68221182, 0x5A136C42, -0x3ACC3C8C, 0x11A324C2, 0x6C2272EC, 0x72105814, -0x118438CC, 0x5A156822, 0x11A53A8C, 0x6A227210, -0xD6405816, 0x118638AC, 0x52176C62, 0x112732CC, -0x5A185861, 0x11A83A8C, 0x5C195A62, 0x11C93CAC, -0x521A5C63, 0x112A32CC, 0x5A1B5864, 0x11AB3A8C, -0x5C1C5A65, 0x11CC3CAC, 0x521D5C66, 0x112D32CC, -0x5A1E5867, 0x11AE3A8C, 0x561F5A68, 0x36ACE840, -0x116FDA2D, 0x6CA2381C, 0x7A946682, 0x286236CC, -0x5C8162A2, 0x18C13C2C, 0x62A27A44, 0x362C5682, -0xD6261862, 0x5A856262, 0x3A2C4229, 0x760418A5, -0x56866262, 0x362C4229, 0x56F71866, 0x2620E238, -0x16C15C81, 0x16226212, 0xE2005C11, 0x551216C3, -0x55151654, 0x55131655, 0x55161656, 0x55821657, -0x65821658, 0x55141659, 0x5584165A, 0x5583165B, -0x5585165C, 0x5586165D, 0x1821165E, 0x11212122, -0x11251122, 0x11261123, 0x28221822, 0x18241124, -0x18251823, 0x1826A0C7, 0x00117804, 0x002033E8, -0x00203A40, 0x002018A2, 0x00203494, 0x001C36A0, -0x002034F0, 0x001C3CA0, 0x001C36F4, 0x001C3B88, -0x666CE682, 0x8B203060, 0xEA2456F7, 0x26A0D194, -0x16C15C17, 0x16225218, 0x16835819, 0x16A45A1A, -0x16C55C1B, 0x1626521C, 0xE200581D, 0x551E1687, -0x551F1658, 0x11271659, 0x11291128, 0x112B112A, -0x112D112C, 0xA08E112E, 0xE683112F, 0x3060666C, -0x52F78B0B, 0xEA00D883, 0x658222A0, 0x7804DC82, -0x62822C52, 0xA07ED681, 0xE6902620, 0x3060666C, -0xDA7F8B06, 0x00094A0B, 0xE20056F7, 0x2620A073, -0x666CE691, 0x8B103060, 0x6222D276, 0x2228622C, -0xD2788904, 0x0009420B, 0x0009A003, 0x420BD276, -0x56F70009, 0xA05EE200, 0xE6922620, 0x3060666C, -0xE0188951, 0xE6B00BFC, 0x666C62BC, 0x8B2A3260, -0x02FCE014, 0x682CEA00, 0x62ADE904, 0x894A3283, -0x6AADDD64, 0x3CDC6CA3, 0x7D046EC2, 0xDB68D467, -0x32DC62A3, 0x4B0BDC67, 0x4C0B6D22, 0xD46664E3, -0x00094B0B, 0x64D34C0B, 0x4B0BD464, 0xE6000009, -0x666D6BE3, 0x76013B6C, 0x3293626D, 0x8FF72BD0, -0xAFDA4D19, 0xE6B57A08, 0x3260666C, 0xD45C8B13, -0x4B0BDB57, 0xD25B0009, 0x6022DB5B, 0xCB20E6FF, -0x2202666D, 0xDB592B62, 0xE014E200, 0x56F72B20, -0xA01002FC, 0xD4562620, 0x6542D256, 0x420BD456, -0xA0080009, 0xDB520009, 0x52B1E600, 0x622CDB53, -0x52F72B21, 0x7F542260, 0x6EF64F26, 0x6CF66DF6, -0x6AF66BF6, 0x000B69F6, 0x4F2268F6, 0xE240614D, -0x89143123, 0x3127E21F, 0x8B09D749, 0xD449614D, -0xE00171E0, 0x5671440B, 0x26596507, 0x1761A007, -0xE001D444, 0x6672440B, 0x26596507, 0x4F262762, -0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912, -0xD73B3127, 0x614D8B08, 0x5671D23A, 0x420B71E0, -0x260BE001, 0x1761A006, 0x6672D236, 0xE001420B, -0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618, -0x6252D531, 0x89FC2268, 0x0009000B, 0x4618E680, -0xD52D4628, 0x22686252, 0x000B89FC, 0xA0010009, -0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680, -0xD5264628, 0x22686252, 0x000B8BFC, 0x2FE60009, -0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D620, -0x54E11615, 0x16464218, 0x422855E2, 0x57E31657, -0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE, -0x00203494, 0x00117804, 0x002038F4, 0x00203908, -0x0020050A, 0x00201008, 0x0020102E, 0x00203A58, -0x002018A2, 0x002018E6, 0x00203A6C, 0x00203A74, -0x00203A78, 0x001C3500, 0x001C1000, 0x0020398A, -0x00117800, 0x002018EE, 0x00203A8C, 0x00203990, -0x001C3704, 0x002033E8, 0x001C373C, 0x001C3700, -0x001C370C, 0x2FD62FC6, 0x4F222FE6, 0x6C53DD10, -0x6E43BFA4, 0x2DE2BF89, 0x0009BFA0, 0x2C1251D5, -0x1C4154D6, 0x1C5255D7, 0x1C6356D8, 0x6EF64F26, -0x000B6DF6, 0x61636CF6, 0xA004E600, 0x62564109, -0x24227601, 0x36127404, 0x000B8BF9, 0x00000009, -0x001C370C, 0x0009A16E, 0x2FE62FD6, 0xDD944F22, -0xA0049EB2, 0xD4930009, 0x420BD293, 0x62D265D2, -0x8BF822E8, 0x0009A004, 0xD28FD490, 0x55D1420B, -0x22E852D1, 0xA0048BF8, 0xD48D0009, 0x420BD28A, -0x52D255D2, 0x8BF822E8, 0x0009A004, 0xD286D489, -0x55D3420B, 0x22E852D3, 0xA0048BF8, 0xD4860009, -0x420BD281, 0x52D455D4, 0x8BF822E8, 0x6EF64F26, -0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636C73, -0x6D53B01A, 0x64D357F4, 0xB05F65E3, 0xB07566C3, -0xB0A40009, 0xB0A80009, 0xB0AC0009, 0xB0AC0009, -0xB0AF0009, 0xB03154F5, 0x6CCD6C03, 0x4F2660C3, -0x6DF66EF6, 0x6CF6000B, 0x3412D170, 0xD6700529, -0x2650D770, 0x2742000B, 0x0009A018, 0x2FD62FC6, -0x4F222FE6, 0x6E636C73, 0x6D53BFEE, 0x64D357F4, -0xB03365E3, 0xB08D66C3, 0xB00F54F5, 0x6CCD6C03, -0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0xE503D162, -0xD763D462, 0x21524518, 0x2472000B, 0xD45FD15E, -0x2162E600, 0x2462000B, 0xBF734F22, 0xBF73E40A, -0xD25C0009, 0x4118E104, 0xE40AE500, 0xBF692212, -0xD7592252, 0xCB206072, 0x000B4F26, 0x4F222702, -0x410BD156, 0xD556E400, 0x4F26452B, 0xD1552FE6, -0x66126E63, 0x92104418, 0x44084528, 0x45002629, -0x265B4408, 0x264B4400, 0x21624708, 0xD14E4708, -0x217227EB, 0x6EF6000B, 0x1FFF03F0, 0x4F222FE6, -0xE101DE4A, 0xBF3DE40A, 0x67E32E12, 0xE500776C, -0xE204E130, 0x2752E40A, 0x27522752, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27222712, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x175ABF18, 0x2E62E600, 0x000B4F26, 0xD2346EF6, -0xE441E101, 0x000B2212, 0xD1322242, 0xE605D432, -0x000B2162, 0x000B2462, 0xD2300009, 0xE40AE601, -0x2262AF00, 0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22, -0x6C43DB2B, 0xED0060B2, 0x2B02CB03, 0xC90360B2, -0x6E03A008, 0x89073DC2, 0xE46460B2, 0xB07CC903, -0x7D016E03, 0x8BF52EE8, 0x8F043DC2, 0xD4212FE1, -0x460BD621, 0x62F10009, 0x6023622D, 0x89FFC801, -0x7F046023, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, -0x001C3B88, 0x00203AA0, 0x002018EE, 0x00203AA8, -0x00203AB0, 0x00203AB8, 0x00203AC0, 0x0025E720, -0x00203DA0, 0x002038F8, 0x001C5968, 0x001C3B40, -0x000F8000, 0x001D4004, 0x001C3500, 0x002015E0, -0x0020160C, 0x001C5814, 0x001C59D0, 0x001C5830, -0x001C6268, 0x001C59A4, 0x001C639C, 0x001C581C, -0x001C5860, 0x00203AC8, 0x002018A2, 0x8F014411, -0x6043604B, 0x0009000B, 0x5651D52B, 0x46286052, -0x306C000B, 0x2FC62FB6, 0x2FE62FD6, 0x4F124F22, -0xBFF14F02, 0x6B036E43, 0xDD25DC24, 0x0009BFEC, -0x3C0530B8, 0x4609060A, 0x46014609, 0x020A3D65, -0x42094209, 0x32E24209, 0x4F068BF0, 0x4F264F16, -0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6, 0x2FE62FD6, -0x4F124F22, 0xBFCF4F02, 0x6C036E43, 0xBFCBDD13, -0x30C80009, 0x060A3D05, 0x46094609, 0x36E24601, -0x4F068BF5, 0x4F264F16, 0x6DF66EF6, 0x6CF6000B, -0x4F222FE6, 0xE102DE0B, 0xE403E500, 0xBFB92E12, -0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72, -0x6EF6AFB0, 0x0009000B, 0x001C1040, 0xCCCCCCCD, -0x10624DD3, 0x001D4004, 0x2F962F86, 0x2FB62FA6, -0x2FD62FC6, 0x4F222FE6, 0xE5007F98, 0x6453E710, -0x6B534728, 0xEE1ADCBC, 0x6153655D, 0x315C4108, -0x75014108, 0x6043317C, 0x0F16665D, 0xED0060B3, -0x21B136E3, 0x81128111, 0x11D28113, 0x11D411D3, -0x74048FEA, 0xD8B167F2, 0x1871D9B1, 0x58F12872, -0x1981D1B0, 0x59F22982, 0x5DF45AF3, 0x54F65EF5, -0x21921191, 0x11A211A3, 0x11D411D5, 0x11E611E7, -0x11481149, 0xDAA855F7, 0x57F8EE00, 0x52F9DDA7, -0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6, 0x2D729AD5, -0x6EED2622, 0x4D086DE3, 0x3DEC61E3, 0x4D084108, -0x3D9C31EC, 0x410860B3, 0x81D12DB1, 0x4108E050, -0x4008E7B7, 0x677C4108, 0x60B381D2, 0xE200318C, -0x81D33472, 0x1D131DD2, 0x8D01D493, 0xD4901D24, -0xB0B365D3, 0x64ED7E01, 0x8BDA34A2, 0x2FD2DA8C, -0xDD9268A2, 0x2D824829, 0x7DFC64A2, 0xD287694D, -0x6E222D92, 0x7D0C4E29, 0x68222DE2, 0x618D6AD3, -0x2A16D784, 0xD48A6D72, 0x24D2D583, 0xD6895E72, -0x517414E2, 0x1414EE00, 0xD1875876, 0x59781486, -0x1498E710, 0x65E36252, 0x26E2142A, 0xE60064E3, -0x6843644D, 0x384C4808, 0x381C4808, 0x0C866053, -0x09CE28B1, 0x819160B3, 0x0ACE6053, 0x81A26043, -0x0DCE6053, 0x81D360B3, 0x08CE6053, 0x18827401, -0x624D09CE, 0x0ACE19E3, 0x1A643273, 0x75048FE0, -0xE003D96A, 0x40186C92, 0x6D922CB1, 0x81D1DA6F, -0x6E92E050, 0x81E24008, 0x60B36192, 0x64928113, -0x1442E600, 0xD4696792, 0x689217A3, 0x1864E1FF, -0x6563E703, 0x364C4608, 0x26127501, 0x3673665D, -0xDC5B8BF8, 0x6DC2E003, 0x2DB14018, 0xD2606EC2, -0x61C281E1, 0x1112EE00, 0xE02464C2, 0x65C21423, -0x15E4D45B, 0xE58067C2, 0x68C28172, 0x818366E3, -0x666D655C, 0x76046963, 0x394C6A6D, 0x8FF83A53, -0xDB5429E2, 0x24B2DC54, 0x24C27404, 0x4F267F68, -0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B, -0x60116142, 0x8F03C803, 0xD23DE500, 0x8B063420, -0xC9036011, 0x8B068802, 0x3420D239, 0x56128B03, -0x52646513, 0x000B2422, 0x01136053, 0x2FE62FD6, -0x7FEC4F22, 0x62536E53, 0x6D43E550, 0x4508E400, -0xE101A001, 0x60435224, 0x81212211, 0x60538123, -0x56E28122, 0x8BF53620, 0x16E4D238, 0xE61464F3, -0x65E3420B, 0xE4FC65E1, 0x2E512549, 0x65F361F1, -0x2F112149, 0xD13154D1, 0xE614410B, 0x607157D1, -0x2701CB01, 0x7F141DE1, 0x6EF64F26, 0x6DF6000B, -0x2FE62FD6, 0x7FEC4F22, 0x66536E53, 0x6D43E5FC, -0x20596061, 0x2601CB01, 0x326052E2, 0x12E48B06, -0x31E051E2, 0x52D18B04, 0x1E22A002, 0x5664AFF0, -0x64F3D21E, 0x420BE614, 0x67E165E3, 0x2719E1FC, -0x67F12E71, 0x271954D1, 0x65F3D118, 0x410BE614, -0x52D12F71, 0xCB016021, 0x1DE12201, 0x4F267F14, -0x000B6EF6, 0x00006DF6, 0x00203924, 0x002034F4, -0x002034FC, 0x00203504, 0x0020352C, 0x00203910, -0x00203918, 0x00100208, 0x001017C0, 0x001E210C, -0x001C3D00, 0x00203964, 0x001000C8, 0x00117880, -0x00117780, 0x00040020, 0x0026C401, 0x00200ED6, -0x4F222FE6, 0xDE42624C, 0x42004208, 0x3E2CA005, -0xD4405252, 0xBF695624, 0x65E22E62, 0x352052E1, -0xD63D8BF6, 0x4F262622, 0x6EF6000B, 0x2FC62FB6, -0x2FE62FD6, 0xDC394F22, 0x52C1DB39, 0x362066C2, -0x6061891C, 0x8801C903, 0xDE348918, 0xBF37DD35, -0x650364E3, 0x66B28503, 0x3262620D, 0xD4328907, -0x0009BF76, 0x4D0BD431, 0xAFE60009, 0xBF3D0009, -0xD42F64E3, 0x00094D0B, 0x0009AFDF, 0x2262D22D, -0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x2FD62FC6, -0x4F222FE6, 0xDD29DC28, 0x6E4360C2, 0x04DE4008, -0xE614D127, 0x65E3410B, 0xD127D726, 0x55E227E2, -0x35E05254, 0x21228F04, 0x400860C2, 0x122202DE, -0x605365C2, 0x75014008, 0x0DE606DE, 0xC90F6053, -0x60632C02, 0x6EF64F26, 0x000B6DF6, 0x85436CF6, -0x650D5643, 0x622D6262, 0x35277204, 0xE1008F0C, -0x2268960C, 0xD6158B03, 0x72015261, 0xD6131621, -0x6262E101, 0x26227201, 0x6013000B, 0x000001FF, -0x00203504, 0x002034FC, 0x001C3D00, 0x0020352C, -0x002038F4, 0x002018A2, 0x002034F4, 0x00203AF0, -0x00203AF4, 0x001C3D28, 0x00203964, 0x00203924, -0x00200ED6, 0x00203968, 0x0020396C, 0x00117754, -0x2FC62FB6, 0x2FE62FD6, 0x7FF84F22, 0x6022D237, -0x8D58C803, 0xDE362F01, 0xDB37DC36, 0x66C252C1, -0x892F3620, 0xC9036061, 0x892B8801, 0xD233DD31, -0x64D3420B, 0x1F016503, 0x880160B1, 0xD2308B04, -0x64D3420B, 0x0009AFEA, 0x85615653, 0x8904C820, -0xE050D72C, 0x7201027E, 0xD22B0726, 0x6453420B, -0x89072008, 0x55F1D126, 0x64D3410B, 0xE601D727, -0x2762AFD4, 0x55F1D226, 0x64E3420B, 0xE601D125, -0x2162AFCC, 0xDD25DE24, 0xDC26DB25, 0x66D252D1, -0x89183620, 0xC9036061, 0x89148801, 0xD117D41F, -0x0009410B, 0x36E05603, 0x65038F04, 0x2B20E201, -0x2C52AFEC, 0xD712D41C, 0x0009470B, 0xE601D115, -0xAFE34618, 0x60F12162, 0x8907C804, 0x7F08D217, -0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x4F267F08, -0x6DF66EF6, 0x000B6CF6, 0x00006BF6, 0x001E2100, -0x00203504, 0x002034FC, 0x0020398C, 0x002014A0, -0x002014CC, 0x00203494, 0x002016BE, 0x001E212C, -0x00201530, 0x001C3D30, 0x00117880, 0x002034F4, -0x00203914, 0x00203910, 0x0020352C, 0x00200610, -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, 0x00203AF8, 0xE4FDD29F, 0xD79F6122, -0x22122149, 0x74016022, 0x2202CB01, 0xD59C6622, -0x22622649, 0xC8406070, 0x60528902, 0x2502CB04, -0xE1F76452, 0x25422419, 0xE7016052, 0x2502CB40, -0xE6026052, 0x2502C9CF, 0x47186052, 0x2502CB10, -0xCB036052, 0x15622502, 0x1573000B, 0xD78ED58D, -0xD48FD28E, 0xE600E100, 0x27112511, 0xAFCB2210, -0x664C2461, 0x4600D28B, 0x6060362C, 0x000BCB10, -0x654C2600, 0x4500D287, 0x6650352C, 0x2619E1EF, -0x2560000B, 0xD284664C, 0x362C4600, 0xCB106060, -0x2600000B, 0xD280654C, 0x352C4500, 0xE1EF6650, -0x000B2619, 0x664C2560, 0x4600D27A, 0x6060362C, -0x000BCB08, 0x654C2600, 0x4500D276, 0x6650352C, -0x2619E1F7, 0x2560000B, 0xD273664C, 0x362C4600, -0xCB086060, 0x2600000B, 0xD26F654C, 0x352C4500, -0xE1F76650, 0x000B2619, 0x624C2560, 0x4200D669, -0x6020326C, 0x4021C908, 0x40214021, 0x600C000B, -0xD665624C, 0x326C4200, 0xC9086020, 0x40214021, -0x000B4021, 0xD161600C, 0x341C644C, 0x000B6240, -0xD15F602C, 0x341C644C, 0x000B6240, 0x2FE6602C, -0x6E434F22, 0xE60A645C, 0x89143467, 0x0009BFEB, -0x60EC640C, 0x8B028801, 0xA002E00F, 0x44092409, -0x624C4409, 0x3263E60A, 0xBFE28905, 0x620C644C, -0xC8806023, 0xE2008B00, 0x4F266023, 0x6EF6000B, -0xD64C4F22, 0x88016062, 0xB2578B03, 0xA0030009, -0xD2490009, 0x2260E640, 0xE200D648, 0x000B4F26, -0x4F222622, 0x6062D643, 0x8B018802, 0x0009B2A0, -0xE200D642, 0x000B4F26, 0xD53E2622, 0xE100D43E, -0x2512E701, 0x2470000B, 0xE604D23B, 0x2260000B, -0xD43B4F22, 0x410BD13B, 0xD53B0009, 0x6650E1FD, -0x2619D23A, 0x2560E700, 0x000B4F26, 0x4F222270, -0xD238D537, 0xD7386152, 0x2512611D, 0xE6FF6452, -0x2542242B, 0xD22FD435, 0x420B666D, 0xD52E2762, -0x6750E1FB, 0x4F262719, 0x2570000B, 0xD4304F22, -0x410BD128, 0xD5280009, 0x6650E7F7, 0x4F262679, -0x2560000B, 0x9425D524, 0x22496250, 0x2520000B, -0xE4BFD521, 0x22496250, 0x2520000B, 0xD2254F22, -0x600D8522, 0x89112008, 0x89458801, 0x89478803, -0x89498805, 0x894F8806, 0x89558808, 0x895B8809, -0x8961880A, 0x8967880B, 0x0009A06E, 0x0009B070, -0x600CA06B, 0x0000FF7F, 0x001E2148, 0x001E1000, -0x001E1108, 0x002039C4, 0x002039C6, 0x002039E5, -0x002039A8, 0x001E103F, 0x001E105F, 0x001E102F, -0x001E1090, 0x002039CC, 0x001E100B, 0x002039C8, -0x00203AFC, 0x002018A2, 0x001E1028, 0x002039E4, -0x001D4020, 0x98760000, 0x001C1000, 0x00203B08, -0x00203B18, 0x0020399C, 0x0009B04C, 0x600CA035, -0x0009B055, 0x600CA031, 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, 0x002039E5, -0x0020399C, 0x002039A8, 0x001E1100, 0x001E100C, -0x002039C8, 0x001E1000, 0x001E1001, 0x002039D0, -0x002039B0, 0x002039B4, 0x002039B8, 0x002039D4, -0x002039D8, 0x002039DC, 0x002039E0, 0x00203E04, -0x00203E0E, 0x002039C2, 0x00202886, 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, 0x64E3BC85, 0xBC8A64E3, 0x62EC7E01, -0x8BF732D7, 0xBC8DEE01, 0x64E364E3, 0x7E01BC92, -0x32D762EC, 0x4F268BF7, 0x000B6EF6, 0xD1186DF6, -0xD418920D, 0x72122122, 0x2422D617, 0xD7177204, -0x72202622, 0x2722D116, 0x000B7230, 0x137A2122, -0x002039C2, 0x00202992, 0x001E1015, 0x002039C8, -0x001E1001, 0x0020399C, 0x001E1100, 0x002039C6, -0x002039B4, 0x001E1000, 0x002039B8, 0x002039C4, -0x00202886, 0x001E100C, 0x002039B0, 0x002039CC, -0x002039D0, 0x002039D4, 0x002039D8, 0x002039DC, -0x002039E0, 0x4F222FE6, 0xD6707FFC, 0x88016060, -0xE2018951, 0x2620BFBB, 0xD56ED16D, 0xDE6E6010, -0x64E36552, 0x7402C840, 0x8D22D16C, 0xD26C7502, -0xE601D76C, 0xE7042722, 0x76016255, 0x626C2421, -0x8FF93273, 0xD4637402, 0x6242E601, 0x640D8528, -0x67494419, 0x275D657E, 0x81E4607C, 0xE417D562, -0x67557601, 0x3243626C, 0x8FF92171, 0xA0207102, -0xD25E0009, 0xE601D75B, 0xE7042722, 0x76016255, -0x626C2421, 0x8FF93273, 0xD4527402, 0x6242E601, -0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C, -0xE417D553, 0x67557601, 0x3243626C, 0x8FF92171, -0x92897102, 0xD2462E21, 0x5E23D74E, 0x64F22FE2, -0x604365F2, 0x2700C980, 0xC9606043, 0x80716103, -0xC9036043, 0x80724519, 0x65F2605C, 0x817266F2, -0x46194629, 0x606C4529, 0x4018645C, 0x8173304C, -0x21185E23, 0x64F22FE2, 0x6E4C62F2, 0x602C4219, -0x66F262F2, 0x46294018, 0x461930EC, 0x42298174, -0x652C606C, 0x305C4018, 0x81758F07, 0x0009BC96, -0x2228620C, 0xA00A8908, 0x60130009, 0x8B038840, -0x0009B009, 0x0009A003, 0xE202D62F, 0x7F042622, -0x000B4F26, 0x4F226EF6, 0x8552D52A, 0x8830600D, -0x88318903, 0xA0348923, 0x85550009, 0xD428D727, -0x85532701, 0x610DD627, 0x24124118, 0x460BD426, -0xD7230009, 0xD226D425, 0x6572420B, 0xE230D120, -0x42286712, 0x2729E620, 0x37604628, 0xD6218B03, -0xA016E200, 0xD61F2622, 0xA012E202, 0xD1182622, -0x6212E530, 0xE6204528, 0x46282259, 0x89083260, -0xD41AD119, 0xE601D513, 0x2160450B, 0x472BD718, -0x4F264F26, 0x0009000B, 0x0000060A, 0x002039E4, -0x001E1000, 0x002039D0, 0x00203E04, 0x00203E10, -0x00203DA8, 0x002039B8, 0x00203DD8, 0x00203DD6, -0x00203DAA, 0x0020399C, 0x002039C8, 0x002039B4, -0x002039B0, 0x002018A2, 0x00203B24, 0x00203B28, -0x002018EE, 0x002039CC, 0x001E100B, 0x00203B3C, -0x00114004, 0x4F222FE6, 0xDE967FFC, 0x200884E9, -0x2F008D06, 0xD695D494, 0x0009460B, 0x64F0B19A, -0x6620D293, 0x89022668, 0xC9BF60E0, 0x7F042E00, -0x000B4F26, 0x000B6EF6, 0x2FE60009, 0xDE8D4F22, -0x60E0D68D, 0xCBC0D48D, 0x62602E00, 0xC803602C, -0x40218904, 0x70014021, 0x6603A002, 0x66034009, -0xD687616D, 0xE500A004, 0x75016262, 0x74042422, -0x3213625D, 0xD2838BF8, 0x0009420B, 0xC9BF84E2, -0x4F2680E2, 0x6EF6000B, 0x2FE62FD6, 0x7FFC4F22, -0x6260D67D, 0x89442228, 0xD572E100, 0x60502610, -0xCB40D47A, 0x2500440B, 0x8D052008, 0x62E06E03, -0x7104612C, 0x2F11A006, 0xD475D66D, 0xDD756760, -0x657C4D0B, 0xE23C6D1D, 0x8B033D27, 0xD267D472, -0x0009420B, 0x4D214D21, 0xA005D770, 0x66E6E400, -0x357C4508, 0x74012562, 0x35D3654D, 0xD76C8BF7, -0x6172E003, 0x81114018, 0x6E7260F1, 0x81E2700C, -0xD4686172, 0xDD688113, 0x4D0BDE68, 0xE2016572, -0xD4672E22, 0x420BD255, 0xD6560009, 0xC93F6060, -0x7F042600, 0x6EF64F26, 0x6DF6000B, 0x2FC62FB6, -0x2FE62FD6, 0xD25F4F22, 0x6B436E73, 0x420B6C53, -0x20086D63, 0x64038D1C, 0xE50ED149, 0x32526210, -0x60C38916, 0x804124B0, 0x814160D3, 0xA007E500, -0x655D61BC, 0x00EC6053, 0x364C6653, 0x80647501, -0x3213625D, 0xD63B8BF5, 0xC9BF6060, 0x2600A008, -0xD23AD44D, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, -0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x7FC44F22, -0x720262F3, 0x22512F41, 0x45297202, 0x60632251, -0xE5C4E682, 0x67F38121, 0x655C666C, 0xE408BFB6, -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, 0xBF79666C, 0x7F3C655C, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0xD11E68F6, -0x6012D21E, 0xCB20E405, 0x2102E500, 0x000B2242, -0x00002252, 0x001E1017, 0x00203B40, 0x002018A2, -0x0020390E, 0x001E1015, 0x001E10BF, 0x00117800, -0x001E10FC, 0x00200610, 0x00203914, 0x00202AEA, -0x00203B44, 0x002018EE, 0x00203B60, 0x0011788C, -0x00203910, 0x002034F4, 0x00201530, 0x001E2130, -0x00203B68, 0x00202AAC, 0x00203B6C, 0x00203974, -0x0020397C, 0x00203DA4, 0x001C3500, 0x001D4004, -0xD564D163, 0xE400D764, 0x2142E20F, 0x17411154, -0xD5622722, 0x9669D762, 0x15412572, 0x96661562, -0xE6011565, 0xD55F1165, 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, 0x0009BE67, 0xC81060E3, 0xBE648901, -0x60E30009, 0x8901C840, 0x0009BE86, 0xC80160E3, -0xDD3D8938, 0xC80260D0, 0x2F008D03, 0x460BD63B, -0x60F00009, 0x8902C804, 0x460BD639, 0x62F00009, -0xC8806023, 0x60D08902, 0x2D00C97F, 0xC8016023, -0xD6348906, 0x0009460B, 0x0009A007, 0x51630601, -0x8902C808, 0x460BD630, 0x60F00009, 0x8902C810, -0x420BD22E, 0xD52E0009, 0x88026052, 0xD22D8B03, -0xA005E604, 0x88012260, 0xD22A8B02, 0x2260E601, -0x2522E200, 0xC88060E3, 0xD227892D, 0x60E36E20, -0x8902C880, 0x420BD225, 0x60E30009, 0x8902C840, -0x420BD223, 0x60E30009, 0x8902C802, 0x420BD221, -0x60E30009, 0x890DC804, 0xDD20D11F, 0x0009410B, -0x0009BF0D, 0x0009BF4C, 0xD51ED41D, 0x2470E708, -0x25D2BF85, 0xC80860E3, 0xD21B8905, 0x4F267F04, -0x422B6EF6, 0x7F046DF6, 0x6EF64F26, 0x6DF6000B, -0x001C581C, 0xA000A000, 0x001D0100, 0x001D4000, -0x00040021, 0x001C589C, 0x001E1021, 0x00201A90, -0x00201AB2, 0x00202114, 0x00201ACA, 0x00201AD8, -0x002039C8, 0x001E100B, 0x001E1028, 0x00201B44, -0x00201B50, 0x00201AE0, 0x00201AFE, 0x12345678, -0x001E1000, 0x0010F100, 0x00201B2C, 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, -0x002039C2, 0x002039C4, 0x002039C6, 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, -0x0020390D, 0x0020390C, 0x0020390E, 0x00203534, -0x7FFC4F22, 0xE680D19F, 0x666C6212, 0xD29E2F22, -0x67F36563, 0x420B7542, 0x7F04E404, 0x000B4F26, -0xE6800009, 0xD298666C, 0xE7006563, 0x422B7540, -0xE6806473, 0xD294666C, 0xE7006563, 0x422B7543, -0x2F866473, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, -0x7FCC4F22, 0xDC8ED28D, 0x72011F21, 0xDB8D1F22, -0xD18EDE8D, 0x66125211, 0x8B013620, 0x0009A0E5, -0xC9036061, 0x8B018801, 0x0009A0DF, 0xD288D487, -0xED84420B, 0x2F025503, 0x30D0845C, 0xA0B88901, -0xD1840009, 0x626C6610, 0x88016023, 0xD1828B68, -0x62101FC3, 0x895B2228, 0xE003D480, 0x40186742, -0x68421772, 0xD57EE900, 0x81816DB3, 0x7D042190, -0x67D26AB2, 0x64E26852, 0x1F491F57, 0x740464E3, -0x1FA46542, 0x65431F5A, 0x625275F8, 0x1F761FD5, -0x6D531F2B, 0xDA74D773, 0x7D94D274, 0x68D21F88, -0x6AA26972, 0xD1726022, 0x2202CB20, 0xE1401F1C, -0x7601E600, 0x3213626D, 0x56F48BFB, 0x52F651F5, -0x21222B62, 0x52F851F7, 0x212256F9, 0x2E6251FA, -0x51FB2412, 0x2D822512, 0xD9662792, 0x29A2DD5F, -0x6AD2D965, 0xD9646892, 0x68D21A84, 0x6081DA63, -0x2801CB01, 0xD86266D2, 0x2A622962, 0xED015AFC, -0x2AD2480B, 0x2AD24D18, 0x62D2DD5E, 0x2D227201, -0xD15056F3, 0xE2026062, 0x2602CB01, 0x2120A03D, -0x8B3A2228, 0xE401DD58, 0x2140E600, 0xE01C2D62, -0xC801005C, 0xD4558B0A, 0xE600D755, 0xED7D2472, -0x626C7601, 0x8BFB32D3, 0x24D2DD52, 0xE2FE68C2, -0x2C822829, 0x095CE01E, 0xE01F5DF1, 0x0A5C2D90, -0x751051F2, 0xED0621A0, 0xD74BE600, 0x8456D44B, -0x27007601, 0x696C6854, 0x248039D3, 0x8FF67401, -0xDA477701, 0x2A10E194, 0xE2007A01, 0x7A0F2A20, -0xD130E805, 0x66102A80, 0x6023626C, 0x89088801, -0xD240D42A, 0x420B65F2, 0xD131ED01, 0xAF304D18, -0x65F221D2, 0x8553D43C, 0x620D6642, 0x89073262, -0xD13BD43A, 0x0009410B, 0xE601D73A, 0x2762AF1A, -0xD134D41E, 0x410B65F2, 0xD125ED01, 0xD637D436, -0x460B4D18, 0xAF0D21D2, 0x7F340009, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x4F2268F6, -0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1, -0x81F2D209, 0x67F38542, 0x854381F3, 0x81F4E40C, -0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26, -0x00000009, 0x001C3D9C, 0x0020245C, 0x0011779A, -0x001C36F8, 0x001C3B9C, 0x001C3704, 0x0020352C, -0x002014A0, 0x0020391D, 0x0020391C, 0x00203918, -0x001C3D98, 0x001C3BB4, 0x001C5960, 0x001C3500, -0x001C3D30, 0x001C8960, 0x00203504, 0x001C3D00, -0x0020160C, 0x00117730, 0x00203920, 0x001C582C, -0x2000A000, 0x0000A000, 0x0011778C, 0x00117792, -0x00117788, 0x002014CC, 0x002038F4, 0x002034F4, -0x00201530, 0x001E2130, 0x00203D84, 0x002018A2, -0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, -0xD19B7FEC, 0x2F12E000, 0x6103D49A, 0x1F4281F2, -0xDD9ADA99, 0xD69A6813, 0xE0014808, 0x460BDE99, -0x38EC4800, 0x65A21F03, 0x352052A1, 0xA23E8B01, -0x60510009, 0x8801C903, 0xA2388B01, 0x52530009, -0x32E0DE91, 0xD9918B10, 0x64A3490B, 0x4B0BDB90, -0xDE906403, 0xD791D690, 0xEC01D591, 0x2E02E100, -0x271026C0, 0x2502AFDF, 0xC8018551, 0xA1578B01, -0x62510009, 0x4200622D, 0x5E53366A, 0x85E2226D, -0xC903642C, 0x85E36603, 0x6053650D, 0x40214021, -0x4500C93F, 0x322A6703, 0x6053252D, 0xC901D17F, -0x60106C03, 0x8801D97F, 0xDB7F8B05, 0x2120E200, -0xCB0160B2, 0xD17D2B02, 0x88016011, 0x65A28B0A, -0x8D042448, 0x9B9E6251, 0xA00322B9, 0x919B2521, -0x2521221B, 0x37B3EB10, 0x2448895E, 0xD4738B07, -0x22286241, 0x60638903, 0xA05781F8, 0xD5706473, -0x46084608, 0x85E26273, 0x46006B50, 0x362C4200, -0x2BB8C910, 0x8F1F6463, 0x26686603, 0xD2698911, -0x062D6043, 0x4119616D, 0x6B0E6019, 0x81F820BD, -0x880160C3, 0x646C8F2C, 0x880F6073, 0xA0278B1B, -0xD2610009, 0x052D6043, 0x4119615D, 0x670E6019, -0x645C207D, 0x81F8A01C, 0x890F2668, 0x6043D25B, -0x6B5D052D, 0x60B94B19, 0x201D610E, 0x60C381F8, -0x8F0D8801, 0x6473645C, 0xEC00A00A, 0x6043D254, -0x625D052D, 0x60294219, 0x207D670E, 0x81F8645C, -0x880285F8, 0x85E1890A, 0x8D07C820, 0xE6DC6203, -0x60232269, 0x81E1A002, 0x644CE4FF, 0x6210D149, -0x89012228, 0x644CE4FF, 0x654DEBFF, 0x35B06BBC, -0xDB368B2B, 0x64A34B0B, 0x410BD135, 0x54036403, -0x85446E03, 0xC948DB40, 0xDC408808, 0xBEAE8B01, -0x64B3E502, 0x65E34C0B, 0xDB3DEC01, 0xD13D2DC2, -0x621260B2, 0x72017001, 0x21228805, 0x2B028F08, -0x666CE680, 0x6563D238, 0x7549E700, 0x6473420B, -0xA030D436, 0x7FFF0009, 0x85E28000, 0x20B9EBFC, -0x610381E2, 0x942A85E3, 0x62032049, 0x450885F8, -0x81E2201B, 0xC90160C3, 0x40084018, 0x40084008, -0x4000225B, 0x6023220B, 0x85E481E3, 0x4118E108, -0x81E4201B, 0xE40262A2, 0x20B98521, 0x67A28121, -0xCB016071, 0x85F82701, 0x89033042, 0xECE785E2, -0x81E220C9, 0x490BD41E, 0xA03B0009, 0x7E030009, -0x001C3D30, 0x00203D90, 0x00203504, 0x001E212C, -0x002033E8, 0x001C3D00, 0x00117780, 0x002014A0, -0x0020166C, 0x0011770C, 0x0020391C, 0x0020391D, -0x00203918, 0x002018A2, 0x001C36F8, 0x00203990, -0x00203DA0, 0x00203B84, 0x00203C04, 0x00203C84, -0x00203D04, 0x00203908, 0x002034FC, 0x002014CC, -0x00203994, 0x00203998, 0x0020245C, 0x00203D88, -0x00203D8C, 0x602262F2, 0x40094019, 0xC90F4009, -0x8B0B880A, 0x60E2DE8C, 0x40094019, 0xC90F4009, -0x8B038808, 0xCB0160A2, 0x2802A006, 0x65E2DE87, -0x2E527501, 0x286266A2, 0x52F366F2, 0x2622AE83, -0xD2838551, 0xDE83C802, 0xA0958B01, 0x420B0009, -0x4E0B64A3, 0x5E036403, 0x85E46503, 0x4918E908, -0xD77D209B, 0xE04C81E4, 0xDC7C0B7E, 0x7B01D97C, -0x61C207B6, 0x71016690, 0x8D062668, 0xD4792C12, -0x420BD279, 0xA070EB01, 0x62512DB2, 0x4B18EB0F, -0x22B9E102, 0x32104118, 0x85518B0F, 0x2029E2FC, -0x60518151, 0xCB0172E0, 0x85E12501, 0x202994A3, -0x85E481E1, 0xA0522049, 0x675181E4, 0x4719677D, -0x667E6779, 0x7701276D, 0x6903607C, 0x88014918, -0x25918F3E, 0x6B12D161, 0x21B27B01, 0x660D85E3, -0x40216063, 0xC93F4021, 0x6C034600, 0x262D322A, -0xC8016063, 0xDB5ED15D, 0x967D8901, 0xE6002C6B, -0x666C67CD, 0x40006063, 0x622D021D, 0x8D0E3270, -0x60436403, 0xE9FF021D, 0x8B013290, 0x01C5A007, -0x626C7601, 0x3292E904, 0x646C8BEB, 0x60434400, -0xD15004BD, 0x0B457401, 0x669D6911, 0x89073670, -0x602D6211, 0x890388FF, 0xE201DB4B, 0x2B2021C1, -0xECFC8551, 0x815120C9, 0xCB016051, 0xDC472501, -0x64A34C0B, 0x51F366F2, 0x85EF2612, 0x54F2D244, -0x650D420B, 0x0009ADE7, 0xE500DC42, 0x420B2C52, -0x4E0B64A3, 0x54036403, 0x85446E03, 0x6703E908, -0x65034918, 0x27998541, 0xDB323790, 0x8F0BD932, -0x6013610D, 0x8B07C820, 0xC9486053, 0x8B038808, -0xE501BD4D, 0x0009A005, 0x2128D233, 0xBD468901, -0x64B3E500, 0x490B65E3, 0xADBCEC01, 0x85F22DC2, -0x7001EE04, 0x31E7610D, 0x8D0281F2, 0xADA97A08, -0x7F140009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, -0x000B69F6, 0xF7FF68F6, 0x2FE68000, 0xD2234F22, -0x60E36E22, 0x8D02C840, 0xBBF922E2, 0xE2400009, -0x2E284218, 0xBC048901, 0x60E30009, 0x8905C810, -0xD21CD41B, 0x0009420B, 0x0009BC03, 0xC80560E3, -0xBD6D8901, 0x60E30009, 0x8902C802, 0xAC004F26, -0x4F266EF6, 0x6EF6000B, 0x001C3D3C, 0x00117760, -0x002014A0, 0x0020166C, 0x00203494, 0x00203DA4, -0x00203908, 0x002034FC, 0x002014CC, 0x00203974, -0x0020397C, 0x00203970, 0x00203972, 0x00201530, -0x002018EE, 0x00203994, 0x00008000, 0x001C3510, -0x00203D98, 0x002018A2, 0x080A0C0E, 0x00020406, -0x1A1C1E20, 0x12141618, 0x2E303234, 0x26282A2C, -0x3A3C3E40, 0x6C625648, 0x41112F26, 0xE2208F18, -0x890B3123, 0x321CD204, 0xD1026220, 0x412B312C, -0x00090009, 0x00203412, 0x002033C8, 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, 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, 0x32203120, 0x20383030, 0x323A3132, -0x34333A38, 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, 0x435F4D5A, 0x465F444D, -0x4C445F57, 0x494E495F, 0x00000054, 0x6E6B6E55, -0x206E776F, 0x6D6D6F63, 0x3D646E61, 0x00000000, -0x203A3051, 0x00000020, 0x203A3151, 0x00000020, -0x203A3251, 0x00000020, 0x203A3351, 0x00000020, -0x203A3451, 0x00000020, 0x2B434741, 0x73696F4E, -0x61432065, 0x7262696C, 0x6F697461, 0x6166206E, -0x6F206C69, 0x6974206E, 0x0D0A656D, 0x00000000, -0x00000072, 0x00205220, 0x00000D0A, 0x62735576, -0x7473725F, 0x00000A0D, 0x62735576, 0x7375735F, -0x646E6570, 0x00000A0D, 0x62735576, 0x7365725F, -0x000A0D6D, 0x00000044, 0x44387570, 0x72637365, -0x6F747069, 0x3D584572, 0x00000000, 0x00000047, -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, 0x020C020B, -0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x000000FF, 0x00020001, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x010E010D, 0x00020003, 0x01090108, -0x0002010A, 0x00030003, 0x02020201, 0x02040203, -0x02060205, 0x02020200, 0x02040203, 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, 0x0200010F, 0x02020201, 0x02040203, -0x02060205, 0x02020200, 0x02040203, 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, 0x010F010F, 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, -0x40030405, 0x02090100, 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 = 15936; diff --git a/drivers/staging/otus/hal/hpfwu.c.drv_ba_resend b/drivers/staging/otus/hal/hpfwu.c.drv_ba_resend deleted file mode 100644 index 7f5bcff57b59..000000000000 --- a/drivers/staging/otus/hal/hpfwu.c.drv_ba_resend +++ /dev/null @@ -1,742 +0,0 @@ -/* - * 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; diff --git a/drivers/staging/otus/hal/hpfwu_2k.c b/drivers/staging/otus/hal/hpfwu_2k.c deleted file mode 100644 index b675d6d556b2..000000000000 --- a/drivers/staging/otus/hal/hpfwu_2k.c +++ /dev/null @@ -1,1016 +0,0 @@ -/* - * 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, 0xDE947FFC, 0xE114D594, -0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769, -0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F, -0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B, -0x0009B017, 0xE60095AC, 0xC84060E2, 0x2F028F03, -0x8FF93652, 0xD4887601, 0x4E0BDE88, 0xD4880009, -0x00094E0B, 0x4E0BD487, 0x7F040009, 0xA0524F26, -0x4F226EF6, 0x410BD184, 0xD4840009, 0x0009440B, -0x450BD583, 0xD7830009, 0xD283E1FF, 0x2712611D, -0xD4825029, 0xE1FFCB01, 0x1209E501, 0x12112212, -0xE7202452, 0x4718D57E, 0x2572D27E, 0xD17EE700, -0xD67FD47E, 0xE2012270, 0x24702172, 0xD67D2620, -0x2641E4FF, 0xD57CE600, 0x666DE104, 0x76016063, -0x4000626D, 0x8FF83212, 0xD5780545, 0x2520E201, -0xD278D777, 0xE480E100, 0x22122710, 0x6613D576, -0x666D644C, 0x76046763, 0x375C626D, 0x8FF83243, -0xD5722712, 0xD273D772, 0xE400E101, 0x27102511, -0x000B4F26, 0x7FCC2242, 0xD170D56F, 0xD271DB70, -0x1F51D471, 0xD6717508, 0x1F12D771, 0x1F55710C, -0x1FB975FC, 0x72041F2A, 0x1F13EB10, 0x1F561F44, -0x1F781F67, 0xD86B1F2B, 0xDD6CD96B, 0xDC6CEA00, -0xD26DDE6C, 0x89003A22, 0xD15D7A01, 0x88016010, -0x56F88B03, 0x4218E201, 0xD1682622, 0x0009410B, -0x440BD467, 0xD5670009, 0x0009450B, 0x6010D150, -0x8B108801, 0xE650D14F, 0x46186212, 0x8B083266, -0x56F9D14B, 0x2120E200, 0xCB016062, 0x2602A003, -0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A, -0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801, -0x51F66792, 0x217252F5, 0xD6555191, 0x55FA2212, -0x52FB6462, 0x55612542, 0x2252E400, 0x61436643, -0x05DE6013, 0x36CC4608, 0x07DE2652, 0xC9036071, -0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C, -0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518, -0x60822C62, 0x89018801, 0x0009A168, 0x6272D742, -0x8B132228, 0xD42BD741, 0x6772D541, 0x51536242, -0x312C327C, 0x24222228, 0x15138D05, 0x6262D63D, -0xB1627201, 0xD6232622, 0x2622E200, 0x52916692, -0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C, -0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000, -0x001E1015, 0x00201274, 0x002039EC, 0x002018A2, -0x002039F8, 0x00203A10, 0x00201860, 0x00201964, -0x00201288, 0x001C3510, 0x001C3624, 0x001E212C, -0x002038EC, 0x00203484, 0x002038F4, 0x00203900, -0x0020390C, 0x00203968, 0x0020396C, 0x00203914, -0x00203915, 0x00203918, 0x00117700, 0x00203984, -0x00203982, 0x002034E8, 0x00117710, 0x001C3D30, -0x001C36F8, 0x00117734, 0x001C3684, 0x001C3D00, -0x001C1000, 0x001C1028, 0x002034FC, 0x0020391C, -0x00117600, 0x00117740, 0x7FFFFFFF, 0x00201730, -0x00203322, 0x0020232C, 0x00203D9C, 0x0020396A, -0x002034F4, 0x0020395C, 0x001C3D2C, 0x001C36B0, -0x0020348C, 0x0011775C, 0x8801C90F, 0xA0CF8901, -0xD1960009, 0x36206212, 0xD4958904, 0x2421E200, -0x2162A0CC, 0x6211D193, 0x89012228, 0x0009A0C3, -0xE202D78F, 0x75016571, 0x3123615D, 0x27518D02, -0x0009A0BC, 0xD28C57F2, 0x62226072, 0x40094019, -0xC90F4009, 0x8F19880A, 0x52F31F2C, 0x40196022, -0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009, -0xCB0154F7, 0xD27E55F2, 0xE7012402, 0xD47FE100, -0x22112572, 0x72016242, 0x2422A098, 0x8B3F8805, -0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802, -0xE4FFD577, 0x644D6752, 0x8B102748, 0x6272D775, -0x8B0C3260, 0x51F255F7, 0xD26DE701, 0x21722562, -0xD571E100, 0x64522211, 0xA0777401, 0x52F32542, -0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E, -0xD26A8B6C, 0x672254F4, 0x7701D569, 0x61422272, -0x1F1CE640, 0x46182159, 0x8B033160, 0x6262D665, -0x26227201, 0xE200D65A, 0x2621B067, 0x0009A056, -0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022, -0x40094009, 0x8803C90F, 0xD25B8B16, 0x672254F4, -0x7701D557, 0x61422272, 0x1F1CE640, 0x46182159, -0x8B033160, 0x6262D655, 0x26227201, 0xE200D648, -0x2621B043, 0x0009A010, 0xD452D551, 0xD2446752, -0xE1007701, 0x25723A46, 0x22118F06, 0xEA00D64E, -0x72016262, 0x2622B031, 0x2FB2D54C, 0x95736652, -0xD44A5BF1, 0x36205241, 0x60618910, 0x8B01C803, -0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0, -0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006, -0xE200D62F, 0xD12F2621, 0x2121E200, 0xD13CE201, -0x66122822, 0x8B012668, 0x0009AE2B, 0x450BD539, -0xD1390009, 0xAE24E600, 0x2F862160, 0x2FA62F96, -0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22, 0xDE34D133, -0x54116212, 0x1F4167E2, 0x2F22D432, 0xD5321F72, -0xD2326743, 0x58417794, 0x69425A42, 0x5B166C72, -0x60526D22, 0xCB20E600, 0xE5402502, 0x626D7601, -0x8BFB3253, 0x55F162F2, 0x11512122, 0xD62855F2, -0x14812E52, 0x249214A2, 0x27C2D426, 0x26D211B6, -0xDA256742, 0xE801D925, 0x490B2A72, 0xE2011A8C, -0x1A2C4218, 0x4F267F0C, 0x6DF66EF6, 0x6BF66CF6, -0x69F66AF6, 0x68F6000B, 0x000007D1, 0x0020397C, -0x00203980, 0x00203986, 0x001C3DC0, 0x0011772C, -0x001C3B88, 0x00203964, 0x0011773C, 0x00117744, -0x0000F000, 0x00117764, 0x00117748, 0x00117768, -0x0011776C, 0x01FFFFFF, 0x0011774C, 0x002034F4, -0x00203D9C, 0x002024F0, 0x0020396A, 0x001C3B9C, -0x001C3D98, 0x001C3700, 0x001C3500, 0x001C5960, -0x001C8960, 0x002034FC, 0x001C3D00, 0x0020160C, -0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, -0xDE957FAC, 0x61E0E014, 0x0F14D494, 0x710161E3, -0xE0186210, 0xD2920F24, 0x0009420B, 0x450BD591, -0x20080009, 0x8F126D03, 0xD28F1F07, 0x6720D48F, -0x657CDD8F, 0x470BD78F, 0xD18F0009, 0x619C6910, -0x46086613, 0x36184608, 0x3D6C4608, 0xE0181FD7, -0xE58004FC, 0x604C66E2, 0x3050655C, 0x2D628F15, -0x01FCE014, 0xDE85E500, 0x641CA008, 0x6753655D, -0x607037EC, 0x39DC6953, 0x80947501, 0x3243625D, -0xD67F8BF4, 0xA34EE200, 0x20082621, 0xE0148B13, -0xE40001FC, 0xA009DE79, 0x644D671C, 0x35EC6543, -0x69436652, 0x39DC6262, 0x74041921, 0x3273624D, -0xA3388BF3, 0x88012D10, 0xE0148B17, 0xE70001FC, -0x6D1C2D70, 0xDE6D1FD4, 0x32D3627D, 0xA32A8B01, -0x677D0009, 0x667365E3, 0x61737504, 0x315C36EC, -0x69126462, 0xAFEF7708, 0x88042492, 0xE0148B18, -0xE40001FC, 0x671C2D40, 0x624DDE60, 0x8B013273, -0x0009A311, 0x6943644D, 0x39EC62E3, 0x72046592, -0x3D2C6D43, 0x615266D2, 0x21697408, 0x2512AFED, -0x8B188805, 0x01FCE014, 0x2D40E400, 0xDE53671C, -0x3273624D, 0xA2F68B01, 0x644D0009, 0x62E36943, -0x659239EC, 0x6D437204, 0x66D23D2C, 0x74086152, -0xAFED216B, 0x88312512, 0xD44A8B3A, 0x6146D94A, -0x75046543, 0x67566442, 0x6E531F48, 0x65527E04, -0x7EE462E2, 0x7E0464E2, 0x6EE21FE9, 0x5EF929E0, -0x7E04D942, 0x1FEA60E2, 0x2900C901, 0xD9406EE2, -0x29E04E09, 0x2F562F26, 0x56FAD93E, 0x6513490B, -0xD13D7F08, 0xE71C6E0D, 0x1DE12D70, 0xDE3B6912, -0x64E21D92, 0x1D43D13A, 0xD23A6512, 0x67221D54, -0x1D75D239, 0x1D666622, 0x6262D638, 0x1D27A2AB, -0x8B398830, 0x6596D92B, 0x67926696, 0x61967904, -0x74E46493, 0x6E436992, 0x1F9B7E04, 0x1FEC6442, -0xD9256EE2, 0x5EFC29E0, 0x7E04D924, 0x1FED60E2, -0x2900C901, 0xD9226EE2, 0x29E04E09, 0x59FC7FFC, -0xDE272F92, 0x2F164E0B, 0xD41F7F08, 0xE21C610D, -0x1D112D20, 0xD2206442, 0xD41C1D42, 0x1D536542, -0x6752D51B, 0xD71B1D74, 0x1D156172, 0x1D666622, -0x6262D61A, 0x1D27A26F, 0x8B358833, 0x490BD919, -0xA268EE00, 0x00002DE0, 0x00117800, 0x00203A14, -0x002018A2, 0x00202AA4, 0x00203906, 0x00203A18, -0x0020352C, 0x002018EE, 0x00203905, 0x00117804, -0x00203984, 0x00117810, 0x00203901, 0x00203902, -0x00203903, 0x00200F64, 0x001C5864, 0x001C6864, -0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC, -0x00200FBC, 0x00200FB8, 0x89018828, 0x0009A0C0, -0xE643DEB5, 0x326662E1, 0x1FEE8F02, 0x2E21E240, -0x622D62E1, 0x8B013267, 0x0009A0AA, 0xE50185E1, -0x8B013056, 0x0009A0A4, 0x2D10E101, 0x64E1B225, -0xE64357FE, 0x652D6271, 0x89443567, 0x3563E640, -0xE6008B05, 0x0F65E040, 0xA00FE11A, 0x615372C0, -0x41214121, 0x41214121, 0x45214121, 0x45214521, -0xC9036053, 0xE0406603, 0x71180F65, 0x2209E007, -0x0F25E03C, 0xE044641D, 0xB2A365F3, 0xE33C0F46, -0x853233FC, 0x620DDE95, 0x42086031, 0x6023610D, -0x1323E944, 0x06FE4108, 0xE00F39FC, 0x13144E0B, -0x67075D91, 0x60D32679, 0x0F6654FE, 0x51928542, -0x600D4E0B, 0x60D3260B, 0x0F666492, 0x65F3B237, -0x696156FE, 0xE640659D, 0x89383563, 0xD78359FE, -0x79066591, 0xC9036053, 0x40004008, 0x61036203, -0x0F26E050, 0x470BE0FF, 0x6C07600C, 0x6603605D, -0x46214621, 0x46214621, 0x42006263, 0x4200326C, -0x40214021, 0x4008C903, 0x6D2D30FC, 0xE8006A03, -0xB25765F3, 0x6EA264D3, 0x2EC9E050, 0x66942AE2, -0xD76E01FE, 0x606C470B, 0x2AE22E0B, 0x64D365F3, -0x7801B1FD, 0xEE06628D, 0x8FE932E3, 0x5EFE7D01, -0x61E1E400, 0x410085E1, 0x66E3310C, 0x760C711B, -0xE70465F3, 0x68667401, 0x3A736A4D, 0x8FF92582, -0x65F37504, 0x641DB1E3, 0x64E1B1A4, 0x0009A17B, -0xD45B56F7, 0xEC01D25B, 0x26C0420B, 0x0009A173, -0x06FCE018, 0x8829606C, 0x58F78B08, 0xE400D252, -0x66222840, 0x646DB171, 0x0009A165, 0x666CE681, -0x89013060, 0x0009A0AC, 0xD550D14F, 0x62126A56, -0x212232AC, 0x54116C56, 0x34CC6253, 0x64521141, -0x72085812, 0xD44A384C, 0x68221182, 0x5A136C42, -0x3ACC3C8C, 0x11A324C2, 0x6C2272EC, 0x72105814, -0x118438CC, 0x5A156822, 0x11A53A8C, 0x6A227210, -0xD6405816, 0x118638AC, 0x52176C62, 0x112732CC, -0x5A185861, 0x11A83A8C, 0x5C195A62, 0x11C93CAC, -0x521A5C63, 0x112A32CC, 0x5A1B5864, 0x11AB3A8C, -0x5C1C5A65, 0x11CC3CAC, 0x521D5C66, 0x112D32CC, -0x5A1E5867, 0x11AE3A8C, 0x561F5A68, 0x36ACE840, -0x116FDA2D, 0x6CA2381C, 0x7A946682, 0x286236CC, -0x5C8162A2, 0x18C13C2C, 0x62A27A44, 0x362C5682, -0xD6261862, 0x5A856262, 0x3A2C4229, 0x760418A5, -0x56866262, 0x362C4229, 0x56F71866, 0x2620E238, -0x16C15C81, 0x16226212, 0xE2005C11, 0x551216C3, -0x55151654, 0x55131655, 0x55161656, 0x55821657, -0x65821658, 0x55141659, 0x5584165A, 0x5583165B, -0x5585165C, 0x5586165D, 0x1821165E, 0x11212122, -0x11251122, 0x11261123, 0x28221822, 0x18241124, -0x18251823, 0x1826A0C7, 0x00117804, 0x002033E0, -0x00203A38, 0x002018A2, 0x0020348C, 0x001C36A0, -0x002034E8, 0x001C3CA0, 0x001C36F4, 0x001C3B88, -0x666CE682, 0x8B203060, 0xEA2456F7, 0x26A0D194, -0x16C15C17, 0x16225218, 0x16835819, 0x16A45A1A, -0x16C55C1B, 0x1626521C, 0xE200581D, 0x551E1687, -0x551F1658, 0x11271659, 0x11291128, 0x112B112A, -0x112D112C, 0xA08E112E, 0xE683112F, 0x3060666C, -0x52F78B0B, 0xEA00D883, 0x658222A0, 0x7804DC82, -0x62822C52, 0xA07ED681, 0xE6902620, 0x3060666C, -0xDA7F8B06, 0x00094A0B, 0xE20056F7, 0x2620A073, -0x666CE691, 0x8B103060, 0x6222D276, 0x2228622C, -0xD2788904, 0x0009420B, 0x0009A003, 0x420BD276, -0x56F70009, 0xA05EE200, 0xE6922620, 0x3060666C, -0xE0188951, 0xE6B00BFC, 0x666C62BC, 0x8B2A3260, -0x02FCE014, 0x682CEA00, 0x62ADE904, 0x894A3283, -0x6AADDD64, 0x3CDC6CA3, 0x7D046EC2, 0xDB68D467, -0x32DC62A3, 0x4B0BDC67, 0x4C0B6D22, 0xD46664E3, -0x00094B0B, 0x64D34C0B, 0x4B0BD464, 0xE6000009, -0x666D6BE3, 0x76013B6C, 0x3293626D, 0x8FF72BD0, -0xAFDA4D19, 0xE6B57A08, 0x3260666C, 0xD45C8B13, -0x4B0BDB57, 0xD25B0009, 0x6022DB5B, 0xCB20E6FF, -0x2202666D, 0xDB592B62, 0xE014E200, 0x56F72B20, -0xA01002FC, 0xD4562620, 0x6542D256, 0x420BD456, -0xA0080009, 0xDB520009, 0x52B1E600, 0x622CDB53, -0x52F72B21, 0x7F542260, 0x6EF64F26, 0x6CF66DF6, -0x6AF66BF6, 0x000B69F6, 0x4F2268F6, 0xE240614D, -0x89143123, 0x3127E21F, 0x8B09D749, 0xD449614D, -0xE00171E0, 0x5671440B, 0x26596507, 0x1761A007, -0xE001D444, 0x6672440B, 0x26596507, 0x4F262762, -0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912, -0xD73B3127, 0x614D8B08, 0x5671D23A, 0x420B71E0, -0x260BE001, 0x1761A006, 0x6672D236, 0xE001420B, -0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618, -0x6252D531, 0x89FC2268, 0x0009000B, 0x4618E680, -0xD52D4628, 0x22686252, 0x000B89FC, 0xA0010009, -0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680, -0xD5264628, 0x22686252, 0x000B8BFC, 0x2FE60009, -0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D620, -0x54E11615, 0x16464218, 0x422855E2, 0x57E31657, -0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE, -0x0020348C, 0x00117804, 0x002038EC, 0x00203900, -0x0020050A, 0x00201008, 0x0020102E, 0x00203A50, -0x002018A2, 0x002018E6, 0x00203A64, 0x00203A6C, -0x00203A70, 0x001C3500, 0x001C1000, 0x00203982, -0x00117800, 0x002018EE, 0x00203A84, 0x00203988, -0x001C3704, 0x002033E0, 0x001C373C, 0x001C3700, -0x001C370C, 0x2FD62FC6, 0x4F222FE6, 0x6C53DD10, -0x6E43BFA4, 0x2DE2BF89, 0x0009BFA0, 0x2C1251D5, -0x1C4154D6, 0x1C5255D7, 0x1C6356D8, 0x6EF64F26, -0x000B6DF6, 0x61636CF6, 0xA004E600, 0x62564109, -0x24227601, 0x36127404, 0x000B8BF9, 0x00000009, -0x001C370C, 0x0009A16E, 0x2FE62FD6, 0xDD944F22, -0xA0049EB2, 0xD4930009, 0x420BD293, 0x62D265D2, -0x8BF822E8, 0x0009A004, 0xD28FD490, 0x55D1420B, -0x22E852D1, 0xA0048BF8, 0xD48D0009, 0x420BD28A, -0x52D255D2, 0x8BF822E8, 0x0009A004, 0xD286D489, -0x55D3420B, 0x22E852D3, 0xA0048BF8, 0xD4860009, -0x420BD281, 0x52D455D4, 0x8BF822E8, 0x6EF64F26, -0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636C73, -0x6D53B01A, 0x64D357F4, 0xB05F65E3, 0xB07566C3, -0xB0A40009, 0xB0A80009, 0xB0AC0009, 0xB0AC0009, -0xB0AF0009, 0xB03154F5, 0x6CCD6C03, 0x4F2660C3, -0x6DF66EF6, 0x6CF6000B, 0x3412D170, 0xD6700529, -0x2650D770, 0x2742000B, 0x0009A018, 0x2FD62FC6, -0x4F222FE6, 0x6E636C73, 0x6D53BFEE, 0x64D357F4, -0xB03365E3, 0xB08D66C3, 0xB00F54F5, 0x6CCD6C03, -0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0xE503D162, -0xD763D462, 0x21524518, 0x2472000B, 0xD45FD15E, -0x2162E600, 0x2462000B, 0xBF734F22, 0xBF73E40A, -0xD25C0009, 0x4118E104, 0xE40AE500, 0xBF692212, -0xD7592252, 0xCB206072, 0x000B4F26, 0x4F222702, -0x410BD156, 0xD556E400, 0x4F26452B, 0xD1552FE6, -0x66126E63, 0x92104418, 0x44084528, 0x45002629, -0x265B4408, 0x264B4400, 0x21624708, 0xD14E4708, -0x217227EB, 0x6EF6000B, 0x1FFF03F0, 0x4F222FE6, -0xE101DE4A, 0xBF3DE40A, 0x67E32E12, 0xE500776C, -0xE204E130, 0x2752E40A, 0x27522752, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27222712, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x175ABF18, 0x2E62E600, 0x000B4F26, 0xD2346EF6, -0xE441E101, 0x000B2212, 0xD1322242, 0xE605D432, -0x000B2162, 0x000B2462, 0xD2300009, 0xE40AE601, -0x2262AF00, 0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22, -0x6C43DB2B, 0xED0060B2, 0x2B02CB03, 0xC90360B2, -0x6E03A008, 0x89073DC2, 0xE46460B2, 0xB07CC903, -0x7D016E03, 0x8BF52EE8, 0x8F043DC2, 0xD4212FE1, -0x460BD621, 0x62F10009, 0x6023622D, 0x89FFC801, -0x7F046023, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, -0x001C3B88, 0x00203A98, 0x002018EE, 0x00203AA0, -0x00203AA8, 0x00203AB0, 0x00203AB8, 0x0025E720, -0x00203D98, 0x002038F0, 0x001C5968, 0x001C3B40, -0x000F8000, 0x001D4004, 0x001C3500, 0x002015E0, -0x0020160C, 0x001C5814, 0x001C59D0, 0x001C5830, -0x001C6268, 0x001C59A4, 0x001C639C, 0x001C581C, -0x001C5860, 0x00203AC0, 0x002018A2, 0x8F014411, -0x6043604B, 0x0009000B, 0x5651D52B, 0x46286052, -0x306C000B, 0x2FC62FB6, 0x2FE62FD6, 0x4F124F22, -0xBFF14F02, 0x6B036E43, 0xDD25DC24, 0x0009BFEC, -0x3C0530B8, 0x4609060A, 0x46014609, 0x020A3D65, -0x42094209, 0x32E24209, 0x4F068BF0, 0x4F264F16, -0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6, 0x2FE62FD6, -0x4F124F22, 0xBFCF4F02, 0x6C036E43, 0xBFCBDD13, -0x30C80009, 0x060A3D05, 0x46094609, 0x36E24601, -0x4F068BF5, 0x4F264F16, 0x6DF66EF6, 0x6CF6000B, -0x4F222FE6, 0xE102DE0B, 0xE403E500, 0xBFB92E12, -0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72, -0x6EF6AFB0, 0x0009000B, 0x001C1040, 0xCCCCCCCD, -0x10624DD3, 0x001D4004, 0x2F962F86, 0x2FB62FA6, -0x2FD62FC6, 0x4F222FE6, 0xE5007F98, 0x6453E710, -0x6B534728, 0xEE1ADCBC, 0x6153655D, 0x315C4108, -0x75014108, 0x6043317C, 0x0F16665D, 0xED0060B3, -0x21B136E3, 0x81128111, 0x11D28113, 0x11D411D3, -0x74048FEA, 0xD8B167F2, 0x1871D9B1, 0x58F12872, -0x1981D1B0, 0x59F22982, 0x5DF45AF3, 0x54F65EF5, -0x21921191, 0x11A211A3, 0x11D411D5, 0x11E611E7, -0x11481149, 0xDAA855F7, 0x57F8EE00, 0x52F9DDA7, -0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6, 0x2D729AD5, -0x6EED2622, 0x4D086DE3, 0x3DEC61E3, 0x4D084108, -0x3D9C31EC, 0x410860B3, 0x81D12DB1, 0x4108E050, -0x4008E7B7, 0x677C4108, 0x60B381D2, 0xE200318C, -0x81D33472, 0x1D131DD2, 0x8D01D493, 0xD4901D24, -0xB0B365D3, 0x64ED7E01, 0x8BDA34A2, 0x2FD2DA8C, -0xDD9268A2, 0x2D824829, 0x7DFC64A2, 0xD287694D, -0x6E222D92, 0x7D0C4E29, 0x68222DE2, 0x618D6AD3, -0x2A16D784, 0xD48A6D72, 0x24D2D583, 0xD6895E72, -0x517414E2, 0x1414EE00, 0xD1875876, 0x59781486, -0x1498E710, 0x65E36252, 0x26E2142A, 0xE60064E3, -0x6843644D, 0x384C4808, 0x381C4808, 0x0C866053, -0x09CE28B1, 0x819160B3, 0x0ACE6053, 0x81A26043, -0x0DCE6053, 0x81D360B3, 0x08CE6053, 0x18827401, -0x624D09CE, 0x0ACE19E3, 0x1A643273, 0x75048FE0, -0xE003D96A, 0x40186C92, 0x6D922CB1, 0x81D1DA6F, -0x6E92E050, 0x81E24008, 0x60B36192, 0x64928113, -0x1442E600, 0xD4696792, 0x689217A3, 0x1864E1FF, -0x6563E703, 0x364C4608, 0x26127501, 0x3673665D, -0xDC5B8BF8, 0x6DC2E003, 0x2DB14018, 0xD2606EC2, -0x61C281E1, 0x1112EE00, 0xE02464C2, 0x65C21423, -0x15E4D45B, 0xE58067C2, 0x68C28172, 0x818366E3, -0x666D655C, 0x76046963, 0x394C6A6D, 0x8FF83A53, -0xDB5429E2, 0x24B2DC54, 0x24C27404, 0x4F267F68, -0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B, -0x60116142, 0x8F03C803, 0xD23DE500, 0x8B063420, -0xC9036011, 0x8B068802, 0x3420D239, 0x56128B03, -0x52646513, 0x000B2422, 0x01136053, 0x2FE62FD6, -0x7FEC4F22, 0x62536E53, 0x6D43E550, 0x4508E400, -0xE101A001, 0x60435224, 0x81212211, 0x60538123, -0x56E28122, 0x8BF53620, 0x16E4D238, 0xE61464F3, -0x65E3420B, 0xE4FC65E1, 0x2E512549, 0x65F361F1, -0x2F112149, 0xD13154D1, 0xE614410B, 0x607157D1, -0x2701CB01, 0x7F141DE1, 0x6EF64F26, 0x6DF6000B, -0x2FE62FD6, 0x7FEC4F22, 0x66536E53, 0x6D43E5FC, -0x20596061, 0x2601CB01, 0x326052E2, 0x12E48B06, -0x31E051E2, 0x52D18B04, 0x1E22A002, 0x5664AFF0, -0x64F3D21E, 0x420BE614, 0x67E165E3, 0x2719E1FC, -0x67F12E71, 0x271954D1, 0x65F3D118, 0x410BE614, -0x52D12F71, 0xCB016021, 0x1DE12201, 0x4F267F14, -0x000B6EF6, 0x00006DF6, 0x0020391C, 0x002034EC, -0x002034F4, 0x002034FC, 0x00203524, 0x00203908, -0x00203910, 0x00100208, 0x001017C0, 0x001E210C, -0x001C3D00, 0x0020395C, 0x001000C8, 0x00117880, -0x00117780, 0x00040020, 0x0026C401, 0x00200ED6, -0x4F222FE6, 0xDE42624C, 0x42004208, 0x3E2CA005, -0xD4405252, 0xBF695624, 0x65E22E62, 0x352052E1, -0xD63D8BF6, 0x4F262622, 0x6EF6000B, 0x2FC62FB6, -0x2FE62FD6, 0xDC394F22, 0x52C1DB39, 0x362066C2, -0x6061891C, 0x8801C903, 0xDE348918, 0xBF37DD35, -0x650364E3, 0x66B28503, 0x3262620D, 0xD4328907, -0x0009BF76, 0x4D0BD431, 0xAFE60009, 0xBF3D0009, -0xD42F64E3, 0x00094D0B, 0x0009AFDF, 0x2262D22D, -0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x2FD62FC6, -0x4F222FE6, 0xDD29DC28, 0x6E4360C2, 0x04DE4008, -0xE614D127, 0x65E3410B, 0xD127D726, 0x55E227E2, -0x35E05254, 0x21228F04, 0x400860C2, 0x122202DE, -0x605365C2, 0x75014008, 0x0DE606DE, 0xC90F6053, -0x60632C02, 0x6EF64F26, 0x000B6DF6, 0x85436CF6, -0x650D5643, 0x622D6262, 0x35277204, 0xE1008F0C, -0x2268960C, 0xD6158B03, 0x72015261, 0xD6131621, -0x6262E101, 0x26227201, 0x6013000B, 0x000001FF, -0x002034FC, 0x002034F4, 0x001C3D00, 0x00203524, -0x002038EC, 0x002018A2, 0x002034EC, 0x00203AE8, -0x00203AEC, 0x001C3D28, 0x0020395C, 0x0020391C, -0x00200ED6, 0x00203960, 0x00203964, 0x00117754, -0x2FC62FB6, 0x2FE62FD6, 0x7FF84F22, 0x6022D237, -0x8D58C803, 0xDE362F01, 0xDB37DC36, 0x66C252C1, -0x892F3620, 0xC9036061, 0x892B8801, 0xD233DD31, -0x64D3420B, 0x1F016503, 0x880160B1, 0xD2308B04, -0x64D3420B, 0x0009AFEA, 0x85615653, 0x8904C820, -0xE050D72C, 0x7201027E, 0xD22B0726, 0x6453420B, -0x89072008, 0x55F1D126, 0x64D3410B, 0xE601D727, -0x2762AFD4, 0x55F1D226, 0x64E3420B, 0xE601D125, -0x2162AFCC, 0xDD25DE24, 0xDC26DB25, 0x66D252D1, -0x89183620, 0xC9036061, 0x89148801, 0xD117D41F, -0x0009410B, 0x36E05603, 0x65038F04, 0x2B20E201, -0x2C52AFEC, 0xD712D41C, 0x0009470B, 0xE601D115, -0xAFE34618, 0x60F12162, 0x8907C804, 0x7F08D217, -0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x4F267F08, -0x6DF66EF6, 0x000B6CF6, 0x00006BF6, 0x001E2100, -0x002034FC, 0x002034F4, 0x00203984, 0x002014A0, -0x002014CC, 0x0020348C, 0x002016BE, 0x001E212C, -0x00201530, 0x001C3D30, 0x00117880, 0x002034EC, -0x0020390C, 0x00203908, 0x00203524, 0x00200610, -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, 0x00203AF0, 0xE4FDD29D, 0xD79D6122, -0x22122149, 0x74016022, 0x2202CB01, 0xD59A6622, -0x22622649, 0xC8406070, 0x60528902, 0x2502CB04, -0xE6016052, 0x2502CB08, 0xE4026052, 0x2502C9CF, -0x46186052, 0x2502CB10, 0xCB036052, 0x15422502, -0x1563000B, 0xD78ED58D, 0xD48FD28E, 0xE600E100, -0x27112511, 0xAFCF2210, 0x664C2461, 0x4600D28B, -0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D287, -0x6650352C, 0x2619E1EF, 0x2560000B, 0xD284664C, -0x362C4600, 0xCB106060, 0x2600000B, 0xD280654C, -0x352C4500, 0xE1EF6650, 0x000B2619, 0x664C2560, -0x4600D27A, 0x6060362C, 0x000BCB08, 0x654C2600, -0x4500D276, 0x6650352C, 0x2619E1F7, 0x2560000B, -0xD273664C, 0x362C4600, 0xCB086060, 0x2600000B, -0xD26F654C, 0x352C4500, 0xE1F76650, 0x000B2619, -0x624C2560, 0x4200D669, 0x6020326C, 0x4021C908, -0x40214021, 0x600C000B, 0xD665624C, 0x326C4200, -0xC9086020, 0x40214021, 0x000B4021, 0xD161600C, -0x341C644C, 0x000B6240, 0xD15F602C, 0x341C644C, -0x000B6240, 0x2FE6602C, 0x6E434F22, 0xE60A645C, -0x89143467, 0x0009BFEB, 0x60EC640C, 0x8B028801, -0xA002E00F, 0x44092409, 0x624C4409, 0x3263E60A, -0xBFE28905, 0x620C644C, 0xC8806023, 0xE2008B00, -0x4F266023, 0x6EF6000B, 0xD64C4F22, 0x88016062, -0xB2578B03, 0xA0030009, 0xD2490009, 0x2260E640, -0xE200D648, 0x000B4F26, 0x4F222622, 0x6062D643, -0x8B018802, 0x0009B2A0, 0xE200D642, 0x000B4F26, -0xD53E2622, 0xE100D43E, 0x2512E701, 0x2470000B, -0xE604D23B, 0x2260000B, 0xD43B4F22, 0x410BD13B, -0xD53B0009, 0x6650E1FD, 0x2619D23A, 0x2560E700, -0x000B4F26, 0x4F222270, 0xD238D537, 0xD7386152, -0x2512611D, 0xE6FF6452, 0x2542242B, 0xD22FD435, -0x420B666D, 0xD52E2762, 0x6750E1FB, 0x4F262719, -0x2570000B, 0xD4304F22, 0x410BD128, 0xD5280009, -0x6650E7F7, 0x4F262679, 0x2560000B, 0x9425D524, -0x22496250, 0x2520000B, 0xE4BFD521, 0x22496250, -0x2520000B, 0xD2254F22, 0x600D8522, 0x89112008, -0x89458801, 0x89478803, 0x89498805, 0x894F8806, -0x89558808, 0x895B8809, 0x8961880A, 0x8967880B, -0x0009A06E, 0x0009B070, 0x600CA06B, 0x0000FF7F, -0x001E2148, 0x001E1000, 0x001E1108, 0x002039BC, -0x002039BE, 0x002039DD, 0x002039A0, 0x001E103F, -0x001E105F, 0x001E102F, 0x001E1090, 0x002039C4, -0x001E100B, 0x002039C0, 0x00203AF4, 0x002018A2, -0x001E1028, 0x002039DC, 0x001D4020, 0x98760000, -0x001C1000, 0x00203B00, 0x00203B10, 0x00203994, -0x0009B04C, 0x600CA035, 0x0009B055, 0x600CA031, -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, 0x002039DD, 0x00203994, 0x002039A0, -0x001E1100, 0x001E100C, 0x002039C0, 0x001E1000, -0x001E1001, 0x002039C8, 0x002039A8, 0x002039AC, -0x002039B0, 0x002039CC, 0x002039D0, 0x002039D4, -0x002039D8, 0x00203DFC, 0x00203E06, 0x002039BA, -0x0020287E, 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, 0x64E3BC85, -0xBC8A64E3, 0x62EC7E01, 0x8BF732D7, 0xBC8DEE01, -0x64E364E3, 0x7E01BC92, 0x32D762EC, 0x4F268BF7, -0x000B6EF6, 0xD1186DF6, 0xD418920D, 0x72122122, -0x2422D617, 0xD7177204, 0x72202622, 0x2722D116, -0x000B7230, 0x137A2122, 0x002039BA, 0x0020298A, -0x001E1015, 0x002039C0, 0x001E1001, 0x00203994, -0x001E1100, 0x002039BE, 0x002039AC, 0x001E1000, -0x002039B0, 0x002039BC, 0x0020287E, 0x001E100C, -0x002039A8, 0x002039C4, 0x002039C8, 0x002039CC, -0x002039D0, 0x002039D4, 0x002039D8, 0x4F222FE6, -0xD6707FFC, 0x88016060, 0xE2018951, 0x2620BFBB, -0xD56ED16D, 0xDE6E6010, 0x64E36552, 0x7402C840, -0x8D22D16C, 0xD26C7502, 0xE601D76C, 0xE7042722, -0x76016255, 0x626C2421, 0x8FF93273, 0xD4637402, -0x6242E601, 0x640D8528, 0x67494419, 0x275D657E, -0x81E4607C, 0xE417D562, 0x67557601, 0x3243626C, -0x8FF92171, 0xA0207102, 0xD25E0009, 0xE601D75B, -0xE7042722, 0x76016255, 0x626C2421, 0x8FF93273, -0xD4527402, 0x6242E601, 0x640D8528, 0x67494419, -0x275D657E, 0x81E4607C, 0xE417D553, 0x67557601, -0x3243626C, 0x8FF92171, 0x92897102, 0xD2462E21, -0x5E23D74E, 0x64F22FE2, 0x604365F2, 0x2700C980, -0xC9606043, 0x80716103, 0xC9036043, 0x80724519, -0x65F2605C, 0x817266F2, 0x46194629, 0x606C4529, -0x4018645C, 0x8173304C, 0x21185E23, 0x64F22FE2, -0x6E4C62F2, 0x602C4219, 0x66F262F2, 0x46294018, -0x461930EC, 0x42298174, 0x652C606C, 0x305C4018, -0x81758F07, 0x0009BC96, 0x2228620C, 0xA00A8908, -0x60130009, 0x8B038840, 0x0009B009, 0x0009A003, -0xE202D62F, 0x7F042622, 0x000B4F26, 0x4F226EF6, -0x8552D52A, 0x8830600D, 0x88318903, 0xA0348923, -0x85550009, 0xD428D727, 0x85532701, 0x610DD627, -0x24124118, 0x460BD426, 0xD7230009, 0xD226D425, -0x6572420B, 0xE230D120, 0x42286712, 0x2729E620, -0x37604628, 0xD6218B03, 0xA016E200, 0xD61F2622, -0xA012E202, 0xD1182622, 0x6212E530, 0xE6204528, -0x46282259, 0x89083260, 0xD41AD119, 0xE601D513, -0x2160450B, 0x472BD718, 0x4F264F26, 0x0009000B, -0x0000060A, 0x002039DC, 0x001E1000, 0x002039C8, -0x00203DFC, 0x00203E08, 0x00203DA0, 0x002039B0, -0x00203DD0, 0x00203DCE, 0x00203DA2, 0x00203994, -0x002039C0, 0x002039AC, 0x002039A8, 0x002018A2, -0x00203B1C, 0x00203B20, 0x002018EE, 0x002039C4, -0x001E100B, 0x00203B34, 0x00114004, 0x4F222FE6, -0xDE967FFC, 0x200884E9, 0x2F008D06, 0xD695D494, -0x0009460B, 0x64F0B19A, 0x6620D293, 0x89022668, -0xC9BF60E0, 0x7F042E00, 0x000B4F26, 0x000B6EF6, -0x2FE60009, 0xDE8D4F22, 0x60E0D68D, 0xCBC0D48D, -0x62602E00, 0xC803602C, 0x40218904, 0x70014021, -0x6603A002, 0x66034009, 0xD687616D, 0xE500A004, -0x75016262, 0x74042422, 0x3213625D, 0xD2838BF8, -0x0009420B, 0xC9BF84E2, 0x4F2680E2, 0x6EF6000B, -0x2FE62FD6, 0x7FFC4F22, 0x6260D67D, 0x89442228, -0xD572E100, 0x60502610, 0xCB40D47A, 0x2500440B, -0x8D052008, 0x62E06E03, 0x7104612C, 0x2F11A006, -0xD475D66D, 0xDD756760, 0x657C4D0B, 0xE23C6D1D, -0x8B033D27, 0xD267D472, 0x0009420B, 0x4D214D21, -0xA005D770, 0x66E6E400, 0x357C4508, 0x74012562, -0x35D3654D, 0xD76C8BF7, 0x6172E003, 0x81114018, -0x6E7260F1, 0x81E2700C, 0xD4686172, 0xDD688113, -0x4D0BDE68, 0xE2016572, 0xD4672E22, 0x420BD255, -0xD6560009, 0xC93F6060, 0x7F042600, 0x6EF64F26, -0x6DF6000B, 0x2FC62FB6, 0x2FE62FD6, 0xD25F4F22, -0x6B436E73, 0x420B6C53, 0x20086D63, 0x64038D1C, -0xE50ED149, 0x32526210, 0x60C38916, 0x804124B0, -0x814160D3, 0xA007E500, 0x655D61BC, 0x00EC6053, -0x364C6653, 0x80647501, 0x3213625D, 0xD63B8BF5, -0xC9BF6060, 0x2600A008, 0xD23AD44D, 0x6EF64F26, -0x6CF66DF6, 0x6BF6422B, 0x6EF64F26, 0x6CF66DF6, -0x6BF6000B, 0x7FC44F22, 0x720262F3, 0x22512F41, -0x45297202, 0x60632251, 0xE5C4E682, 0x67F38121, -0x655C666C, 0xE408BFB6, 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, 0xBF79666C, -0x7F3C655C, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, -0x000B69F6, 0xD11E68F6, 0x6012D21E, 0xCB20E405, -0x2102E500, 0x000B2242, 0x00002252, 0x001E1017, -0x00203B38, 0x002018A2, 0x00203906, 0x001E1015, -0x001E10BF, 0x00117800, 0x001E10FC, 0x00200610, -0x0020390C, 0x00202AE2, 0x00203B3C, 0x002018EE, -0x00203B58, 0x0011788C, 0x00203908, 0x002034EC, -0x00201530, 0x001E2130, 0x00203B60, 0x00202AA4, -0x00203B64, 0x0020396C, 0x00203974, 0x00203D9C, -0x001C3500, 0x001D4004, 0xD564D163, 0xE400D764, -0x2142E20F, 0x17411154, 0xD5622722, 0x9669D762, -0x15412572, 0x96661562, 0xE6011565, 0xD55F1165, -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, 0x0009BE67, -0xC81060E3, 0xBE648901, 0x60E30009, 0x8901C840, -0x0009BE86, 0xC80160E3, 0xDD3D8938, 0xC80260D0, -0x2F008D03, 0x460BD63B, 0x60F00009, 0x8902C804, -0x460BD639, 0x62F00009, 0xC8806023, 0x60D08902, -0x2D00C97F, 0xC8016023, 0xD6348906, 0x0009460B, -0x0009A007, 0x51630601, 0x8902C808, 0x460BD630, -0x60F00009, 0x8902C810, 0x420BD22E, 0xD52E0009, -0x88026052, 0xD22D8B03, 0xA005E604, 0x88012260, -0xD22A8B02, 0x2260E601, 0x2522E200, 0xC88060E3, -0xD227892D, 0x60E36E20, 0x8902C880, 0x420BD225, -0x60E30009, 0x8902C840, 0x420BD223, 0x60E30009, -0x8902C802, 0x420BD221, 0x60E30009, 0x890DC804, -0xDD20D11F, 0x0009410B, 0x0009BF0D, 0x0009BF4C, -0xD51ED41D, 0x2470E708, 0x25D2BF85, 0xC80860E3, -0xD21B8905, 0x4F267F04, 0x422B6EF6, 0x7F046DF6, -0x6EF64F26, 0x6DF6000B, 0x001C581C, 0xA000A000, -0x001D0100, 0x001D4000, 0x00040021, 0x001C589C, -0x001E1021, 0x00201A88, 0x00201AAA, 0x0020210C, -0x00201AC2, 0x00201AD0, 0x002039C0, 0x001E100B, -0x001E1028, 0x00201B3C, 0x00201B48, 0x00201AD8, -0x00201AF6, 0x12345678, 0x001E1000, 0x0010F100, -0x00201B24, 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, 0x002039BA, 0x002039BC, -0x002039BE, 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, 0x00203905, 0x00203904, -0x00203906, 0x0020352C, 0x7FFC4F22, 0xE680D19F, -0x666C6212, 0xD29E2F22, 0x67F36563, 0x420B7542, -0x7F04E404, 0x000B4F26, 0xE6800009, 0xD298666C, -0xE7006563, 0x422B7540, 0xE6806473, 0xD294666C, -0xE7006563, 0x422B7543, 0x2F866473, 0x2FA62F96, -0x2FC62FB6, 0x2FE62FD6, 0x7FCC4F22, 0xDC8ED28D, -0x72011F21, 0xDB8D1F22, 0xD18EDE8D, 0x66125211, -0x8B013620, 0x0009A0E5, 0xC9036061, 0x8B018801, -0x0009A0DF, 0xD288D487, 0xED84420B, 0x2F025503, -0x30D0845C, 0xA0B88901, 0xD1840009, 0x626C6610, -0x88016023, 0xD1828B68, 0x62101FC3, 0x895B2228, -0xE003D480, 0x40186742, 0x68421772, 0xD57EE900, -0x81816DB3, 0x7D042190, 0x67D26AB2, 0x64E26852, -0x1F491F57, 0x740464E3, 0x1FA46542, 0x65431F5A, -0x625275F8, 0x1F761FD5, 0x6D531F2B, 0xDA74D773, -0x7D94D274, 0x68D21F88, 0x6AA26972, 0xD1726022, -0x2202CB20, 0xE1401F1C, 0x7601E600, 0x3213626D, -0x56F48BFB, 0x52F651F5, 0x21222B62, 0x52F851F7, -0x212256F9, 0x2E6251FA, 0x51FB2412, 0x2D822512, -0xD9662792, 0x29A2DD5F, 0x6AD2D965, 0xD9646892, -0x68D21A84, 0x6081DA63, 0x2801CB01, 0xD86266D2, -0x2A622962, 0xED015AFC, 0x2AD2480B, 0x2AD24D18, -0x62D2DD5E, 0x2D227201, 0xD15056F3, 0xE2026062, -0x2602CB01, 0x2120A03D, 0x8B3A2228, 0xE401DD58, -0x2140E600, 0xE01C2D62, 0xC801005C, 0xD4558B0A, -0xE600D755, 0xED7D2472, 0x626C7601, 0x8BFB32D3, -0x24D2DD52, 0xE2FE68C2, 0x2C822829, 0x095CE01E, -0xE01F5DF1, 0x0A5C2D90, 0x751051F2, 0xED0621A0, -0xD74BE600, 0x8456D44B, 0x27007601, 0x696C6854, -0x248039D3, 0x8FF67401, 0xDA477701, 0x2A10E194, -0xE2007A01, 0x7A0F2A20, 0xD130E805, 0x66102A80, -0x6023626C, 0x89088801, 0xD240D42A, 0x420B65F2, -0xD131ED01, 0xAF304D18, 0x65F221D2, 0x8553D43C, -0x620D6642, 0x89073262, 0xD13BD43A, 0x0009410B, -0xE601D73A, 0x2762AF1A, 0xD134D41E, 0x410B65F2, -0xD125ED01, 0xD637D436, 0x460B4D18, 0xAF0D21D2, -0x7F340009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, -0x000B69F6, 0x4F2268F6, 0x85467FF4, 0x2F01E681, -0x666C8547, 0x854881F1, 0x81F2D209, 0x67F38542, -0x854381F3, 0x81F4E40C, 0x65636053, 0x420B81F5, -0x7F0C7540, 0x000B4F26, 0x00000009, 0x001C3D9C, -0x00202454, 0x0011779A, 0x001C36F8, 0x001C3B9C, -0x001C3704, 0x00203524, 0x002014A0, 0x00203915, -0x00203914, 0x00203910, 0x001C3D98, 0x001C3BB4, -0x001C5960, 0x001C3500, 0x001C3D30, 0x001C8960, -0x002034FC, 0x001C3D00, 0x0020160C, 0x00117730, -0x00203918, 0x001C582C, 0x2000A000, 0x0000A000, -0x0011778C, 0x00117792, 0x00117788, 0x002014CC, -0x002038EC, 0x002034EC, 0x00201530, 0x001E2130, -0x00203D7C, 0x002018A2, 0x2F962F86, 0x2FB62FA6, -0x2FD62FC6, 0x4F222FE6, 0xD19B7FEC, 0x2F12E000, -0x6103D49A, 0x1F4281F2, 0xDD9ADA99, 0xD69A6813, -0xE0014808, 0x460BDE99, 0x38EC4800, 0x65A21F03, -0x352052A1, 0xA23E8B01, 0x60510009, 0x8801C903, -0xA2388B01, 0x52530009, 0x32E0DE91, 0xD9918B10, -0x64A3490B, 0x4B0BDB90, 0xDE906403, 0xD791D690, -0xEC01D591, 0x2E02E100, 0x271026C0, 0x2502AFDF, -0xC8018551, 0xA1578B01, 0x62510009, 0x4200622D, -0x5E53366A, 0x85E2226D, 0xC903642C, 0x85E36603, -0x6053650D, 0x40214021, 0x4500C93F, 0x322A6703, -0x6053252D, 0xC901D17F, 0x60106C03, 0x8801D97F, -0xDB7F8B05, 0x2120E200, 0xCB0160B2, 0xD17D2B02, -0x88016011, 0x65A28B0A, 0x8D042448, 0x9B9E6251, -0xA00322B9, 0x919B2521, 0x2521221B, 0x37B3EB10, -0x2448895E, 0xD4738B07, 0x22286241, 0x60638903, -0xA05781F8, 0xD5706473, 0x46084608, 0x85E26273, -0x46006B50, 0x362C4200, 0x2BB8C910, 0x8F1F6463, -0x26686603, 0xD2698911, 0x062D6043, 0x4119616D, -0x6B0E6019, 0x81F820BD, 0x880160C3, 0x646C8F2C, -0x880F6073, 0xA0278B1B, 0xD2610009, 0x052D6043, -0x4119615D, 0x670E6019, 0x645C207D, 0x81F8A01C, -0x890F2668, 0x6043D25B, 0x6B5D052D, 0x60B94B19, -0x201D610E, 0x60C381F8, 0x8F0D8801, 0x6473645C, -0xEC00A00A, 0x6043D254, 0x625D052D, 0x60294219, -0x207D670E, 0x81F8645C, 0x880285F8, 0x85E1890A, -0x8D07C820, 0xE6DC6203, 0x60232269, 0x81E1A002, -0x644CE4FF, 0x6210D149, 0x89012228, 0x644CE4FF, -0x654DEBFF, 0x35B06BBC, 0xDB368B2B, 0x64A34B0B, -0x410BD135, 0x54036403, 0x85446E03, 0xC948DB40, -0xDC408808, 0xBEAE8B01, 0x64B3E502, 0x65E34C0B, -0xDB3DEC01, 0xD13D2DC2, 0x621260B2, 0x72017001, -0x21228805, 0x2B028F08, 0x666CE680, 0x6563D238, -0x7549E700, 0x6473420B, 0xA030D436, 0x7FFF0009, -0x85E28000, 0x20B9EBFC, 0x610381E2, 0x942A85E3, -0x62032049, 0x450885F8, 0x81E2201B, 0xC90160C3, -0x40084018, 0x40084008, 0x4000225B, 0x6023220B, -0x85E481E3, 0x4118E108, 0x81E4201B, 0xE40262A2, -0x20B98521, 0x67A28121, 0xCB016071, 0x85F82701, -0x89033042, 0xECE785E2, 0x81E220C9, 0x490BD41E, -0xA03B0009, 0x7E030009, 0x001C3D30, 0x00203D88, -0x002034FC, 0x001E212C, 0x002033E0, 0x001C3D00, -0x00117780, 0x002014A0, 0x0020166C, 0x0011770C, -0x00203914, 0x00203915, 0x00203910, 0x002018A2, -0x001C36F8, 0x00203988, 0x00203D98, 0x00203B7C, -0x00203BFC, 0x00203C7C, 0x00203CFC, 0x00203900, -0x002034F4, 0x002014CC, 0x0020398C, 0x00203990, -0x00202454, 0x00203D80, 0x00203D84, 0x602262F2, -0x40094019, 0xC90F4009, 0x8B0B880A, 0x60E2DE8C, -0x40094019, 0xC90F4009, 0x8B038808, 0xCB0160A2, -0x2802A006, 0x65E2DE87, 0x2E527501, 0x286266A2, -0x52F366F2, 0x2622AE83, 0xD2838551, 0xDE83C802, -0xA0958B01, 0x420B0009, 0x4E0B64A3, 0x5E036403, -0x85E46503, 0x4918E908, 0xD77D209B, 0xE04C81E4, -0xDC7C0B7E, 0x7B01D97C, 0x61C207B6, 0x71016690, -0x8D062668, 0xD4792C12, 0x420BD279, 0xA070EB01, -0x62512DB2, 0x4B18EB0F, 0x22B9E102, 0x32104118, -0x85518B0F, 0x2029E2FC, 0x60518151, 0xCB0172E0, -0x85E12501, 0x202994A3, 0x85E481E1, 0xA0522049, -0x675181E4, 0x4719677D, 0x667E6779, 0x7701276D, -0x6903607C, 0x88014918, 0x25918F3E, 0x6B12D161, -0x21B27B01, 0x660D85E3, 0x40216063, 0xC93F4021, -0x6C034600, 0x262D322A, 0xC8016063, 0xDB5ED15D, -0x967D8901, 0xE6002C6B, 0x666C67CD, 0x40006063, -0x622D021D, 0x8D0E3270, 0x60436403, 0xE9FF021D, -0x8B013290, 0x01C5A007, 0x626C7601, 0x3292E904, -0x646C8BEB, 0x60434400, 0xD15004BD, 0x0B457401, -0x669D6911, 0x89073670, 0x602D6211, 0x890388FF, -0xE201DB4B, 0x2B2021C1, 0xECFC8551, 0x815120C9, -0xCB016051, 0xDC472501, 0x64A34C0B, 0x51F366F2, -0x85EF2612, 0x54F2D244, 0x650D420B, 0x0009ADE7, -0xE500DC42, 0x420B2C52, 0x4E0B64A3, 0x54036403, -0x85446E03, 0x6703E908, 0x65034918, 0x27998541, -0xDB323790, 0x8F0BD932, 0x6013610D, 0x8B07C820, -0xC9486053, 0x8B038808, 0xE501BD4D, 0x0009A005, -0x2128D233, 0xBD468901, 0x64B3E500, 0x490B65E3, -0xADBCEC01, 0x85F22DC2, 0x7001EE04, 0x31E7610D, -0x8D0281F2, 0xADA97A08, 0x7F140009, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0xF7FF68F6, -0x2FE68000, 0xD2234F22, 0x60E36E22, 0x8D02C840, -0xBBF922E2, 0xE2400009, 0x2E284218, 0xBC048901, -0x60E30009, 0x8905C810, 0xD21CD41B, 0x0009420B, -0x0009BC03, 0xC80560E3, 0xBD6D8901, 0x60E30009, -0x8902C802, 0xAC004F26, 0x4F266EF6, 0x6EF6000B, -0x001C3D3C, 0x00117760, 0x002014A0, 0x0020166C, -0x0020348C, 0x00203D9C, 0x00203900, 0x002034F4, -0x002014CC, 0x0020396C, 0x00203974, 0x00203968, -0x0020396A, 0x00201530, 0x002018EE, 0x0020398C, -0x00008000, 0x001C3510, 0x00203D90, 0x002018A2, -0x080A0C0E, 0x00020406, 0x1A1C1E20, 0x12141618, -0x2E303234, 0x26282A2C, 0x3A3C3E40, 0x6C625648, -0x41112F26, 0xE2208F18, 0x890B3123, 0x321CD204, -0xD1026220, 0x412B312C, 0x00090009, 0x0020340A, -0x002033C0, 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, 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, 0x32203120, -0x20383030, 0x323A3132, 0x32313A37, 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, -0x435F4D5A, 0x465F444D, 0x4C445F57, 0x494E495F, -0x00000054, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63, -0x3D646E61, 0x00000000, 0x203A3051, 0x00000020, -0x203A3151, 0x00000020, 0x203A3251, 0x00000020, -0x203A3351, 0x00000020, 0x203A3451, 0x00000020, -0x2B434741, 0x73696F4E, 0x61432065, 0x7262696C, -0x6F697461, 0x6166206E, 0x6F206C69, 0x6974206E, -0x0D0A656D, 0x00000000, 0x00000072, 0x00205220, -0x00000D0A, 0x62735576, 0x7473725F, 0x00000A0D, -0x62735576, 0x7375735F, 0x646E6570, 0x00000A0D, -0x62735576, 0x7365725F, 0x000A0D6D, 0x00000044, -0x44387570, 0x72637365, 0x6F747069, 0x3D584572, -0x00000000, 0x00000047, 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, 0x020C020B, 0x020E020D, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x000000FF, -0x00020001, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D, -0x00020003, 0x01090108, 0x0002010A, 0x00030003, -0x02020201, 0x02040203, 0x02060205, 0x02020200, -0x02040203, 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, 0x0200010F, -0x02020201, 0x02040203, 0x02060205, 0x02020200, -0x02040203, 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, 0x010F010F, -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, 0x40030405, 0x02090100, -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 = 15928; diff --git a/drivers/staging/otus/hal/hpfwu_BA.c b/drivers/staging/otus/hal/hpfwu_BA.c deleted file mode 100644 index f89419b37431..000000000000 --- a/drivers/staging/otus/hal/hpfwu_BA.c +++ /dev/null @@ -1,874 +0,0 @@ -/* - * 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; diff --git a/drivers/staging/otus/hal/hpfwu_FB50_mdk.c b/drivers/staging/otus/hal/hpfwu_FB50_mdk.c deleted file mode 100644 index ed1736f945ab..000000000000 --- a/drivers/staging/otus/hal/hpfwu_FB50_mdk.c +++ /dev/null @@ -1,721 +0,0 @@ -/* - * 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; diff --git a/drivers/staging/otus/hal/hpfwu_OTUS_RC.c b/drivers/staging/otus/hal/hpfwu_OTUS_RC.c deleted file mode 100644 index accbec4369f7..000000000000 --- a/drivers/staging/otus/hal/hpfwu_OTUS_RC.c +++ /dev/null @@ -1,715 +0,0 @@ -/* - * 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; diff --git a/drivers/staging/otus/hal/hpfwu_txstream.c b/drivers/staging/otus/hal/hpfwu_txstream.c deleted file mode 100644 index 2b77cbacc6d6..000000000000 --- a/drivers/staging/otus/hal/hpfwu_txstream.c +++ /dev/null @@ -1,1017 +0,0 @@ -/* - * 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, 0xDE947FFC, 0xE114D594, -0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769, -0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F, -0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B, -0x0009B017, 0xE60095AC, 0xC84060E2, 0x2F028F03, -0x8FF93652, 0xD4887601, 0x4E0BDE88, 0xD4880009, -0x00094E0B, 0x4E0BD487, 0x7F040009, 0xA0524F26, -0x4F226EF6, 0x410BD184, 0xD4840009, 0x0009440B, -0x450BD583, 0xD7830009, 0xD283E1FF, 0x2712611D, -0xD4825029, 0xE1FFCB01, 0x1209E501, 0x12112212, -0xE7202452, 0x4718D57E, 0x2572D27E, 0xD17EE700, -0xD67FD47E, 0xE2012270, 0x24702172, 0xD67D2620, -0x2641E4FF, 0xD57CE600, 0x666DE104, 0x76016063, -0x4000626D, 0x8FF83212, 0xD5780545, 0x2520E201, -0xD278D777, 0xE480E100, 0x22122710, 0x6613D576, -0x666D644C, 0x76046763, 0x375C626D, 0x8FF83243, -0xD5722712, 0xD273D772, 0xE400E101, 0x27102511, -0x000B4F26, 0x7FCC2242, 0xD170D56F, 0xD271DB70, -0x1F51D471, 0xD6717508, 0x1F12D771, 0x1F55710C, -0x1FB975FC, 0x72041F2A, 0x1F13EB10, 0x1F561F44, -0x1F781F67, 0xD86B1F2B, 0xDD6CD96B, 0xDC6CEA00, -0xD26DDE6C, 0x89003A22, 0xD15D7A01, 0x88016010, -0x56F88B03, 0x4218E201, 0xD1682622, 0x0009410B, -0x440BD467, 0xD5670009, 0x0009450B, 0x6010D150, -0x8B108801, 0xE650D14F, 0x46186212, 0x8B083266, -0x56F9D14B, 0x2120E200, 0xCB016062, 0x2602A003, -0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A, -0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801, -0x51F66792, 0x217252F5, 0xD6555191, 0x55FA2212, -0x52FB6462, 0x55612542, 0x2252E400, 0x61436643, -0x05DE6013, 0x36CC4608, 0x07DE2652, 0xC9036071, -0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C, -0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518, -0x60822C62, 0x89018801, 0x0009A168, 0x6272D742, -0x8B132228, 0xD42BD741, 0x6772D541, 0x51536242, -0x312C327C, 0x24222228, 0x15138D05, 0x6262D63D, -0xB1627201, 0xD6232622, 0x2622E200, 0x52916692, -0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C, -0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000, -0x001E1015, 0x00201274, 0x002039F4, 0x002018A2, -0x00203A00, 0x00203A18, 0x00201860, 0x0020196C, -0x00201288, 0x001C3510, 0x001C3624, 0x001E212C, -0x002038F4, 0x0020348C, 0x002038FC, 0x00203908, -0x00203914, 0x00203970, 0x00203974, 0x0020391C, -0x0020391D, 0x00203920, 0x00117700, 0x0020398C, -0x0020398A, 0x002034F0, 0x00117710, 0x001C3D30, -0x001C36F8, 0x00117734, 0x001C3684, 0x001C3D00, -0x001C1000, 0x001C1028, 0x00203504, 0x00203924, -0x00117600, 0x00117740, 0x7FFFFFFF, 0x00201730, -0x0020332A, 0x00202334, 0x00203DA4, 0x00203972, -0x002034FC, 0x00203964, 0x001C3D2C, 0x001C36B0, -0x00203494, 0x0011775C, 0x8801C90F, 0xA0CF8901, -0xD1960009, 0x36206212, 0xD4958904, 0x2421E200, -0x2162A0CC, 0x6211D193, 0x89012228, 0x0009A0C3, -0xE202D78F, 0x75016571, 0x3123615D, 0x27518D02, -0x0009A0BC, 0xD28C57F2, 0x62226072, 0x40094019, -0xC90F4009, 0x8F19880A, 0x52F31F2C, 0x40196022, -0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009, -0xCB0154F7, 0xD27E55F2, 0xE7012402, 0xD47FE100, -0x22112572, 0x72016242, 0x2422A098, 0x8B3F8805, -0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802, -0xE4FFD577, 0x644D6752, 0x8B102748, 0x6272D775, -0x8B0C3260, 0x51F255F7, 0xD26DE701, 0x21722562, -0xD571E100, 0x64522211, 0xA0777401, 0x52F32542, -0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E, -0xD26A8B6C, 0x672254F4, 0x7701D569, 0x61422272, -0x1F1CE640, 0x46182159, 0x8B033160, 0x6262D665, -0x26227201, 0xE200D65A, 0x2621B067, 0x0009A056, -0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022, -0x40094009, 0x8803C90F, 0xD25B8B16, 0x672254F4, -0x7701D557, 0x61422272, 0x1F1CE640, 0x46182159, -0x8B033160, 0x6262D655, 0x26227201, 0xE200D648, -0x2621B043, 0x0009A010, 0xD452D551, 0xD2446752, -0xE1007701, 0x25723A46, 0x22118F06, 0xEA00D64E, -0x72016262, 0x2622B031, 0x2FB2D54C, 0x95736652, -0xD44A5BF1, 0x36205241, 0x60618910, 0x8B01C803, -0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0, -0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006, -0xE200D62F, 0xD12F2621, 0x2121E200, 0xD13CE201, -0x66122822, 0x8B012668, 0x0009AE2B, 0x450BD539, -0xD1390009, 0xAE24E600, 0x2F862160, 0x2FA62F96, -0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22, 0xDE34D133, -0x54116212, 0x1F4167E2, 0x2F22D432, 0xD5321F72, -0xD2326743, 0x58417794, 0x69425A42, 0x5B166C72, -0x60526D22, 0xCB20E600, 0xE5402502, 0x626D7601, -0x8BFB3253, 0x55F162F2, 0x11512122, 0xD62855F2, -0x14812E52, 0x249214A2, 0x27C2D426, 0x26D211B6, -0xDA256742, 0xE801D925, 0x490B2A72, 0xE2011A8C, -0x1A2C4218, 0x4F267F0C, 0x6DF66EF6, 0x6BF66CF6, -0x69F66AF6, 0x68F6000B, 0x000007D1, 0x00203984, -0x00203988, 0x0020398E, 0x001C3DC0, 0x0011772C, -0x001C3B88, 0x0020396C, 0x0011773C, 0x00117744, -0x0000F000, 0x00117764, 0x00117748, 0x00117768, -0x0011776C, 0x01FFFFFF, 0x0011774C, 0x002034FC, -0x00203DA4, 0x002024F8, 0x00203972, 0x001C3B9C, -0x001C3D98, 0x001C3700, 0x001C3500, 0x001C5960, -0x001C8960, 0x00203504, 0x001C3D00, 0x0020160C, -0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, -0xDE957FAC, 0x61E0E014, 0x0F14D494, 0x710161E3, -0xE0186210, 0xD2920F24, 0x0009420B, 0x450BD591, -0x20080009, 0x8F126D03, 0xD28F1F07, 0x6720D48F, -0x657CDD8F, 0x470BD78F, 0xD18F0009, 0x619C6910, -0x46086613, 0x36184608, 0x3D6C4608, 0xE0181FD7, -0xE58004FC, 0x604C66E2, 0x3050655C, 0x2D628F15, -0x01FCE014, 0xDE85E500, 0x641CA008, 0x6753655D, -0x607037EC, 0x39DC6953, 0x80947501, 0x3243625D, -0xD67F8BF4, 0xA34EE200, 0x20082621, 0xE0148B13, -0xE40001FC, 0xA009DE79, 0x644D671C, 0x35EC6543, -0x69436652, 0x39DC6262, 0x74041921, 0x3273624D, -0xA3388BF3, 0x88012D10, 0xE0148B17, 0xE70001FC, -0x6D1C2D70, 0xDE6D1FD4, 0x32D3627D, 0xA32A8B01, -0x677D0009, 0x667365E3, 0x61737504, 0x315C36EC, -0x69126462, 0xAFEF7708, 0x88042492, 0xE0148B18, -0xE40001FC, 0x671C2D40, 0x624DDE60, 0x8B013273, -0x0009A311, 0x6943644D, 0x39EC62E3, 0x72046592, -0x3D2C6D43, 0x615266D2, 0x21697408, 0x2512AFED, -0x8B188805, 0x01FCE014, 0x2D40E400, 0xDE53671C, -0x3273624D, 0xA2F68B01, 0x644D0009, 0x62E36943, -0x659239EC, 0x6D437204, 0x66D23D2C, 0x74086152, -0xAFED216B, 0x88312512, 0xD44A8B3A, 0x6146D94A, -0x75046543, 0x67566442, 0x6E531F48, 0x65527E04, -0x7EE462E2, 0x7E0464E2, 0x6EE21FE9, 0x5EF929E0, -0x7E04D942, 0x1FEA60E2, 0x2900C901, 0xD9406EE2, -0x29E04E09, 0x2F562F26, 0x56FAD93E, 0x6513490B, -0xD13D7F08, 0xE71C6E0D, 0x1DE12D70, 0xDE3B6912, -0x64E21D92, 0x1D43D13A, 0xD23A6512, 0x67221D54, -0x1D75D239, 0x1D666622, 0x6262D638, 0x1D27A2AB, -0x8B398830, 0x6596D92B, 0x67926696, 0x61967904, -0x74E46493, 0x6E436992, 0x1F9B7E04, 0x1FEC6442, -0xD9256EE2, 0x5EFC29E0, 0x7E04D924, 0x1FED60E2, -0x2900C901, 0xD9226EE2, 0x29E04E09, 0x59FC7FFC, -0xDE272F92, 0x2F164E0B, 0xD41F7F08, 0xE21C610D, -0x1D112D20, 0xD2206442, 0xD41C1D42, 0x1D536542, -0x6752D51B, 0xD71B1D74, 0x1D156172, 0x1D666622, -0x6262D61A, 0x1D27A26F, 0x8B358833, 0x490BD919, -0xA268EE00, 0x00002DE0, 0x00117800, 0x00203A1C, -0x002018A2, 0x00202AAC, 0x0020390E, 0x00203A20, -0x00203534, 0x002018EE, 0x0020390D, 0x00117804, -0x0020398C, 0x00117810, 0x00203909, 0x0020390A, -0x0020390B, 0x00200F64, 0x001C5864, 0x001C6864, -0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC, -0x00200FBC, 0x00200FB8, 0x89018828, 0x0009A0C0, -0xE643DEB5, 0x326662E1, 0x1FEE8F02, 0x2E21E240, -0x622D62E1, 0x8B013267, 0x0009A0AA, 0xE50185E1, -0x8B013056, 0x0009A0A4, 0x2D10E101, 0x64E1B225, -0xE64357FE, 0x652D6271, 0x89443567, 0x3563E640, -0xE6008B05, 0x0F65E040, 0xA00FE11A, 0x615372C0, -0x41214121, 0x41214121, 0x45214121, 0x45214521, -0xC9036053, 0xE0406603, 0x71180F65, 0x2209E007, -0x0F25E03C, 0xE044641D, 0xB2A365F3, 0xE33C0F46, -0x853233FC, 0x620DDE95, 0x42086031, 0x6023610D, -0x1323E944, 0x06FE4108, 0xE00F39FC, 0x13144E0B, -0x67075D91, 0x60D32679, 0x0F6654FE, 0x51928542, -0x600D4E0B, 0x60D3260B, 0x0F666492, 0x65F3B237, -0x696156FE, 0xE640659D, 0x89383563, 0xD78359FE, -0x79066591, 0xC9036053, 0x40004008, 0x61036203, -0x0F26E050, 0x470BE0FF, 0x6C07600C, 0x6603605D, -0x46214621, 0x46214621, 0x42006263, 0x4200326C, -0x40214021, 0x4008C903, 0x6D2D30FC, 0xE8006A03, -0xB25765F3, 0x6EA264D3, 0x2EC9E050, 0x66942AE2, -0xD76E01FE, 0x606C470B, 0x2AE22E0B, 0x64D365F3, -0x7801B1FD, 0xEE06628D, 0x8FE932E3, 0x5EFE7D01, -0x61E1E400, 0x410085E1, 0x66E3310C, 0x760C711B, -0xE70465F3, 0x68667401, 0x3A736A4D, 0x8FF92582, -0x65F37504, 0x641DB1E3, 0x64E1B1A4, 0x0009A17B, -0xD45B56F7, 0xEC01D25B, 0x26C0420B, 0x0009A173, -0x06FCE018, 0x8829606C, 0x58F78B08, 0xE400D252, -0x66222840, 0x646DB171, 0x0009A165, 0x666CE681, -0x89013060, 0x0009A0AC, 0xD550D14F, 0x62126A56, -0x212232AC, 0x54116C56, 0x34CC6253, 0x64521141, -0x72085812, 0xD44A384C, 0x68221182, 0x5A136C42, -0x3ACC3C8C, 0x11A324C2, 0x6C2272EC, 0x72105814, -0x118438CC, 0x5A156822, 0x11A53A8C, 0x6A227210, -0xD6405816, 0x118638AC, 0x52176C62, 0x112732CC, -0x5A185861, 0x11A83A8C, 0x5C195A62, 0x11C93CAC, -0x521A5C63, 0x112A32CC, 0x5A1B5864, 0x11AB3A8C, -0x5C1C5A65, 0x11CC3CAC, 0x521D5C66, 0x112D32CC, -0x5A1E5867, 0x11AE3A8C, 0x561F5A68, 0x36ACE840, -0x116FDA2D, 0x6CA2381C, 0x7A946682, 0x286236CC, -0x5C8162A2, 0x18C13C2C, 0x62A27A44, 0x362C5682, -0xD6261862, 0x5A856262, 0x3A2C4229, 0x760418A5, -0x56866262, 0x362C4229, 0x56F71866, 0x2620E238, -0x16C15C81, 0x16226212, 0xE2005C11, 0x551216C3, -0x55151654, 0x55131655, 0x55161656, 0x55821657, -0x65821658, 0x55141659, 0x5584165A, 0x5583165B, -0x5585165C, 0x5586165D, 0x1821165E, 0x11212122, -0x11251122, 0x11261123, 0x28221822, 0x18241124, -0x18251823, 0x1826A0C7, 0x00117804, 0x002033E8, -0x00203A40, 0x002018A2, 0x00203494, 0x001C36A0, -0x002034F0, 0x001C3CA0, 0x001C36F4, 0x001C3B88, -0x666CE682, 0x8B203060, 0xEA2456F7, 0x26A0D194, -0x16C15C17, 0x16225218, 0x16835819, 0x16A45A1A, -0x16C55C1B, 0x1626521C, 0xE200581D, 0x551E1687, -0x551F1658, 0x11271659, 0x11291128, 0x112B112A, -0x112D112C, 0xA08E112E, 0xE683112F, 0x3060666C, -0x52F78B0B, 0xEA00D883, 0x658222A0, 0x7804DC82, -0x62822C52, 0xA07ED681, 0xE6902620, 0x3060666C, -0xDA7F8B06, 0x00094A0B, 0xE20056F7, 0x2620A073, -0x666CE691, 0x8B103060, 0x6222D276, 0x2228622C, -0xD2788904, 0x0009420B, 0x0009A003, 0x420BD276, -0x56F70009, 0xA05EE200, 0xE6922620, 0x3060666C, -0xE0188951, 0xE6B00BFC, 0x666C62BC, 0x8B2A3260, -0x02FCE014, 0x682CEA00, 0x62ADE904, 0x894A3283, -0x6AADDD64, 0x3CDC6CA3, 0x7D046EC2, 0xDB68D467, -0x32DC62A3, 0x4B0BDC67, 0x4C0B6D22, 0xD46664E3, -0x00094B0B, 0x64D34C0B, 0x4B0BD464, 0xE6000009, -0x666D6BE3, 0x76013B6C, 0x3293626D, 0x8FF72BD0, -0xAFDA4D19, 0xE6B57A08, 0x3260666C, 0xD45C8B13, -0x4B0BDB57, 0xD25B0009, 0x6022DB5B, 0xCB20E6FF, -0x2202666D, 0xDB592B62, 0xE014E200, 0x56F72B20, -0xA01002FC, 0xD4562620, 0x6542D256, 0x420BD456, -0xA0080009, 0xDB520009, 0x52B1E600, 0x622CDB53, -0x52F72B21, 0x7F542260, 0x6EF64F26, 0x6CF66DF6, -0x6AF66BF6, 0x000B69F6, 0x4F2268F6, 0xE240614D, -0x89143123, 0x3127E21F, 0x8B09D749, 0xD449614D, -0xE00171E0, 0x5671440B, 0x26596507, 0x1761A007, -0xE001D444, 0x6672440B, 0x26596507, 0x4F262762, -0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912, -0xD73B3127, 0x614D8B08, 0x5671D23A, 0x420B71E0, -0x260BE001, 0x1761A006, 0x6672D236, 0xE001420B, -0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618, -0x6252D531, 0x89FC2268, 0x0009000B, 0x4618E680, -0xD52D4628, 0x22686252, 0x000B89FC, 0xA0010009, -0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680, -0xD5264628, 0x22686252, 0x000B8BFC, 0x2FE60009, -0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D620, -0x54E11615, 0x16464218, 0x422855E2, 0x57E31657, -0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE, -0x00203494, 0x00117804, 0x002038F4, 0x00203908, -0x0020050A, 0x00201008, 0x0020102E, 0x00203A58, -0x002018A2, 0x002018E6, 0x00203A6C, 0x00203A74, -0x00203A78, 0x001C3500, 0x001C1000, 0x0020398A, -0x00117800, 0x002018EE, 0x00203A8C, 0x00203990, -0x001C3704, 0x002033E8, 0x001C373C, 0x001C3700, -0x001C370C, 0x2FD62FC6, 0x4F222FE6, 0x6C53DD10, -0x6E43BFA4, 0x2DE2BF89, 0x0009BFA0, 0x2C1251D5, -0x1C4154D6, 0x1C5255D7, 0x1C6356D8, 0x6EF64F26, -0x000B6DF6, 0x61636CF6, 0xA004E600, 0x62564109, -0x24227601, 0x36127404, 0x000B8BF9, 0x00000009, -0x001C370C, 0x0009A16E, 0x2FE62FD6, 0xDD944F22, -0xA0049EB2, 0xD4930009, 0x420BD293, 0x62D265D2, -0x8BF822E8, 0x0009A004, 0xD28FD490, 0x55D1420B, -0x22E852D1, 0xA0048BF8, 0xD48D0009, 0x420BD28A, -0x52D255D2, 0x8BF822E8, 0x0009A004, 0xD286D489, -0x55D3420B, 0x22E852D3, 0xA0048BF8, 0xD4860009, -0x420BD281, 0x52D455D4, 0x8BF822E8, 0x6EF64F26, -0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636C73, -0x6D53B01A, 0x64D357F4, 0xB05F65E3, 0xB07566C3, -0xB0A40009, 0xB0A80009, 0xB0AC0009, 0xB0AC0009, -0xB0AF0009, 0xB03154F5, 0x6CCD6C03, 0x4F2660C3, -0x6DF66EF6, 0x6CF6000B, 0x3412D170, 0xD6700529, -0x2650D770, 0x2742000B, 0x0009A018, 0x2FD62FC6, -0x4F222FE6, 0x6E636C73, 0x6D53BFEE, 0x64D357F4, -0xB03365E3, 0xB08D66C3, 0xB00F54F5, 0x6CCD6C03, -0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0xE503D162, -0xD763D462, 0x21524518, 0x2472000B, 0xD45FD15E, -0x2162E600, 0x2462000B, 0xBF734F22, 0xBF73E40A, -0xD25C0009, 0x4118E104, 0xE40AE500, 0xBF692212, -0xD7592252, 0xCB206072, 0x000B4F26, 0x4F222702, -0x410BD156, 0xD556E400, 0x4F26452B, 0xD1552FE6, -0x66126E63, 0x92104418, 0x44084528, 0x45002629, -0x265B4408, 0x264B4400, 0x21624708, 0xD14E4708, -0x217227EB, 0x6EF6000B, 0x1FFF03F0, 0x4F222FE6, -0xE101DE4A, 0xBF3DE40A, 0x67E32E12, 0xE500776C, -0xE204E130, 0x2752E40A, 0x27522752, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x27522752, 0x27522752, 0x27522752, 0x27222712, -0x27522752, 0x27522752, 0x27522752, 0x27522752, -0x175ABF18, 0x2E62E600, 0x000B4F26, 0xD2346EF6, -0xE441E101, 0x000B2212, 0xD1322242, 0xE605D432, -0x000B2162, 0x000B2462, 0xD2300009, 0xE40AE601, -0x2262AF00, 0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22, -0x6C43DB2B, 0xED0060B2, 0x2B02CB03, 0xC90360B2, -0x6E03A008, 0x89073DC2, 0xE46460B2, 0xB07CC903, -0x7D016E03, 0x8BF52EE8, 0x8F043DC2, 0xD4212FE1, -0x460BD621, 0x62F10009, 0x6023622D, 0x89FFC801, -0x7F046023, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, -0x001C3B88, 0x00203AA0, 0x002018EE, 0x00203AA8, -0x00203AB0, 0x00203AB8, 0x00203AC0, 0x0025E720, -0x00203DA0, 0x002038F8, 0x001C5968, 0x001C3B40, -0x000F8000, 0x001D4004, 0x001C3500, 0x002015E0, -0x0020160C, 0x001C5814, 0x001C59D0, 0x001C5830, -0x001C6268, 0x001C59A4, 0x001C639C, 0x001C581C, -0x001C5860, 0x00203AC8, 0x002018A2, 0x8F014411, -0x6043604B, 0x0009000B, 0x5651D52B, 0x46286052, -0x306C000B, 0x2FC62FB6, 0x2FE62FD6, 0x4F124F22, -0xBFF14F02, 0x6B036E43, 0xDD25DC24, 0x0009BFEC, -0x3C0530B8, 0x4609060A, 0x46014609, 0x020A3D65, -0x42094209, 0x32E24209, 0x4F068BF0, 0x4F264F16, -0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6, 0x2FE62FD6, -0x4F124F22, 0xBFCF4F02, 0x6C036E43, 0xBFCBDD13, -0x30C80009, 0x060A3D05, 0x46094609, 0x36E24601, -0x4F068BF5, 0x4F264F16, 0x6DF66EF6, 0x6CF6000B, -0x4F222FE6, 0xE102DE0B, 0xE403E500, 0xBFB92E12, -0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72, -0x6EF6AFB0, 0x0009000B, 0x001C1040, 0xCCCCCCCD, -0x10624DD3, 0x001D4004, 0x2F962F86, 0x2FB62FA6, -0x2FD62FC6, 0x4F222FE6, 0xE5007F98, 0x6453E710, -0x6B534728, 0xEE1ADCBC, 0x6153655D, 0x315C4108, -0x75014108, 0x6043317C, 0x0F16665D, 0xED0060B3, -0x21B136E3, 0x81128111, 0x11D28113, 0x11D411D3, -0x74048FEA, 0xD8B167F2, 0x1871D9B1, 0x58F12872, -0x1981D1B0, 0x59F22982, 0x5DF45AF3, 0x54F65EF5, -0x21921191, 0x11A211A3, 0x11D411D5, 0x11E611E7, -0x11481149, 0xDAA855F7, 0x57F8EE00, 0x52F9DDA7, -0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6, 0x2D729AD5, -0x6EED2622, 0x4D086DE3, 0x3DEC61E3, 0x4D084108, -0x3D9C31EC, 0x410860B3, 0x81D12DB1, 0x4108E050, -0x4008E7B7, 0x677C4108, 0x60B381D2, 0xE200318C, -0x81D33472, 0x1D131DD2, 0x8D01D493, 0xD4901D24, -0xB0B365D3, 0x64ED7E01, 0x8BDA34A2, 0x2FD2DA8C, -0xDD9268A2, 0x2D824829, 0x7DFC64A2, 0xD287694D, -0x6E222D92, 0x7D0C4E29, 0x68222DE2, 0x618D6AD3, -0x2A16D784, 0xD48A6D72, 0x24D2D583, 0xD6895E72, -0x517414E2, 0x1414EE00, 0xD1875876, 0x59781486, -0x1498E710, 0x65E36252, 0x26E2142A, 0xE60064E3, -0x6843644D, 0x384C4808, 0x381C4808, 0x0C866053, -0x09CE28B1, 0x819160B3, 0x0ACE6053, 0x81A26043, -0x0DCE6053, 0x81D360B3, 0x08CE6053, 0x18827401, -0x624D09CE, 0x0ACE19E3, 0x1A643273, 0x75048FE0, -0xE003D96A, 0x40186C92, 0x6D922CB1, 0x81D1DA6F, -0x6E92E050, 0x81E24008, 0x60B36192, 0x64928113, -0x1442E600, 0xD4696792, 0x689217A3, 0x1864E1FF, -0x6563E703, 0x364C4608, 0x26127501, 0x3673665D, -0xDC5B8BF8, 0x6DC2E003, 0x2DB14018, 0xD2606EC2, -0x61C281E1, 0x1112EE00, 0xE02464C2, 0x65C21423, -0x15E4D45B, 0xE58067C2, 0x68C28172, 0x818366E3, -0x666D655C, 0x76046963, 0x394C6A6D, 0x8FF83A53, -0xDB5429E2, 0x24B2DC54, 0x24C27404, 0x4F267F68, -0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B, -0x60116142, 0x8F03C803, 0xD23DE500, 0x8B063420, -0xC9036011, 0x8B068802, 0x3420D239, 0x56128B03, -0x52646513, 0x000B2422, 0x01136053, 0x2FE62FD6, -0x7FEC4F22, 0x62536E53, 0x6D43E550, 0x4508E400, -0xE101A001, 0x60435224, 0x81212211, 0x60538123, -0x56E28122, 0x8BF53620, 0x16E4D238, 0xE61464F3, -0x65E3420B, 0xE4FC65E1, 0x2E512549, 0x65F361F1, -0x2F112149, 0xD13154D1, 0xE614410B, 0x607157D1, -0x2701CB01, 0x7F141DE1, 0x6EF64F26, 0x6DF6000B, -0x2FE62FD6, 0x7FEC4F22, 0x66536E53, 0x6D43E5FC, -0x20596061, 0x2601CB01, 0x326052E2, 0x12E48B06, -0x31E051E2, 0x52D18B04, 0x1E22A002, 0x5664AFF0, -0x64F3D21E, 0x420BE614, 0x67E165E3, 0x2719E1FC, -0x67F12E71, 0x271954D1, 0x65F3D118, 0x410BE614, -0x52D12F71, 0xCB016021, 0x1DE12201, 0x4F267F14, -0x000B6EF6, 0x00006DF6, 0x00203924, 0x002034F4, -0x002034FC, 0x00203504, 0x0020352C, 0x00203910, -0x00203918, 0x00100208, 0x001017C0, 0x001E210C, -0x001C3D00, 0x00203964, 0x001000C8, 0x00117880, -0x00117780, 0x00040020, 0x0026C401, 0x00200ED6, -0x4F222FE6, 0xDE42624C, 0x42004208, 0x3E2CA005, -0xD4405252, 0xBF695624, 0x65E22E62, 0x352052E1, -0xD63D8BF6, 0x4F262622, 0x6EF6000B, 0x2FC62FB6, -0x2FE62FD6, 0xDC394F22, 0x52C1DB39, 0x362066C2, -0x6061891C, 0x8801C903, 0xDE348918, 0xBF37DD35, -0x650364E3, 0x66B28503, 0x3262620D, 0xD4328907, -0x0009BF76, 0x4D0BD431, 0xAFE60009, 0xBF3D0009, -0xD42F64E3, 0x00094D0B, 0x0009AFDF, 0x2262D22D, -0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x2FD62FC6, -0x4F222FE6, 0xDD29DC28, 0x6E4360C2, 0x04DE4008, -0xE614D127, 0x65E3410B, 0xD127D726, 0x55E227E2, -0x35E05254, 0x21228F04, 0x400860C2, 0x122202DE, -0x605365C2, 0x75014008, 0x0DE606DE, 0xC90F6053, -0x60632C02, 0x6EF64F26, 0x000B6DF6, 0x85436CF6, -0x650D5643, 0x622D6262, 0x35277204, 0xE1008F0C, -0x2268960C, 0xD6158B03, 0x72015261, 0xD6131621, -0x6262E101, 0x26227201, 0x6013000B, 0x000001FF, -0x00203504, 0x002034FC, 0x001C3D00, 0x0020352C, -0x002038F4, 0x002018A2, 0x002034F4, 0x00203AF0, -0x00203AF4, 0x001C3D28, 0x00203964, 0x00203924, -0x00200ED6, 0x00203968, 0x0020396C, 0x00117754, -0x2FC62FB6, 0x2FE62FD6, 0x7FF84F22, 0x6022D237, -0x8D58C803, 0xDE362F01, 0xDB37DC36, 0x66C252C1, -0x892F3620, 0xC9036061, 0x892B8801, 0xD233DD31, -0x64D3420B, 0x1F016503, 0x880160B1, 0xD2308B04, -0x64D3420B, 0x0009AFEA, 0x85615653, 0x8904C820, -0xE050D72C, 0x7201027E, 0xD22B0726, 0x6453420B, -0x89072008, 0x55F1D126, 0x64D3410B, 0xE601D727, -0x2762AFD4, 0x55F1D226, 0x64E3420B, 0xE601D125, -0x2162AFCC, 0xDD25DE24, 0xDC26DB25, 0x66D252D1, -0x89183620, 0xC9036061, 0x89148801, 0xD117D41F, -0x0009410B, 0x36E05603, 0x65038F04, 0x2B20E201, -0x2C52AFEC, 0xD712D41C, 0x0009470B, 0xE601D115, -0xAFE34618, 0x60F12162, 0x8907C804, 0x7F08D217, -0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x4F267F08, -0x6DF66EF6, 0x000B6CF6, 0x00006BF6, 0x001E2100, -0x00203504, 0x002034FC, 0x0020398C, 0x002014A0, -0x002014CC, 0x00203494, 0x002016BE, 0x001E212C, -0x00201530, 0x001C3D30, 0x00117880, 0x002034F4, -0x00203914, 0x00203910, 0x0020352C, 0x00200610, -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, 0x00203AF8, 0xE4FDD29F, 0xD79F6122, -0x22122149, 0x74016022, 0x2202CB01, 0xD59C6622, -0x22622649, 0xC8406070, 0x60528902, 0x2502CB04, -0xE1F76452, 0x25422419, 0xE7016052, 0x2502CB40, -0xE6026052, 0x2502C9CF, 0x47186052, 0x2502CB10, -0xCB036052, 0x15622502, 0x1573000B, 0xD78ED58D, -0xD48FD28E, 0xE600E100, 0x27112511, 0xAFCB2210, -0x664C2461, 0x4600D28B, 0x6060362C, 0x000BCB10, -0x654C2600, 0x4500D287, 0x6650352C, 0x2619E1EF, -0x2560000B, 0xD284664C, 0x362C4600, 0xCB106060, -0x2600000B, 0xD280654C, 0x352C4500, 0xE1EF6650, -0x000B2619, 0x664C2560, 0x4600D27A, 0x6060362C, -0x000BCB08, 0x654C2600, 0x4500D276, 0x6650352C, -0x2619E1F7, 0x2560000B, 0xD273664C, 0x362C4600, -0xCB086060, 0x2600000B, 0xD26F654C, 0x352C4500, -0xE1F76650, 0x000B2619, 0x624C2560, 0x4200D669, -0x6020326C, 0x4021C908, 0x40214021, 0x600C000B, -0xD665624C, 0x326C4200, 0xC9086020, 0x40214021, -0x000B4021, 0xD161600C, 0x341C644C, 0x000B6240, -0xD15F602C, 0x341C644C, 0x000B6240, 0x2FE6602C, -0x6E434F22, 0xE60A645C, 0x89143467, 0x0009BFEB, -0x60EC640C, 0x8B028801, 0xA002E00F, 0x44092409, -0x624C4409, 0x3263E60A, 0xBFE28905, 0x620C644C, -0xC8806023, 0xE2008B00, 0x4F266023, 0x6EF6000B, -0xD64C4F22, 0x88016062, 0xB2578B03, 0xA0030009, -0xD2490009, 0x2260E640, 0xE200D648, 0x000B4F26, -0x4F222622, 0x6062D643, 0x8B018802, 0x0009B2A0, -0xE200D642, 0x000B4F26, 0xD53E2622, 0xE100D43E, -0x2512E701, 0x2470000B, 0xE604D23B, 0x2260000B, -0xD43B4F22, 0x410BD13B, 0xD53B0009, 0x6650E1FD, -0x2619D23A, 0x2560E700, 0x000B4F26, 0x4F222270, -0xD238D537, 0xD7386152, 0x2512611D, 0xE6FF6452, -0x2542242B, 0xD22FD435, 0x420B666D, 0xD52E2762, -0x6750E1FB, 0x4F262719, 0x2570000B, 0xD4304F22, -0x410BD128, 0xD5280009, 0x6650E7F7, 0x4F262679, -0x2560000B, 0x9425D524, 0x22496250, 0x2520000B, -0xE4BFD521, 0x22496250, 0x2520000B, 0xD2254F22, -0x600D8522, 0x89112008, 0x89458801, 0x89478803, -0x89498805, 0x894F8806, 0x89558808, 0x895B8809, -0x8961880A, 0x8967880B, 0x0009A06E, 0x0009B070, -0x600CA06B, 0x0000FF7F, 0x001E2148, 0x001E1000, -0x001E1108, 0x002039C4, 0x002039C6, 0x002039E5, -0x002039A8, 0x001E103F, 0x001E105F, 0x001E102F, -0x001E1090, 0x002039CC, 0x001E100B, 0x002039C8, -0x00203AFC, 0x002018A2, 0x001E1028, 0x002039E4, -0x001D4020, 0x98760000, 0x001C1000, 0x00203B08, -0x00203B18, 0x0020399C, 0x0009B04C, 0x600CA035, -0x0009B055, 0x600CA031, 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, 0x002039E5, -0x0020399C, 0x002039A8, 0x001E1100, 0x001E100C, -0x002039C8, 0x001E1000, 0x001E1001, 0x002039D0, -0x002039B0, 0x002039B4, 0x002039B8, 0x002039D4, -0x002039D8, 0x002039DC, 0x002039E0, 0x00203E04, -0x00203E0E, 0x002039C2, 0x00202886, 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, 0x64E3BC85, 0xBC8A64E3, 0x62EC7E01, -0x8BF732D7, 0xBC8DEE01, 0x64E364E3, 0x7E01BC92, -0x32D762EC, 0x4F268BF7, 0x000B6EF6, 0xD1186DF6, -0xD418920D, 0x72122122, 0x2422D617, 0xD7177204, -0x72202622, 0x2722D116, 0x000B7230, 0x137A2122, -0x002039C2, 0x00202992, 0x001E1015, 0x002039C8, -0x001E1001, 0x0020399C, 0x001E1100, 0x002039C6, -0x002039B4, 0x001E1000, 0x002039B8, 0x002039C4, -0x00202886, 0x001E100C, 0x002039B0, 0x002039CC, -0x002039D0, 0x002039D4, 0x002039D8, 0x002039DC, -0x002039E0, 0x4F222FE6, 0xD6707FFC, 0x88016060, -0xE2018951, 0x2620BFBB, 0xD56ED16D, 0xDE6E6010, -0x64E36552, 0x7402C840, 0x8D22D16C, 0xD26C7502, -0xE601D76C, 0xE7042722, 0x76016255, 0x626C2421, -0x8FF93273, 0xD4637402, 0x6242E601, 0x640D8528, -0x67494419, 0x275D657E, 0x81E4607C, 0xE417D562, -0x67557601, 0x3243626C, 0x8FF92171, 0xA0207102, -0xD25E0009, 0xE601D75B, 0xE7042722, 0x76016255, -0x626C2421, 0x8FF93273, 0xD4527402, 0x6242E601, -0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C, -0xE417D553, 0x67557601, 0x3243626C, 0x8FF92171, -0x92897102, 0xD2462E21, 0x5E23D74E, 0x64F22FE2, -0x604365F2, 0x2700C980, 0xC9606043, 0x80716103, -0xC9036043, 0x80724519, 0x65F2605C, 0x817266F2, -0x46194629, 0x606C4529, 0x4018645C, 0x8173304C, -0x21185E23, 0x64F22FE2, 0x6E4C62F2, 0x602C4219, -0x66F262F2, 0x46294018, 0x461930EC, 0x42298174, -0x652C606C, 0x305C4018, 0x81758F07, 0x0009BC96, -0x2228620C, 0xA00A8908, 0x60130009, 0x8B038840, -0x0009B009, 0x0009A003, 0xE202D62F, 0x7F042622, -0x000B4F26, 0x4F226EF6, 0x8552D52A, 0x8830600D, -0x88318903, 0xA0348923, 0x85550009, 0xD428D727, -0x85532701, 0x610DD627, 0x24124118, 0x460BD426, -0xD7230009, 0xD226D425, 0x6572420B, 0xE230D120, -0x42286712, 0x2729E620, 0x37604628, 0xD6218B03, -0xA016E200, 0xD61F2622, 0xA012E202, 0xD1182622, -0x6212E530, 0xE6204528, 0x46282259, 0x89083260, -0xD41AD119, 0xE601D513, 0x2160450B, 0x472BD718, -0x4F264F26, 0x0009000B, 0x0000060A, 0x002039E4, -0x001E1000, 0x002039D0, 0x00203E04, 0x00203E10, -0x00203DA8, 0x002039B8, 0x00203DD8, 0x00203DD6, -0x00203DAA, 0x0020399C, 0x002039C8, 0x002039B4, -0x002039B0, 0x002018A2, 0x00203B24, 0x00203B28, -0x002018EE, 0x002039CC, 0x001E100B, 0x00203B3C, -0x00114004, 0x4F222FE6, 0xDE967FFC, 0x200884E9, -0x2F008D06, 0xD695D494, 0x0009460B, 0x64F0B19A, -0x6620D293, 0x89022668, 0xC9BF60E0, 0x7F042E00, -0x000B4F26, 0x000B6EF6, 0x2FE60009, 0xDE8D4F22, -0x60E0D68D, 0xCBC0D48D, 0x62602E00, 0xC803602C, -0x40218904, 0x70014021, 0x6603A002, 0x66034009, -0xD687616D, 0xE500A004, 0x75016262, 0x74042422, -0x3213625D, 0xD2838BF8, 0x0009420B, 0xC9BF84E2, -0x4F2680E2, 0x6EF6000B, 0x2FE62FD6, 0x7FFC4F22, -0x6260D67D, 0x89442228, 0xD572E100, 0x60502610, -0xCB40D47A, 0x2500440B, 0x8D052008, 0x62E06E03, -0x7104612C, 0x2F11A006, 0xD475D66D, 0xDD756760, -0x657C4D0B, 0xE23C6D1D, 0x8B033D27, 0xD267D472, -0x0009420B, 0x4D214D21, 0xA005D770, 0x66E6E400, -0x357C4508, 0x74012562, 0x35D3654D, 0xD76C8BF7, -0x6172E003, 0x81114018, 0x6E7260F1, 0x81E2700C, -0xD4686172, 0xDD688113, 0x4D0BDE68, 0xE2016572, -0xD4672E22, 0x420BD255, 0xD6560009, 0xC93F6060, -0x7F042600, 0x6EF64F26, 0x6DF6000B, 0x2FC62FB6, -0x2FE62FD6, 0xD25F4F22, 0x6B436E73, 0x420B6C53, -0x20086D63, 0x64038D1C, 0xE50ED149, 0x32526210, -0x60C38916, 0x804124B0, 0x814160D3, 0xA007E500, -0x655D61BC, 0x00EC6053, 0x364C6653, 0x80647501, -0x3213625D, 0xD63B8BF5, 0xC9BF6060, 0x2600A008, -0xD23AD44D, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, -0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x7FC44F22, -0x720262F3, 0x22512F41, 0x45297202, 0x60632251, -0xE5C4E682, 0x67F38121, 0x655C666C, 0xE408BFB6, -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, 0xBF79666C, 0x7F3C655C, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0xD11E68F6, -0x6012D21E, 0xCB20E405, 0x2102E500, 0x000B2242, -0x00002252, 0x001E1017, 0x00203B40, 0x002018A2, -0x0020390E, 0x001E1015, 0x001E10BF, 0x00117800, -0x001E10FC, 0x00200610, 0x00203914, 0x00202AEA, -0x00203B44, 0x002018EE, 0x00203B60, 0x0011788C, -0x00203910, 0x002034F4, 0x00201530, 0x001E2130, -0x00203B68, 0x00202AAC, 0x00203B6C, 0x00203974, -0x0020397C, 0x00203DA4, 0x001C3500, 0x001D4004, -0xD564D163, 0xE400D764, 0x2142E20F, 0x17411154, -0xD5622722, 0x9669D762, 0x15412572, 0x96661562, -0xE6011565, 0xD55F1165, 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, 0x0009BE67, 0xC81060E3, 0xBE648901, -0x60E30009, 0x8901C840, 0x0009BE86, 0xC80160E3, -0xDD3D8938, 0xC80260D0, 0x2F008D03, 0x460BD63B, -0x60F00009, 0x8902C804, 0x460BD639, 0x62F00009, -0xC8806023, 0x60D08902, 0x2D00C97F, 0xC8016023, -0xD6348906, 0x0009460B, 0x0009A007, 0x51630601, -0x8902C808, 0x460BD630, 0x60F00009, 0x8902C810, -0x420BD22E, 0xD52E0009, 0x88026052, 0xD22D8B03, -0xA005E604, 0x88012260, 0xD22A8B02, 0x2260E601, -0x2522E200, 0xC88060E3, 0xD227892D, 0x60E36E20, -0x8902C880, 0x420BD225, 0x60E30009, 0x8902C840, -0x420BD223, 0x60E30009, 0x8902C802, 0x420BD221, -0x60E30009, 0x890DC804, 0xDD20D11F, 0x0009410B, -0x0009BF0D, 0x0009BF4C, 0xD51ED41D, 0x2470E708, -0x25D2BF85, 0xC80860E3, 0xD21B8905, 0x4F267F04, -0x422B6EF6, 0x7F046DF6, 0x6EF64F26, 0x6DF6000B, -0x001C581C, 0xA000A000, 0x001D0100, 0x001D4000, -0x00040021, 0x001C589C, 0x001E1021, 0x00201A90, -0x00201AB2, 0x00202114, 0x00201ACA, 0x00201AD8, -0x002039C8, 0x001E100B, 0x001E1028, 0x00201B44, -0x00201B50, 0x00201AE0, 0x00201AFE, 0x12345678, -0x001E1000, 0x0010F100, 0x00201B2C, 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, -0x002039C2, 0x002039C4, 0x002039C6, 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, -0x0020390D, 0x0020390C, 0x0020390E, 0x00203534, -0x7FFC4F22, 0xE680D19F, 0x666C6212, 0xD29E2F22, -0x67F36563, 0x420B7542, 0x7F04E404, 0x000B4F26, -0xE6800009, 0xD298666C, 0xE7006563, 0x422B7540, -0xE6806473, 0xD294666C, 0xE7006563, 0x422B7543, -0x2F866473, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, -0x7FCC4F22, 0xDC8ED28D, 0x72011F21, 0xDB8D1F22, -0xD18EDE8D, 0x66125211, 0x8B013620, 0x0009A0E5, -0xC9036061, 0x8B018801, 0x0009A0DF, 0xD288D487, -0xED84420B, 0x2F025503, 0x30D0845C, 0xA0B88901, -0xD1840009, 0x626C6610, 0x88016023, 0xD1828B68, -0x62101FC3, 0x895B2228, 0xE003D480, 0x40186742, -0x68421772, 0xD57EE900, 0x81816DB3, 0x7D042190, -0x67D26AB2, 0x64E26852, 0x1F491F57, 0x740464E3, -0x1FA46542, 0x65431F5A, 0x625275F8, 0x1F761FD5, -0x6D531F2B, 0xDA74D773, 0x7D94D274, 0x68D21F88, -0x6AA26972, 0xD1726022, 0x2202CB20, 0xE1401F1C, -0x7601E600, 0x3213626D, 0x56F48BFB, 0x52F651F5, -0x21222B62, 0x52F851F7, 0x212256F9, 0x2E6251FA, -0x51FB2412, 0x2D822512, 0xD9662792, 0x29A2DD5F, -0x6AD2D965, 0xD9646892, 0x68D21A84, 0x6081DA63, -0x2801CB01, 0xD86266D2, 0x2A622962, 0xED015AFC, -0x2AD2480B, 0x2AD24D18, 0x62D2DD5E, 0x2D227201, -0xD15056F3, 0xE2026062, 0x2602CB01, 0x2120A03D, -0x8B3A2228, 0xE401DD58, 0x2140E600, 0xE01C2D62, -0xC801005C, 0xD4558B0A, 0xE600D755, 0xED7D2472, -0x626C7601, 0x8BFB32D3, 0x24D2DD52, 0xE2FE68C2, -0x2C822829, 0x095CE01E, 0xE01F5DF1, 0x0A5C2D90, -0x751051F2, 0xED0621A0, 0xD74BE600, 0x8456D44B, -0x27007601, 0x696C6854, 0x248039D3, 0x8FF67401, -0xDA477701, 0x2A10E194, 0xE2007A01, 0x7A0F2A20, -0xD130E805, 0x66102A80, 0x6023626C, 0x89088801, -0xD240D42A, 0x420B65F2, 0xD131ED01, 0xAF304D18, -0x65F221D2, 0x8553D43C, 0x620D6642, 0x89073262, -0xD13BD43A, 0x0009410B, 0xE601D73A, 0x2762AF1A, -0xD134D41E, 0x410B65F2, 0xD125ED01, 0xD637D436, -0x460B4D18, 0xAF0D21D2, 0x7F340009, 0x6EF64F26, -0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x4F2268F6, -0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1, -0x81F2D209, 0x67F38542, 0x854381F3, 0x81F4E40C, -0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26, -0x00000009, 0x001C3D9C, 0x0020245C, 0x0011779A, -0x001C36F8, 0x001C3B9C, 0x001C3704, 0x0020352C, -0x002014A0, 0x0020391D, 0x0020391C, 0x00203918, -0x001C3D98, 0x001C3BB4, 0x001C5960, 0x001C3500, -0x001C3D30, 0x001C8960, 0x00203504, 0x001C3D00, -0x0020160C, 0x00117730, 0x00203920, 0x001C582C, -0x2000A000, 0x0000A000, 0x0011778C, 0x00117792, -0x00117788, 0x002014CC, 0x002038F4, 0x002034F4, -0x00201530, 0x001E2130, 0x00203D84, 0x002018A2, -0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, -0xD19B7FEC, 0x2F12E000, 0x6103D49A, 0x1F4281F2, -0xDD9ADA99, 0xD69A6813, 0xE0014808, 0x460BDE99, -0x38EC4800, 0x65A21F03, 0x352052A1, 0xA23E8B01, -0x60510009, 0x8801C903, 0xA2388B01, 0x52530009, -0x32E0DE91, 0xD9918B10, 0x64A3490B, 0x4B0BDB90, -0xDE906403, 0xD791D690, 0xEC01D591, 0x2E02E100, -0x271026C0, 0x2502AFDF, 0xC8018551, 0xA1578B01, -0x62510009, 0x4200622D, 0x5E53366A, 0x85E2226D, -0xC903642C, 0x85E36603, 0x6053650D, 0x40214021, -0x4500C93F, 0x322A6703, 0x6053252D, 0xC901D17F, -0x60106C03, 0x8801D97F, 0xDB7F8B05, 0x2120E200, -0xCB0160B2, 0xD17D2B02, 0x88016011, 0x65A28B0A, -0x8D042448, 0x9B9E6251, 0xA00322B9, 0x919B2521, -0x2521221B, 0x37B3EB10, 0x2448895E, 0xD4738B07, -0x22286241, 0x60638903, 0xA05781F8, 0xD5706473, -0x46084608, 0x85E26273, 0x46006B50, 0x362C4200, -0x2BB8C910, 0x8F1F6463, 0x26686603, 0xD2698911, -0x062D6043, 0x4119616D, 0x6B0E6019, 0x81F820BD, -0x880160C3, 0x646C8F2C, 0x880F6073, 0xA0278B1B, -0xD2610009, 0x052D6043, 0x4119615D, 0x670E6019, -0x645C207D, 0x81F8A01C, 0x890F2668, 0x6043D25B, -0x6B5D052D, 0x60B94B19, 0x201D610E, 0x60C381F8, -0x8F0D8801, 0x6473645C, 0xEC00A00A, 0x6043D254, -0x625D052D, 0x60294219, 0x207D670E, 0x81F8645C, -0x880285F8, 0x85E1890A, 0x8D07C820, 0xE6DC6203, -0x60232269, 0x81E1A002, 0x644CE4FF, 0x6210D149, -0x89012228, 0x644CE4FF, 0x654DEBFF, 0x35B06BBC, -0xDB368B2B, 0x64A34B0B, 0x410BD135, 0x54036403, -0x85446E03, 0xC948DB40, 0xDC408808, 0xBEAE8B01, -0x64B3E502, 0x65E34C0B, 0xDB3DEC01, 0xD13D2DC2, -0x621260B2, 0x72017001, 0x21228805, 0x2B028F08, -0x666CE680, 0x6563D238, 0x7549E700, 0x6473420B, -0xA030D436, 0x7FFF0009, 0x85E28000, 0x20B9EBFC, -0x610381E2, 0x942A85E3, 0x62032049, 0x450885F8, -0x81E2201B, 0xC90160C3, 0x40084018, 0x40084008, -0x4000225B, 0x6023220B, 0x85E481E3, 0x4118E108, -0x81E4201B, 0xE40262A2, 0x20B98521, 0x67A28121, -0xCB016071, 0x85F82701, 0x89033042, 0xECE785E2, -0x81E220C9, 0x490BD41E, 0xA03B0009, 0x7E030009, -0x001C3D30, 0x00203D90, 0x00203504, 0x001E212C, -0x002033E8, 0x001C3D00, 0x00117780, 0x002014A0, -0x0020166C, 0x0011770C, 0x0020391C, 0x0020391D, -0x00203918, 0x002018A2, 0x001C36F8, 0x00203990, -0x00203DA0, 0x00203B84, 0x00203C04, 0x00203C84, -0x00203D04, 0x00203908, 0x002034FC, 0x002014CC, -0x00203994, 0x00203998, 0x0020245C, 0x00203D88, -0x00203D8C, 0x602262F2, 0x40094019, 0xC90F4009, -0x8B0B880A, 0x60E2DE8C, 0x40094019, 0xC90F4009, -0x8B038808, 0xCB0160A2, 0x2802A006, 0x65E2DE87, -0x2E527501, 0x286266A2, 0x52F366F2, 0x2622AE83, -0xD2838551, 0xDE83C802, 0xA0958B01, 0x420B0009, -0x4E0B64A3, 0x5E036403, 0x85E46503, 0x4918E908, -0xD77D209B, 0xE04C81E4, 0xDC7C0B7E, 0x7B01D97C, -0x61C207B6, 0x71016690, 0x8D062668, 0xD4792C12, -0x420BD279, 0xA070EB01, 0x62512DB2, 0x4B18EB0F, -0x22B9E102, 0x32104118, 0x85518B0F, 0x2029E2FC, -0x60518151, 0xCB0172E0, 0x85E12501, 0x202994A3, -0x85E481E1, 0xA0522049, 0x675181E4, 0x4719677D, -0x667E6779, 0x7701276D, 0x6903607C, 0x88014918, -0x25918F3E, 0x6B12D161, 0x21B27B01, 0x660D85E3, -0x40216063, 0xC93F4021, 0x6C034600, 0x262D322A, -0xC8016063, 0xDB5ED15D, 0x967D8901, 0xE6002C6B, -0x666C67CD, 0x40006063, 0x622D021D, 0x8D0E3270, -0x60436403, 0xE9FF021D, 0x8B013290, 0x01C5A007, -0x626C7601, 0x3292E904, 0x646C8BEB, 0x60434400, -0xD15004BD, 0x0B457401, 0x669D6911, 0x89073670, -0x602D6211, 0x890388FF, 0xE201DB4B, 0x2B2021C1, -0xECFC8551, 0x815120C9, 0xCB016051, 0xDC472501, -0x64A34C0B, 0x51F366F2, 0x85EF2612, 0x54F2D244, -0x650D420B, 0x0009ADE7, 0xE500DC42, 0x420B2C52, -0x4E0B64A3, 0x54036403, 0x85446E03, 0x6703E908, -0x65034918, 0x27998541, 0xDB323790, 0x8F0BD932, -0x6013610D, 0x8B07C820, 0xC9486053, 0x8B038808, -0xE501BD4D, 0x0009A005, 0x2128D233, 0xBD468901, -0x64B3E500, 0x490B65E3, 0xADBCEC01, 0x85F22DC2, -0x7001EE04, 0x31E7610D, 0x8D0281F2, 0xADA97A08, -0x7F140009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, -0x000B69F6, 0xF7FF68F6, 0x2FE68000, 0xD2234F22, -0x60E36E22, 0x8D02C840, 0xBBF922E2, 0xE2400009, -0x2E284218, 0xBC048901, 0x60E30009, 0x8905C810, -0xD21CD41B, 0x0009420B, 0x0009BC03, 0xC80560E3, -0xBD6D8901, 0x60E30009, 0x8902C802, 0xAC004F26, -0x4F266EF6, 0x6EF6000B, 0x001C3D3C, 0x00117760, -0x002014A0, 0x0020166C, 0x00203494, 0x00203DA4, -0x00203908, 0x002034FC, 0x002014CC, 0x00203974, -0x0020397C, 0x00203970, 0x00203972, 0x00201530, -0x002018EE, 0x00203994, 0x00008000, 0x001C3510, -0x00203D98, 0x002018A2, 0x080A0C0E, 0x00020406, -0x1A1C1E20, 0x12141618, 0x2E303234, 0x26282A2C, -0x3A3C3E40, 0x6C625648, 0x41112F26, 0xE2208F18, -0x890B3123, 0x321CD204, 0xD1026220, 0x412B312C, -0x00090009, 0x00203412, 0x002033C8, 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, 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, 0x32203120, 0x20383030, 0x323A3132, -0x34333A38, 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, 0x435F4D5A, 0x465F444D, -0x4C445F57, 0x494E495F, 0x00000054, 0x6E6B6E55, -0x206E776F, 0x6D6D6F63, 0x3D646E61, 0x00000000, -0x203A3051, 0x00000020, 0x203A3151, 0x00000020, -0x203A3251, 0x00000020, 0x203A3351, 0x00000020, -0x203A3451, 0x00000020, 0x2B434741, 0x73696F4E, -0x61432065, 0x7262696C, 0x6F697461, 0x6166206E, -0x6F206C69, 0x6974206E, 0x0D0A656D, 0x00000000, -0x00000072, 0x00205220, 0x00000D0A, 0x62735576, -0x7473725F, 0x00000A0D, 0x62735576, 0x7375735F, -0x646E6570, 0x00000A0D, 0x62735576, 0x7365725F, -0x000A0D6D, 0x00000044, 0x44387570, 0x72637365, -0x6F747069, 0x3D584572, 0x00000000, 0x00000047, -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, 0x020C020B, -0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x000000FF, 0x00020001, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF, -0x00FF00FF, 0x010E010D, 0x00020003, 0x01090108, -0x0002010A, 0x00030003, 0x02020201, 0x02040203, -0x02060205, 0x02020200, 0x02040203, 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, 0x0200010F, 0x02020201, 0x02040203, -0x02060205, 0x02020200, 0x02040203, 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, 0x010F010F, 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, -0x40030405, 0x02090100, 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=15936; diff --git a/drivers/staging/otus/hal/hpfwuinit.c b/drivers/staging/otus/hal/hpfwuinit.c deleted file mode 100644 index 5d0dccca080c..000000000000 --- a/drivers/staging/otus/hal/hpfwuinit.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * 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; diff --git a/drivers/staging/otus/hal/hpmain.c b/drivers/staging/otus/hal/hpmain.c deleted file mode 100644 index 6d2d358d5ca9..000000000000 --- a/drivers/staging/otus/hal/hpmain.c +++ /dev/null @@ -1,4672 +0,0 @@ -/* - * 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" -#include "otus.ini" - -extern const u32_t zcFwImage[]; -extern const u32_t zcFwImageSize; -extern const u32_t zcDKFwImage[]; -extern const u32_t zcDKFwImageSize; -extern const u32_t zcFwImageSPI[]; -extern const u32_t zcFwImageSPISize; - -#ifdef ZM_OTUS_LINUX_PHASE_2 -extern const u32_t zcFwBufImage[]; -extern const u32_t zcFwBufImageSize; -extern const u32_t zcP2FwImage[]; -extern const u32_t zcP2FwImageSize; -#endif -extern void zfInitCmdQueue(zdev_t* dev); -extern u16_t zfIssueCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen, - u16_t src, u8_t* buf); -extern void zfIdlRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen); -extern u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val); -extern u16_t zfFlushDelayWrite(zdev_t* dev); -extern void zfUsbInit(zdev_t* dev); -extern u16_t zfFirmwareDownload(zdev_t* dev, u32_t* fw, u32_t len, u32_t offset); -extern u16_t zfFirmwareDownloadNotJump(zdev_t* dev, u32_t* fw, u32_t len, u32_t offset); -extern void zfUsbFree(zdev_t* dev); -extern u16_t zfCwmIsExtChanBusy(u32_t ctlBusy, u32_t extBusy); -extern void zfCoreCwmBusy(zdev_t* dev, u16_t busy); - -/* Prototypes */ -void zfInitRf(zdev_t* dev, u32_t frequency); -void zfInitPhy(zdev_t* dev, u32_t frequency, u8_t bw40); -void zfInitMac(zdev_t* dev); - -void zfSetPowerCalTable(zdev_t* dev, u32_t frequency, u8_t bw40, u8_t extOffset); -void zfInitPowerCal(zdev_t* dev); - -#ifdef ZM_DRV_INIT_USB_MODE -void zfInitUsbMode(zdev_t* dev); -u16_t zfHpUsbReset(zdev_t* dev); -#endif - -/* Bank 0 1 2 3 5 6 7 */ -void zfSetRfRegs(zdev_t* dev, u32_t frequency); -/* Bank 4 */ -void zfSetBank4AndPowerTable(zdev_t* dev, u32_t frequency, u8_t bw40, - u8_t extOffset); -/* Get param for turnoffdyn */ -void zfGetHwTurnOffdynParam(zdev_t* dev, - u32_t frequency, u8_t bw40, u8_t extOffset, - int* delta_slope_coeff_exp, - int* delta_slope_coeff_man, - int* delta_slope_coeff_exp_shgi, - int* delta_slope_coeff_man_shgi); - -void zfSelAdcClk(zdev_t* dev, u8_t bw40, u32_t frequency); -u32_t zfHpEchoCommand(zdev_t* dev, u32_t value); - - - -#define zm_hp_priv(x) (((struct zsHpPriv*)wd->hpPrivate)->x) -static struct zsHpPriv zgHpPriv; - -#define ZM_FIRMWARE_WLAN_ADDR 0x200000 -#define ZM_FIRMWARE_SPI_ADDR 0x114000 -/* 0: real chip 1: FPGA test */ -#define ZM_FPGA_PHY 0 - -#define reg_write(addr, val) zfDelayWriteInternalReg(dev, addr+0x1bc000, val) -#define zm_min(A, B) ((A>B)? B:A) - - -/******************** Intialization ********************/ -u16_t zfHpInit(zdev_t* dev, u32_t frequency) -{ - u16_t ret; - zmw_get_wlan_dev(dev); - - /* Initializa HAL Plus private variables */ - wd->hpPrivate = &zgHpPriv; - - ((struct zsHpPriv*)wd->hpPrivate)->halCapability = ZM_HP_CAP_11N; - - ((struct zsHpPriv*)wd->hpPrivate)->hwFrequency = 0; - ((struct zsHpPriv*)wd->hpPrivate)->hwBw40 = 0; - ((struct zsHpPriv*)wd->hpPrivate)->hwExtOffset = 0; - - ((struct zsHpPriv*)wd->hpPrivate)->disableDfsCh = 0; - - ((struct zsHpPriv*)wd->hpPrivate)->ledMode[0] = 1; - ((struct zsHpPriv*)wd->hpPrivate)->ledMode[1] = 1; - ((struct zsHpPriv*)wd->hpPrivate)->strongRSSI = 0; - ((struct zsHpPriv*)wd->hpPrivate)->rxStrongRSSI = 0; - - ((struct zsHpPriv*)wd->hpPrivate)->slotType = 1; - ((struct zsHpPriv*)wd->hpPrivate)->aggPktNum = 0x10000a; - - ((struct zsHpPriv*)wd->hpPrivate)->eepromImageIndex = 0; - - - ((struct zsHpPriv*)wd->hpPrivate)->eepromImageRdReq = 0; -#ifdef ZM_OTUS_RX_STREAM_MODE - ((struct zsHpPriv*)wd->hpPrivate)->remainBuf = NULL; - ((struct zsHpPriv*)wd->hpPrivate)->usbRxRemainLen = 0; - ((struct zsHpPriv*)wd->hpPrivate)->usbRxPktLen = 0; - ((struct zsHpPriv*)wd->hpPrivate)->usbRxPadLen = 0; - ((struct zsHpPriv*)wd->hpPrivate)->usbRxTransferLen = 0; -#endif - - ((struct zsHpPriv*)wd->hpPrivate)->enableBBHeavyClip = 1; - ((struct zsHpPriv*)wd->hpPrivate)->hwBBHeavyClip = 1; // force enable 8107 - ((struct zsHpPriv*)wd->hpPrivate)->doBBHeavyClip = 0; - ((struct zsHpPriv*)wd->hpPrivate)->setValueHeavyClip = 0; - - - /* Initialize driver core */ - zfInitCmdQueue(dev); - - /* Initialize USB */ - zfUsbInit(dev); - -#if ZM_SW_LOOP_BACK != 1 - - /* TODO : [Download FW] */ - if (wd->modeMDKEnable) - { - /* download the MDK firmware */ - ret = zfFirmwareDownload(dev, (u32_t*)zcDKFwImage, - (u32_t)zcDKFwImageSize, ZM_FIRMWARE_WLAN_ADDR); - if (ret != ZM_SUCCESS) - { - /* TODO : exception handling */ - //return 1; - } - } - else - { - #ifndef ZM_OTUS_LINUX_PHASE_2 - /* download the normal firmware */ - ret = zfFirmwareDownload(dev, (u32_t*)zcFwImage, - (u32_t)zcFwImageSize, ZM_FIRMWARE_WLAN_ADDR); - if (ret != ZM_SUCCESS) - { - /* TODO : exception handling */ - //return 1; - } - #else - - // 1-PH fw: ReadMac() store some global variable - ret = zfFirmwareDownloadNotJump(dev, (u32_t*)zcFwBufImage, - (u32_t)zcFwBufImageSize, 0x102800); - if (ret != ZM_SUCCESS) - { - DbgPrint("Dl zcFwBufImage failed!"); - } - - zfwSleep(dev, 1000); - - ret = zfFirmwareDownload(dev, (u32_t*)zcFwImage, - (u32_t)zcFwImageSize, ZM_FIRMWARE_WLAN_ADDR); - if (ret != ZM_SUCCESS) - { - DbgPrint("Dl zcFwBufImage failed!"); - } - #endif - } -#endif - -#ifdef ZM_DRV_INIT_USB_MODE - /* Init USB Mode */ - zfInitUsbMode(dev); - - /* Do the USB Reset */ - zfHpUsbReset(dev); -#endif - -/* Register setting */ -/* ZM_DRIVER_MODEL_TYPE_MDK - * 1=>for MDK, disable init RF, PHY, and MAC, - * 0=>normal init - */ -//#if ((ZM_SW_LOOP_BACK != 1) && (ZM_DRIVER_MODEL_TYPE_MDK !=1)) -#if ZM_SW_LOOP_BACK != 1 - if(!wd->modeMDKEnable) - { - /* Init MAC */ - zfInitMac(dev); - - #if ZM_FW_LOOP_BACK != 1 - /* Init PHY */ - zfInitPhy(dev, frequency, 0); - - /* Init RF */ - zfInitRf(dev, frequency); - - #if ZM_FPGA_PHY == 0 - /* BringUp issue */ - //zfDelayWriteInternalReg(dev, 0x9800+0x1bc000, 0x10000007); - //zfFlushDelayWrite(dev); - #endif - - #endif /* end of ZM_FW_LOOP_BACK != 1 */ - } -#endif /* end of ((ZM_SW_LOOP_BACK != 1) && (ZM_DRIVER_MODEL_TYPE_MDK !=1)) */ - - zfHpEchoCommand(dev, 0xAABBCCDD); - - return 0; -} - - -u16_t zfHpReinit(zdev_t* dev, u32_t frequency) -{ - u16_t ret; - zmw_get_wlan_dev(dev); - - ((struct zsHpPriv*)wd->hpPrivate)->halReInit = 1; - - ((struct zsHpPriv*)wd->hpPrivate)->strongRSSI = 0; - ((struct zsHpPriv*)wd->hpPrivate)->rxStrongRSSI = 0; - -#ifdef ZM_OTUS_RX_STREAM_MODE - if (((struct zsHpPriv*)wd->hpPrivate)->remainBuf != NULL) - { - zfwBufFree(dev, ((struct zsHpPriv*)wd->hpPrivate)->remainBuf, 0); - } - ((struct zsHpPriv*)wd->hpPrivate)->remainBuf = NULL; - ((struct zsHpPriv*)wd->hpPrivate)->usbRxRemainLen = 0; - ((struct zsHpPriv*)wd->hpPrivate)->usbRxPktLen = 0; - ((struct zsHpPriv*)wd->hpPrivate)->usbRxPadLen = 0; - ((struct zsHpPriv*)wd->hpPrivate)->usbRxTransferLen = 0; -#endif - - zfInitCmdQueue(dev); - zfCoreReinit(dev); - - #ifndef ZM_OTUS_LINUX_PHASE_2 - /* Download firmware */ - ret = zfFirmwareDownload(dev, (u32_t*)zcFwImage, - (u32_t)zcFwImageSize, ZM_FIRMWARE_WLAN_ADDR); - if (ret != ZM_SUCCESS) - { - /* TODO : exception handling */ - //return 1; - } - #else - ret = zfFirmwareDownload(dev, (u32_t*)zcP2FwImage, - (u32_t)zcP2FwImageSize, ZM_FIRMWARE_WLAN_ADDR); - if (ret != ZM_SUCCESS) - { - /* TODO : exception handling */ - //return 1; - } - #endif - -#ifdef ZM_DRV_INIT_USB_MODE - /* Init USB Mode */ - zfInitUsbMode(dev); - - /* Do the USB Reset */ - zfHpUsbReset(dev); -#endif - - /* Init MAC */ - zfInitMac(dev); - - /* Init PHY */ - zfInitPhy(dev, frequency, 0); - /* Init RF */ - zfInitRf(dev, frequency); - - #if ZM_FPGA_PHY == 0 - /* BringUp issue */ - //zfDelayWriteInternalReg(dev, 0x9800+0x1bc000, 0x10000007); - //zfFlushDelayWrite(dev); - #endif - - zfHpEchoCommand(dev, 0xAABBCCDD); - - return 0; -} - - -u16_t zfHpRelease(zdev_t* dev) -{ - /* Free USB resource */ - zfUsbFree(dev); - - return 0; -} - -/* MDK mode setting for dontRetransmit */ -void zfHpConfigFM(zdev_t* dev, u32_t RxMaxSize, u32_t DontRetransmit) -{ - u32_t cmd[3]; - u16_t ret; - - cmd[0] = 8 | (ZM_CMD_CONFIG << 8); - cmd[1] = RxMaxSize; /* zgRxMaxSize */ - cmd[2] = DontRetransmit; /* zgDontRetransmit */ - - ret = zfIssueCmd(dev, cmd, 12, ZM_OID_INTERNAL_WRITE, 0); -} - -const u8_t zcXpdToPd[16] = -{ - /* 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF */ - 0x2, 0x2, 0x2, 0x1, 0x2, 0x2, 0x6, 0x2, 0x2, 0x3, 0x7, 0x2, 0xB, 0x2, 0x2, 0x2 -}; - -/******************** RF and PHY ********************/ - -void zfInitPhy(zdev_t* dev, u32_t frequency, u8_t bw40) -{ - u16_t i, j, k; - u16_t entries; - u16_t modesIndex = 0; - u16_t freqIndex = 0; - u32_t tmp, tmp1; - struct zsHpPriv* hpPriv; - - u32_t eepromBoardData[15][6] = { - /* Register A-20 A-20/40 G-20/40 G-20 G-Turbo */ - {0x9964, 0, 0, 0, 0, 0}, - {0x9960, 0, 0, 0, 0, 0}, - {0xb960, 0, 0, 0, 0, 0}, - {0x9844, 0, 0, 0, 0, 0}, - {0x9850, 0, 0, 0, 0, 0}, - {0x9834, 0, 0, 0, 0, 0}, - {0x9828, 0, 0, 0, 0, 0}, - {0xc864, 0, 0, 0, 0, 0}, - {0x9848, 0, 0, 0, 0, 0}, - {0xb848, 0, 0, 0, 0, 0}, - {0xa20c, 0, 0, 0, 0, 0}, - {0xc20c, 0, 0, 0, 0, 0}, - {0x9920, 0, 0, 0, 0, 0}, - {0xb920, 0, 0, 0, 0, 0}, - {0xa258, 0, 0, 0, 0, 0}, - }; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - /* #1 Save the initial value of the related RIFS register settings */ - //((struct zsHpPriv*)wd->hpPrivate)->isInitialPhy++; - - /* - * Setup the indices for the next set of register array writes - * PHY mode is static20 / 2040 - * Frequency is 2.4GHz (B) / 5GHz (A) - */ - if ( frequency > ZM_CH_G_14 ) - { - /* 5GHz */ - freqIndex = 1; - if (bw40) - { - modesIndex = 2; - zm_debug_msg0("init ar5416Modes in 2: A-20/40"); - } - else - { - modesIndex = 1; - zm_debug_msg0("init ar5416Modes in 1: A-20"); - } - } - else - { - /* 2.4GHz */ - freqIndex = 2; - if (bw40) - { - modesIndex = 3; - zm_debug_msg0("init ar5416Modes in 3: G-20/40"); - } - else - { - modesIndex = 4; - zm_debug_msg0("init ar5416Modes in 4: G-20"); - } - } - - -#if ZM_FPGA_PHY == 1 - /* Starting External Hainan Register Initialization */ - /* TODO: */ - - zfwSleep(dev, 10); -#endif - - /* - *Set correct Baseband to analog shift setting to access analog chips. - */ - //reg_write(PHY_BASE, 0x00000007); -// reg_write(0x9800, 0x00000007); - - /* - * Write addac shifts - */ - // do this in firmware - - - - /* Zeroize board data */ - for (j=0; j<15; j++) - { - for (k=1; k<=4; k++) - { - eepromBoardData[j][k] = 0; - } - } - /* - * Register setting by mode - */ - - entries = ARRAY_SIZE(ar5416Modes); - zm_msg1_scan(ZM_LV_2, "Modes register setting entries=", entries); - for (i=0; ihpPrivate)->hwNotFirstInit && (ar5416Modes[i][0] == 0xa27c) ) - { - /* Force disable CR671 bit20 / 7823 */ - /* The bug has to do with the polarity of the pdadc offset calibration. There */ - /* is an initial calibration that is OK, and there is a continuous */ - /* calibration that updates the pddac with the wrong polarity. Fortunately */ - /* the second loop can be disabled with a bit called en_pd_dc_offset_thr. */ - - reg_write(ar5416Modes[i][0], (ar5416Modes[i][modesIndex]& 0xffefffff) ); - ((struct zsHpPriv*)wd->hpPrivate)->hwNotFirstInit = 1; - } - else - { -#endif - /* FirstTime Init or not 0xa27c(CR671) */ - reg_write(ar5416Modes[i][0], ar5416Modes[i][modesIndex]); -// } - /* Initialize board data */ - for (j=0; j<15; j++) - { - if (ar5416Modes[i][0] == eepromBoardData[j][0]) - { - for (k=1; k<=4; k++) - { - eepromBoardData[j][k] = ar5416Modes[i][k]; - } - } - } - /* #1 Save the initial value of the related RIFS register settings */ - //if( ((struct zsHpPriv*)wd->hpPrivate)->isInitialPhy == 1 ) - { - switch(ar5416Modes[i][0]) - { - case 0x9850 : - ((struct zsHpPriv*)wd->hpPrivate)->initDesiredSigSize = ar5416Modes[i][modesIndex]; - break; - case 0x985c : - ((struct zsHpPriv*)wd->hpPrivate)->initAGC = ar5416Modes[i][modesIndex]; - break; - case 0x9860 : - ((struct zsHpPriv*)wd->hpPrivate)->initAgcControl = ar5416Modes[i][modesIndex]; - break; - case 0x9918 : - ((struct zsHpPriv*)wd->hpPrivate)->initSearchStartDelay = ar5416Modes[i][modesIndex]; - break; - case 0x99ec : - ((struct zsHpPriv*)wd->hpPrivate)->initRIFSSearchParams = ar5416Modes[i][modesIndex]; - break; - case 0xa388 : - ((struct zsHpPriv*)wd->hpPrivate)->initFastChannelChangeControl = ar5416Modes[i][modesIndex]; - default : - break; - } - } - } -#if 0 - zfFlushDelayWrite(dev); - - /* - * Common Register setting - */ - entries = ARRAY_SIZE(ar5416Common); - for (i=0; ieepromImage[0x100+0x144*2/4]; - eepromBoardData[0][1] = tmp; - eepromBoardData[0][2] = tmp; - //Ant control chain 0 - tmp = hpPriv->eepromImage[0x100+0x140*2/4]; - eepromBoardData[1][1] = tmp; - eepromBoardData[1][2] = tmp; - //Ant control chain 2 - tmp = hpPriv->eepromImage[0x100+0x142*2/4]; - eepromBoardData[2][1] = tmp; - eepromBoardData[2][2] = tmp; - //SwSettle - tmp = hpPriv->eepromImage[0x100+0x146*2/4]; - tmp = (tmp >> 16) & 0x7f; - eepromBoardData[3][1] &= (~((u32_t)0x3f80)); - eepromBoardData[3][1] |= (tmp << 7); -#if 0 - //swSettleHt40 - tmp = hpPriv->eepromImage[0x100+0x158*2/4]; - tmp = (tmp) & 0x7f; - eepromBoardData[3][2] &= (~((u32_t)0x3f80)); - eepromBoardData[3][2] |= (tmp << 7); -#endif - //adcDesired, pdaDesired - tmp = hpPriv->eepromImage[0x100+0x148*2/4]; - tmp = (tmp >> 24); - tmp1 = hpPriv->eepromImage[0x100+0x14a*2/4]; - tmp1 = tmp1 & 0xff; - tmp = tmp + (tmp1<<8); - eepromBoardData[4][1] &= (~((u32_t)0xffff)); - eepromBoardData[4][1] |= tmp; - eepromBoardData[4][2] &= (~((u32_t)0xffff)); - eepromBoardData[4][2] |= tmp; - //TxEndToXpaOff, TxFrameToXpaOn - tmp = hpPriv->eepromImage[0x100+0x14a*2/4]; - tmp = (tmp >> 24) & 0xff; - tmp1 = hpPriv->eepromImage[0x100+0x14c*2/4]; - tmp1 = (tmp1 >> 8) & 0xff; - tmp = (tmp<<24) + (tmp<<16) + (tmp1<<8) + tmp1; - eepromBoardData[5][1] = tmp; - eepromBoardData[5][2] = tmp; - //TxEnaToRxOm - tmp = hpPriv->eepromImage[0x100+0x14c*2/4] & 0xff; - eepromBoardData[6][1] &= (~((u32_t)0xff0000)); - eepromBoardData[6][1] |= (tmp<<16); - eepromBoardData[6][2] &= (~((u32_t)0xff0000)); - eepromBoardData[6][2] |= (tmp<<16); - //Thresh62 - tmp = hpPriv->eepromImage[0x100+0x14c*2/4]; - tmp = (tmp >> 16) & 0x7f; - eepromBoardData[7][1] &= (~((u32_t)0x7f000)); - eepromBoardData[7][1] |= (tmp<<12); - eepromBoardData[7][2] &= (~((u32_t)0x7f000)); - eepromBoardData[7][2] |= (tmp<<12); - //TxRxAtten chain_0 - tmp = hpPriv->eepromImage[0x100+0x146*2/4]; - tmp = (tmp >> 24) & 0x3f; - eepromBoardData[8][1] &= (~((u32_t)0x3f000)); - eepromBoardData[8][1] |= (tmp<<12); - eepromBoardData[8][2] &= (~((u32_t)0x3f000)); - eepromBoardData[8][2] |= (tmp<<12); - //TxRxAtten chain_2 - tmp = hpPriv->eepromImage[0x100+0x148*2/4] & 0x3f; - eepromBoardData[9][1] &= (~((u32_t)0x3f000)); - eepromBoardData[9][1] |= (tmp<<12); - eepromBoardData[9][2] &= (~((u32_t)0x3f000)); - eepromBoardData[9][2] |= (tmp<<12); - //TxRxMargin chain_0 - tmp = hpPriv->eepromImage[0x100+0x148*2/4]; - tmp = (tmp >> 8) & 0x3f; - eepromBoardData[10][1] &= (~((u32_t)0xfc0000)); - eepromBoardData[10][1] |= (tmp<<18); - eepromBoardData[10][2] &= (~((u32_t)0xfc0000)); - eepromBoardData[10][2] |= (tmp<<18); - //TxRxMargin chain_2 - tmp = hpPriv->eepromImage[0x100+0x148*2/4]; - tmp = (tmp >> 16) & 0x3f; - eepromBoardData[11][1] &= (~((u32_t)0xfc0000)); - eepromBoardData[11][1] |= (tmp<<18); - eepromBoardData[11][2] &= (~((u32_t)0xfc0000)); - eepromBoardData[11][2] |= (tmp<<18); - //iqCall chain_0, iqCallQ chain_0 - tmp = hpPriv->eepromImage[0x100+0x14e*2/4]; - tmp = (tmp >> 24) & 0x3f; - tmp1 = hpPriv->eepromImage[0x100+0x150*2/4]; - tmp1 = (tmp1 >> 8) & 0x1f; - tmp = (tmp<<5) + tmp1; - eepromBoardData[12][1] &= (~((u32_t)0x7ff)); - eepromBoardData[12][1] |= (tmp); - eepromBoardData[12][2] &= (~((u32_t)0x7ff)); - eepromBoardData[12][2] |= (tmp); - //iqCall chain_2, iqCallQ chain_2 - tmp = hpPriv->eepromImage[0x100+0x150*2/4]; - tmp = tmp & 0x3f; - tmp1 = hpPriv->eepromImage[0x100+0x150*2/4]; - tmp1 = (tmp1 >> 16) & 0x1f; - tmp = (tmp<<5) + tmp1; - eepromBoardData[13][1] &= (~((u32_t)0x7ff)); - eepromBoardData[13][1] |= (tmp); - eepromBoardData[13][2] &= (~((u32_t)0x7ff)); - eepromBoardData[13][2] |= (tmp); - //bsw_Margin chain_0 - tmp = hpPriv->eepromImage[0x100+0x156*2/4]; - tmp = (tmp >> 16) & 0xf; - eepromBoardData[10][1] &= (~((u32_t)0x3c00)); - eepromBoardData[10][1] |= (tmp << 10); - eepromBoardData[10][2] &= (~((u32_t)0x3c00)); - eepromBoardData[10][2] |= (tmp << 10); - //xpd gain mask - tmp = hpPriv->eepromImage[0x100+0x14e*2/4]; - tmp = (tmp >> 8) & 0xf; - eepromBoardData[14][1] &= (~((u32_t)0xf0000)); - eepromBoardData[14][1] |= (zcXpdToPd[tmp] << 16); - eepromBoardData[14][2] &= (~((u32_t)0xf0000)); - eepromBoardData[14][2] |= (zcXpdToPd[tmp] << 16); -#if 0 - //bsw_Atten chain_0 - tmp = hpPriv->eepromImage[0x100+0x156*2/4]; - tmp = (tmp) & 0x1f; - eepromBoardData[10][1] &= (~((u32_t)0x1f)); - eepromBoardData[10][1] |= (tmp); - eepromBoardData[10][2] &= (~((u32_t)0x1f)); - eepromBoardData[10][2] |= (tmp); - //bsw_Margin chain_2 - tmp = hpPriv->eepromImage[0x100+0x156*2/4]; - tmp = (tmp >> 24) & 0xf; - eepromBoardData[11][1] &= (~((u32_t)0x3c00)); - eepromBoardData[11][1] |= (tmp << 10); - eepromBoardData[11][2] &= (~((u32_t)0x3c00)); - eepromBoardData[11][2] |= (tmp << 10); - //bsw_Atten chain_2 - tmp = hpPriv->eepromImage[0x100+0x156*2/4]; - tmp = (tmp >> 8) & 0x1f; - eepromBoardData[11][1] &= (~((u32_t)0x1f)); - eepromBoardData[11][1] |= (tmp); - eepromBoardData[11][2] &= (~((u32_t)0x1f)); - eepromBoardData[11][2] |= (tmp); -#endif - - /* Update 2.4G board data */ - //Ant control common - tmp = hpPriv->eepromImage[0x100+0x170*2/4]; - tmp = tmp >> 24; - tmp1 = hpPriv->eepromImage[0x100+0x172*2/4]; - tmp = tmp + (tmp1 << 8); - eepromBoardData[0][3] = tmp; - eepromBoardData[0][4] = tmp; - //Ant control chain 0 - tmp = hpPriv->eepromImage[0x100+0x16c*2/4]; - tmp = tmp >> 24; - tmp1 = hpPriv->eepromImage[0x100+0x16e*2/4]; - tmp = tmp + (tmp1 << 8); - eepromBoardData[1][3] = tmp; - eepromBoardData[1][4] = tmp; - //Ant control chain 2 - tmp = hpPriv->eepromImage[0x100+0x16e*2/4]; - tmp = tmp >> 24; - tmp1 = hpPriv->eepromImage[0x100+0x170*2/4]; - tmp = tmp + (tmp1 << 8); - eepromBoardData[2][3] = tmp; - eepromBoardData[2][4] = tmp; - //SwSettle - tmp = hpPriv->eepromImage[0x100+0x174*2/4]; - tmp = (tmp >> 8) & 0x7f; - eepromBoardData[3][4] &= (~((u32_t)0x3f80)); - eepromBoardData[3][4] |= (tmp << 7); -#if 0 - //swSettleHt40 - tmp = hpPriv->eepromImage[0x100+0x184*2/4]; - tmp = (tmp >> 24) & 0x7f; - eepromBoardData[3][3] &= (~((u32_t)0x3f80)); - eepromBoardData[3][3] |= (tmp << 7); -#endif - //adcDesired, pdaDesired - tmp = hpPriv->eepromImage[0x100+0x176*2/4]; - tmp = (tmp >> 16) & 0xff; - tmp1 = hpPriv->eepromImage[0x100+0x176*2/4]; - tmp1 = tmp1 >> 24; - tmp = tmp + (tmp1<<8); - eepromBoardData[4][3] &= (~((u32_t)0xffff)); - eepromBoardData[4][3] |= tmp; - eepromBoardData[4][4] &= (~((u32_t)0xffff)); - eepromBoardData[4][4] |= tmp; - //TxEndToXpaOff, TxFrameToXpaOn - tmp = hpPriv->eepromImage[0x100+0x178*2/4]; - tmp = (tmp >> 16) & 0xff; - tmp1 = hpPriv->eepromImage[0x100+0x17a*2/4]; - tmp1 = tmp1 & 0xff; - tmp = (tmp << 24) + (tmp << 16) + (tmp1 << 8) + tmp1; - eepromBoardData[5][3] = tmp; - eepromBoardData[5][4] = tmp; - //TxEnaToRxOm - tmp = hpPriv->eepromImage[0x100+0x178*2/4]; - tmp = (tmp >> 24); - eepromBoardData[6][3] &= (~((u32_t)0xff0000)); - eepromBoardData[6][3] |= (tmp<<16); - eepromBoardData[6][4] &= (~((u32_t)0xff0000)); - eepromBoardData[6][4] |= (tmp<<16); - //Thresh62 - tmp = hpPriv->eepromImage[0x100+0x17a*2/4]; - tmp = (tmp >> 8) & 0x7f; - eepromBoardData[7][3] &= (~((u32_t)0x7f000)); - eepromBoardData[7][3] |= (tmp<<12); - eepromBoardData[7][4] &= (~((u32_t)0x7f000)); - eepromBoardData[7][4] |= (tmp<<12); - //TxRxAtten chain_0 - tmp = hpPriv->eepromImage[0x100+0x174*2/4]; - tmp = (tmp >> 16) & 0x3f; - eepromBoardData[8][3] &= (~((u32_t)0x3f000)); - eepromBoardData[8][3] |= (tmp<<12); - eepromBoardData[8][4] &= (~((u32_t)0x3f000)); - eepromBoardData[8][4] |= (tmp<<12); - //TxRxAtten chain_2 - tmp = hpPriv->eepromImage[0x100+0x174*2/4]; - tmp = (tmp >> 24) & 0x3f; - eepromBoardData[9][3] &= (~((u32_t)0x3f000)); - eepromBoardData[9][3] |= (tmp<<12); - eepromBoardData[9][4] &= (~((u32_t)0x3f000)); - eepromBoardData[9][4] |= (tmp<<12); - //TxRxMargin chain_0 - tmp = hpPriv->eepromImage[0x100+0x176*2/4]; - tmp = (tmp) & 0x3f; - eepromBoardData[10][3] &= (~((u32_t)0xfc0000)); - eepromBoardData[10][3] |= (tmp<<18); - eepromBoardData[10][4] &= (~((u32_t)0xfc0000)); - eepromBoardData[10][4] |= (tmp<<18); - //TxRxMargin chain_2 - tmp = hpPriv->eepromImage[0x100+0x176*2/4]; - tmp = (tmp >> 8) & 0x3f; - eepromBoardData[11][3] &= (~((u32_t)0xfc0000)); - eepromBoardData[11][3] |= (tmp<<18); - eepromBoardData[11][4] &= (~((u32_t)0xfc0000)); - eepromBoardData[11][4] |= (tmp<<18); - //iqCall chain_0, iqCallQ chain_0 - tmp = hpPriv->eepromImage[0x100+0x17c*2/4]; - tmp = (tmp >> 16) & 0x3f; - tmp1 = hpPriv->eepromImage[0x100+0x17e*2/4]; - tmp1 = (tmp1) & 0x1f; - tmp = (tmp<<5) + tmp1; - eepromBoardData[12][3] &= (~((u32_t)0x7ff)); - eepromBoardData[12][3] |= (tmp); - eepromBoardData[12][4] &= (~((u32_t)0x7ff)); - eepromBoardData[12][4] |= (tmp); - //iqCall chain_2, iqCallQ chain_2 - tmp = hpPriv->eepromImage[0x100+0x17c*2/4]; - tmp = (tmp>>24) & 0x3f; - tmp1 = hpPriv->eepromImage[0x100+0x17e*2/4]; - tmp1 = (tmp1 >> 8) & 0x1f; - tmp = (tmp<<5) + tmp1; - eepromBoardData[13][3] &= (~((u32_t)0x7ff)); - eepromBoardData[13][3] |= (tmp); - eepromBoardData[13][4] &= (~((u32_t)0x7ff)); - eepromBoardData[13][4] |= (tmp); - //xpd gain mask - tmp = hpPriv->eepromImage[0x100+0x17c*2/4]; - tmp = tmp & 0xf; - DbgPrint("xpd=0x%x, pd=0x%x\n", tmp, zcXpdToPd[tmp]); - eepromBoardData[14][3] &= (~((u32_t)0xf0000)); - eepromBoardData[14][3] |= (zcXpdToPd[tmp] << 16); - eepromBoardData[14][4] &= (~((u32_t)0xf0000)); - eepromBoardData[14][4] |= (zcXpdToPd[tmp] << 16); -#if 0 - //bsw_Margin chain_0 - tmp = hpPriv->eepromImage[0x100+0x184*2/4]; - tmp = (tmp >> 8) & 0xf; - eepromBoardData[10][3] &= (~((u32_t)0x3c00)); - eepromBoardData[10][3] |= (tmp << 10); - eepromBoardData[10][4] &= (~((u32_t)0x3c00)); - eepromBoardData[10][4] |= (tmp << 10); - //bsw_Atten chain_0 - tmp = hpPriv->eepromImage[0x100+0x182*2/4]; - tmp = (tmp>>24) & 0x1f; - eepromBoardData[10][3] &= (~((u32_t)0x1f)); - eepromBoardData[10][3] |= (tmp); - eepromBoardData[10][4] &= (~((u32_t)0x1f)); - eepromBoardData[10][4] |= (tmp); - //bsw_Margin chain_2 - tmp = hpPriv->eepromImage[0x100+0x184*2/4]; - tmp = (tmp >> 16) & 0xf; - eepromBoardData[11][3] &= (~((u32_t)0x3c00)); - eepromBoardData[11][3] |= (tmp << 10); - eepromBoardData[11][4] &= (~((u32_t)0x3c00)); - eepromBoardData[11][4] |= (tmp << 10); - //bsw_Atten chain_2 - tmp = hpPriv->eepromImage[0x100+0x184*2/4]; - tmp = (tmp) & 0x1f; - eepromBoardData[11][3] &= (~((u32_t)0x1f)); - eepromBoardData[11][3] |= (tmp); - eepromBoardData[11][4] &= (~((u32_t)0x1f)); - eepromBoardData[11][4] |= (tmp); -#endif - -#if 0 - for (j=0; j<14; j++) - { - DbgPrint("%04x, %08x, %08x, %08x, %08x\n", eepromBoardData[j][0], eepromBoardData[j][1], eepromBoardData[j][2], eepromBoardData[j][3], eepromBoardData[j][4]); - } -#endif - - if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE - { - /* Update board data to registers */ - for (j=0; j<15; j++) - { - reg_write(eepromBoardData[j][0], eepromBoardData[j][modesIndex]); - - /* #1 Save the initial value of the related RIFS register settings */ - //if( ((struct zsHpPriv*)wd->hpPrivate)->isInitialPhy == 1 ) - { - switch(eepromBoardData[j][0]) - { - case 0x9850 : - ((struct zsHpPriv*)wd->hpPrivate)->initDesiredSigSize = eepromBoardData[j][modesIndex]; - break; - case 0x985c : - ((struct zsHpPriv*)wd->hpPrivate)->initAGC = eepromBoardData[j][modesIndex]; - break; - case 0x9860 : - ((struct zsHpPriv*)wd->hpPrivate)->initAgcControl = eepromBoardData[j][modesIndex]; - break; - case 0x9918 : - ((struct zsHpPriv*)wd->hpPrivate)->initSearchStartDelay = eepromBoardData[j][modesIndex]; - break; - case 0x99ec : - ((struct zsHpPriv*)wd->hpPrivate)->initRIFSSearchParams = eepromBoardData[j][modesIndex]; - break; - case 0xa388 : - ((struct zsHpPriv*)wd->hpPrivate)->initFastChannelChangeControl = eepromBoardData[j][modesIndex]; - default : - break; - } - } - } - } /* if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE */ - - - /* Bringup issue : force tx gain */ - //reg_write(0xa258, 0x0cc65381); - //reg_write(0xa274, 0x0a1a7c15); - zfInitPowerCal(dev); - - if(frequency > ZM_CH_G_14) - { - zfDelayWriteInternalReg(dev, 0x1d4014, 0x5143); - } - else - { - zfDelayWriteInternalReg(dev, 0x1d4014, 0x5163); - } - - zfFlushDelayWrite(dev); -} - - -void zfInitRf(zdev_t* dev, u32_t frequency) -{ - u32_t cmd[8]; - u16_t ret; - int delta_slope_coeff_exp; - int delta_slope_coeff_man; - int delta_slope_coeff_exp_shgi; - int delta_slope_coeff_man_shgi; - - zmw_get_wlan_dev(dev); - - zm_debug_msg1(" initRf frequency = ", frequency); - - if (frequency == 0) - { - frequency = 2412; - } - - /* Bank 0 1 2 3 5 6 7 */ - zfSetRfRegs(dev, frequency); - /* Bank 4 */ - zfSetBank4AndPowerTable(dev, frequency, 0, 0); - - /* stroe frequency */ - ((struct zsHpPriv*)wd->hpPrivate)->hwFrequency = (u16_t)frequency; - - zfGetHwTurnOffdynParam(dev, - frequency, 0, 0, - &delta_slope_coeff_exp, - &delta_slope_coeff_man, - &delta_slope_coeff_exp_shgi, - &delta_slope_coeff_man_shgi); - - /* related functions */ - frequency = frequency*1000; - cmd[0] = 28 | (ZM_CMD_RF_INIT << 8); - cmd[1] = frequency; - cmd[2] = 0;//((struct zsHpPriv*)wd->hpPrivate)->hw_DYNAMIC_HT2040_EN; - cmd[3] = 1;//((wd->ExtOffset << 2) | ((struct zsHpPriv*)wd->hpPrivate)->hw_HT_ENABLE); - cmd[4] = delta_slope_coeff_exp; - cmd[5] = delta_slope_coeff_man; - cmd[6] = delta_slope_coeff_exp_shgi; - cmd[7] = delta_slope_coeff_man_shgi; - - ret = zfIssueCmd(dev, cmd, 32, ZM_OID_INTERNAL_WRITE, 0); - - // delay temporarily, wait for new PHY and RF - zfwSleep(dev, 1000); -} - -int tn(int exp) -{ - int i; - int tmp = 1; - for(i=0; i>(7-i) & 0x1) << i); - return chansel; -} - -/* Bank 0 1 2 3 5 6 7 */ -void zfSetRfRegs(zdev_t* dev, u32_t frequency) -{ - u16_t freqIndex = 0; - u16_t i; - - //zmw_get_wlan_dev(dev); - - if ( frequency > ZM_CH_G_14 ) - { - /* 5G */ - freqIndex = 1; - zm_msg0_scan(ZM_LV_2, "Set to 5GHz"); - - } - else - { - /* 2.4G */ - freqIndex = 2; - zm_msg0_scan(ZM_LV_2, "Set to 2.4GHz"); - } - -#if 1 - for (i=0; ista.DFSEnable) - { - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) - { - if (wd->regulationTable.allowChannel[i].channel == frequency) - break; - } - wd->regulationTable.CurChIndex = i; - } - - if (bw40 == 1) - { - if (extOffset == 1) - { - frequency += 10; - } - else - { - frequency -= 10; - } - - } - - - if ( frequency > 3000 ) - { - if ( frequency % 10 ) - { - /* 5M */ - chan_sel = (u8_t)((frequency - 4800)/5); - chan_sel = (u8_t)(chan_sel & 0xff); - chansel = (u8_t)reverse_bits(chan_sel); - } - else - { - /* 10M : improve Tx EVM */ - chan_sel = (u8_t)((frequency - 4800)/10); - chan_sel = (u8_t)(chan_sel & 0xff)<<1; - chansel = (u8_t)reverse_bits(chan_sel); - - amode_refsel_1 = 1; - amode_refsel_0 = 0; - } - } - else - { - //temp_chan_sel = (((frequency - 672)*2) - 3040)/10; - if (frequency == 2484) - { - temp_chan_sel = 10 + (frequency - 2274)/5 ; - bmode_LF_synth_freq = 1; - } - else - { - temp_chan_sel = 16 + (frequency - 2272)/5 ; - bmode_LF_synth_freq = 0; - } - chan_sel = (u8_t)(temp_chan_sel << 2) & 0xff; - chansel = (u8_t)reverse_bits(chan_sel); - } - - d1 = chansel; //# 8 bits of chan - d0 = addr0<<7 | addr1<<6 | addr2<<5 - | amode_refsel_0<<3 | amode_refsel_1<<2 - | bmode_LF_synth_freq<<1 | chup; - - tmp_0 = d0 & 0x1f; //# 5-1 - tmp_1 = d1 & 0x1f; //# 5-1 - data0 = tmp_1<<5 | tmp_0; - - tmp_0 = d0>>5 & 0x7; //# 8-6 - tmp_1 = d1>>5 & 0x7; //# 8-6 - data1 = tmp_1<<5 | tmp_0; - - /* Bank4 */ - reg_write (0x9800+(0x2c<<2), data0); - reg_write (0x9800+(0x3a<<2), data1); - //zm_debug_msg1("0x9800+(0x2c<<2 = ", data0); - //zm_debug_msg1("0x9800+(0x3a<<2 = ", data1); - - - zfFlushDelayWrite(dev); - - zfwSleep(dev, 10); - - return; -} - - -struct zsPhyFreqPara -{ - u32_t coeff_exp; - u32_t coeff_man; - u32_t coeff_exp_shgi; - u32_t coeff_man_shgi; -}; - -struct zsPhyFreqTable -{ - u32_t frequency; - struct zsPhyFreqPara FpgaDynamicHT; - struct zsPhyFreqPara FpgaStaticHT; - struct zsPhyFreqPara ChipST20Mhz; - struct zsPhyFreqPara Chip2040Mhz; - struct zsPhyFreqPara Chip2040ExtAbove; -}; - -const struct zsPhyFreqTable zgPhyFreqCoeff[] = -{ -/*Index freq FPGA DYNAMIC_HT2040_EN FPGA STATIC_HT20 Real Chip static20MHz Real Chip 2040MHz Real Chip 2040Mhz */ - /* fclk = 10.8 21.6 40 ext below 40 ext above 40 */ -/* 0 */ {2412, {5, 23476, 5, 21128}, {4, 23476, 4, 21128}, {3, 21737, 3, 19563}, {3, 21827, 3, 19644}, {3, 21647, 3, 19482}}, -/* 1 */ {2417, {5, 23427, 5, 21084}, {4, 23427, 4, 21084}, {3, 21692, 3, 19523}, {3, 21782, 3, 19604}, {3, 21602, 3, 19442}}, -/* 2 */ {2422, {5, 23379, 5, 21041}, {4, 23379, 4, 21041}, {3, 21647, 3, 19482}, {3, 21737, 3, 19563}, {3, 21558, 3, 19402}}, -/* 3 */ {2427, {5, 23330, 5, 20997}, {4, 23330, 4, 20997}, {3, 21602, 3, 19442}, {3, 21692, 3, 19523}, {3, 21514, 3, 19362}}, -/* 4 */ {2432, {5, 23283, 5, 20954}, {4, 23283, 4, 20954}, {3, 21558, 3, 19402}, {3, 21647, 3, 19482}, {3, 21470, 3, 19323}}, -/* 5 */ {2437, {5, 23235, 5, 20911}, {4, 23235, 4, 20911}, {3, 21514, 3, 19362}, {3, 21602, 3, 19442}, {3, 21426, 3, 19283}}, -/* 6 */ {2442, {5, 23187, 5, 20868}, {4, 23187, 4, 20868}, {3, 21470, 3, 19323}, {3, 21558, 3, 19402}, {3, 21382, 3, 19244}}, -/* 7 */ {2447, {5, 23140, 5, 20826}, {4, 23140, 4, 20826}, {3, 21426, 3, 19283}, {3, 21514, 3, 19362}, {3, 21339, 3, 19205}}, -/* 8 */ {2452, {5, 23093, 5, 20783}, {4, 23093, 4, 20783}, {3, 21382, 3, 19244}, {3, 21470, 3, 19323}, {3, 21295, 3, 19166}}, -/* 9 */ {2457, {5, 23046, 5, 20741}, {4, 23046, 4, 20741}, {3, 21339, 3, 19205}, {3, 21426, 3, 19283}, {3, 21252, 3, 19127}}, -/* 10 */ {2462, {5, 22999, 5, 20699}, {4, 22999, 4, 20699}, {3, 21295, 3, 19166}, {3, 21382, 3, 19244}, {3, 21209, 3, 19088}}, -/* 11 */ {2467, {5, 22952, 5, 20657}, {4, 22952, 4, 20657}, {3, 21252, 3, 19127}, {3, 21339, 3, 19205}, {3, 21166, 3, 19050}}, -/* 12 */ {2472, {5, 22906, 5, 20615}, {4, 22906, 4, 20615}, {3, 21209, 3, 19088}, {3, 21295, 3, 19166}, {3, 21124, 3, 19011}}, -/* 13 */ {2484, {5, 22795, 5, 20516}, {4, 22795, 4, 20516}, {3, 21107, 3, 18996}, {3, 21192, 3, 19073}, {3, 21022, 3, 18920}}, -/* 14 */ {4920, {6, 23018, 6, 20716}, {5, 23018, 5, 20716}, {4, 21313, 4, 19181}, {4, 21356, 4, 19220}, {4, 21269, 4, 19142}}, -/* 15 */ {4940, {6, 22924, 6, 20632}, {5, 22924, 5, 20632}, {4, 21226, 4, 19104}, {4, 21269, 4, 19142}, {4, 21183, 4, 19065}}, -/* 16 */ {4960, {6, 22832, 6, 20549}, {5, 22832, 5, 20549}, {4, 21141, 4, 19027}, {4, 21183, 4, 19065}, {4, 21098, 4, 18988}}, -/* 17 */ {4980, {6, 22740, 6, 20466}, {5, 22740, 5, 20466}, {4, 21056, 4, 18950}, {4, 21098, 4, 18988}, {4, 21014, 4, 18912}}, -/* 18 */ {5040, {6, 22469, 6, 20223}, {5, 22469, 5, 20223}, {4, 20805, 4, 18725}, {4, 20846, 4, 18762}, {4, 20764, 4, 18687}}, -/* 19 */ {5060, {6, 22381, 6, 20143}, {5, 22381, 5, 20143}, {4, 20723, 4, 18651}, {4, 20764, 4, 18687}, {4, 20682, 4, 18614}}, -/* 20 */ {5080, {6, 22293, 6, 20063}, {5, 22293, 5, 20063}, {4, 20641, 4, 18577}, {4, 20682, 4, 18614}, {4, 20601, 4, 18541}}, -/* 21 */ {5180, {6, 21862, 6, 19676}, {5, 21862, 5, 19676}, {4, 20243, 4, 18219}, {4, 20282, 4, 18254}, {4, 20204, 4, 18183}}, -/* 22 */ {5200, {6, 21778, 6, 19600}, {5, 21778, 5, 19600}, {4, 20165, 4, 18148}, {4, 20204, 4, 18183}, {4, 20126, 4, 18114}}, -/* 23 */ {5220, {6, 21695, 6, 19525}, {5, 21695, 5, 19525}, {4, 20088, 4, 18079}, {4, 20126, 4, 18114}, {4, 20049, 4, 18044}}, -/* 24 */ {5240, {6, 21612, 6, 19451}, {5, 21612, 5, 19451}, {4, 20011, 4, 18010}, {4, 20049, 4, 18044}, {4, 19973, 4, 17976}}, -/* 25 */ {5260, {6, 21530, 6, 19377}, {5, 21530, 5, 19377}, {4, 19935, 4, 17941}, {4, 19973, 4, 17976}, {4, 19897, 4, 17907}}, -/* 26 */ {5280, {6, 21448, 6, 19303}, {5, 21448, 5, 19303}, {4, 19859, 4, 17873}, {4, 19897, 4, 17907}, {4, 19822, 4, 17840}}, -/* 27 */ {5300, {6, 21367, 6, 19230}, {5, 21367, 5, 19230}, {4, 19784, 4, 17806}, {4, 19822, 4, 17840}, {4, 19747, 4, 17772}}, -/* 28 */ {5320, {6, 21287, 6, 19158}, {5, 21287, 5, 19158}, {4, 19710, 4, 17739}, {4, 19747, 4, 17772}, {4, 19673, 4, 17706}}, -/* 29 */ {5500, {6, 20590, 6, 18531}, {5, 20590, 5, 18531}, {4, 19065, 4, 17159}, {4, 19100, 4, 17190}, {4, 19030, 4, 17127}}, -/* 30 */ {5520, {6, 20516, 6, 18464}, {5, 20516, 5, 18464}, {4, 18996, 4, 17096}, {4, 19030, 4, 17127}, {4, 18962, 4, 17065}}, -/* 31 */ {5540, {6, 20442, 6, 18397}, {5, 20442, 5, 18397}, {4, 18927, 4, 17035}, {4, 18962, 4, 17065}, {4, 18893, 4, 17004}}, -/* 32 */ {5560, {6, 20368, 6, 18331}, {5, 20368, 5, 18331}, {4, 18859, 4, 16973}, {4, 18893, 4, 17004}, {4, 18825, 4, 16943}}, -/* 33 */ {5580, {6, 20295, 6, 18266}, {5, 20295, 5, 18266}, {4, 18792, 4, 16913}, {4, 18825, 4, 16943}, {4, 18758, 4, 16882}}, -/* 34 */ {5600, {6, 20223, 6, 18200}, {5, 20223, 5, 18200}, {4, 18725, 4, 16852}, {4, 18758, 4, 16882}, {4, 18691, 4, 16822}}, -/* 35 */ {5620, {6, 20151, 6, 18136}, {5, 20151, 5, 18136}, {4, 18658, 4, 16792}, {4, 18691, 4, 16822}, {4, 18625, 4, 16762}}, -/* 36 */ {5640, {6, 20079, 6, 18071}, {5, 20079, 5, 18071}, {4, 18592, 4, 16733}, {4, 18625, 4, 16762}, {4, 18559, 4, 16703}}, -/* 37 */ {5660, {6, 20008, 6, 18007}, {5, 20008, 5, 18007}, {4, 18526, 4, 16673}, {4, 18559, 4, 16703}, {4, 18493, 4, 16644}}, -/* 38 */ {5680, {6, 19938, 6, 17944}, {5, 19938, 5, 17944}, {4, 18461, 4, 16615}, {4, 18493, 4, 16644}, {4, 18428, 4, 16586}}, -/* 39 */ {5700, {6, 19868, 6, 17881}, {5, 19868, 5, 17881}, {4, 18396, 4, 16556}, {4, 18428, 4, 16586}, {4, 18364, 4, 16527}}, -/* 40 */ {5745, {6, 19712, 6, 17741}, {5, 19712, 5, 17741}, {4, 18252, 4, 16427}, {4, 18284, 4, 16455}, {4, 18220, 4, 16398}}, -/* 41 */ {5765, {6, 19644, 6, 17679}, {5, 19644, 5, 17679}, {4, 18189, 5, 32740}, {4, 18220, 4, 16398}, {4, 18157, 5, 32683}}, -/* 42 */ {5785, {6, 19576, 6, 17618}, {5, 19576, 5, 17618}, {4, 18126, 5, 32626}, {4, 18157, 5, 32683}, {4, 18094, 5, 32570}}, -/* 43 */ {5805, {6, 19508, 6, 17558}, {5, 19508, 5, 17558}, {4, 18063, 5, 32514}, {4, 18094, 5, 32570}, {4, 18032, 5, 32458}}, -/* 44 */ {5825, {6, 19441, 6, 17497}, {5, 19441, 5, 17497}, {4, 18001, 5, 32402}, {4, 18032, 5, 32458}, {4, 17970, 5, 32347}}, -/* 45 */ {5170, {6, 21904, 6, 19714}, {5, 21904, 5, 19714}, {4, 20282, 4, 18254}, {4, 20321, 4, 18289}, {4, 20243, 4, 18219}}, -/* 46 */ {5190, {6, 21820, 6, 19638}, {5, 21820, 5, 19638}, {4, 20204, 4, 18183}, {4, 20243, 4, 18219}, {4, 20165, 4, 18148}}, -/* 47 */ {5210, {6, 21736, 6, 19563}, {5, 21736, 5, 19563}, {4, 20126, 4, 18114}, {4, 20165, 4, 18148}, {4, 20088, 4, 18079}}, -/* 48 */ {5230, {6, 21653, 6, 19488}, {5, 21653, 5, 19488}, {4, 20049, 4, 18044}, {4, 20088, 4, 18079}, {4, 20011, 4, 18010}} -}; -/* to reduce search time, please modify this define if you add or delete channel in table */ -#define First5GChannelIndex 14 - -void zfGetHwTurnOffdynParam(zdev_t* dev, - u32_t frequency, u8_t bw40, u8_t extOffset, - int* delta_slope_coeff_exp, - int* delta_slope_coeff_man, - int* delta_slope_coeff_exp_shgi, - int* delta_slope_coeff_man_shgi) -{ - /* Get param for turnoffdyn */ - u16_t i, arraySize; - - //zmw_get_wlan_dev(dev); - - arraySize = sizeof(zgPhyFreqCoeff)/sizeof(struct zsPhyFreqTable); - if (frequency < 3000) - { - /* 2.4GHz Channel */ - for (i = 0; i < First5GChannelIndex; i++) - { - if (frequency == zgPhyFreqCoeff[i].frequency) - break; - } - - if (i < First5GChannelIndex) - { - } - else - { - zm_msg1_scan(ZM_LV_0, "Unsupported 2.4G frequency = ", frequency); - return; - } - } - else - { - /* 5GHz Channel */ - for (i = First5GChannelIndex; i < arraySize; i++) - { - if (frequency == zgPhyFreqCoeff[i].frequency) - break; - } - - if (i < arraySize) - { - } - else - { - zm_msg1_scan(ZM_LV_0, "Unsupported 5G frequency = ", frequency); - return; - } - } - - /* FPGA DYNAMIC_HT2040_EN fclk = 10.8 */ - /* FPGA STATIC_HT20_ fclk = 21.6 */ - /* Real Chip fclk = 40 */ - #if ZM_FPGA_PHY == 1 - //fclk = 10.8; - *delta_slope_coeff_exp = zgPhyFreqCoeff[i].FpgaDynamicHT.coeff_exp; - *delta_slope_coeff_man = zgPhyFreqCoeff[i].FpgaDynamicHT.coeff_man; - *delta_slope_coeff_exp_shgi = zgPhyFreqCoeff[i].FpgaDynamicHT.coeff_exp_shgi; - *delta_slope_coeff_man_shgi = zgPhyFreqCoeff[i].FpgaDynamicHT.coeff_man_shgi; - #else - //fclk = 40; - if (bw40) - { - /* ht2040 */ - if (extOffset == 1) { - *delta_slope_coeff_exp = zgPhyFreqCoeff[i].Chip2040ExtAbove.coeff_exp; - *delta_slope_coeff_man = zgPhyFreqCoeff[i].Chip2040ExtAbove.coeff_man; - *delta_slope_coeff_exp_shgi = zgPhyFreqCoeff[i].Chip2040ExtAbove.coeff_exp_shgi; - *delta_slope_coeff_man_shgi = zgPhyFreqCoeff[i].Chip2040ExtAbove.coeff_man_shgi; - } - else { - *delta_slope_coeff_exp = zgPhyFreqCoeff[i].Chip2040Mhz.coeff_exp; - *delta_slope_coeff_man = zgPhyFreqCoeff[i].Chip2040Mhz.coeff_man; - *delta_slope_coeff_exp_shgi = zgPhyFreqCoeff[i].Chip2040Mhz.coeff_exp_shgi; - *delta_slope_coeff_man_shgi = zgPhyFreqCoeff[i].Chip2040Mhz.coeff_man_shgi; - } - } - else - { - /* static 20 */ - *delta_slope_coeff_exp = zgPhyFreqCoeff[i].ChipST20Mhz.coeff_exp; - *delta_slope_coeff_man = zgPhyFreqCoeff[i].ChipST20Mhz.coeff_man; - *delta_slope_coeff_exp_shgi = zgPhyFreqCoeff[i].ChipST20Mhz.coeff_exp_shgi; - *delta_slope_coeff_man_shgi = zgPhyFreqCoeff[i].ChipST20Mhz.coeff_man_shgi; - } - #endif -} - -/* Main routin frequency setting function */ -/* If 2.4G/5G switch, PHY need resetting BB and RF for band switch */ -/* Do the setting switch in zfSendFrequencyCmd() */ -void zfHpSetFrequencyEx(zdev_t* dev, u32_t frequency, u8_t bw40, - u8_t extOffset, u8_t initRF) -{ - u32_t cmd[9]; - u16_t ret; - u8_t old_band; - u8_t new_band; - u32_t checkLoopCount; - u32_t tmpValue; - - int delta_slope_coeff_exp; - int delta_slope_coeff_man; - int delta_slope_coeff_exp_shgi; - int delta_slope_coeff_man_shgi; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - zm_msg1_scan(ZM_LV_1, "Frequency = ", frequency); - zm_msg1_scan(ZM_LV_1, "bw40 = ", bw40); - zm_msg1_scan(ZM_LV_1, "extOffset = ", extOffset); - - if ( hpPriv->coldResetNeedFreq ) - { - hpPriv->coldResetNeedFreq = 0; - initRF = 2; - zm_debug_msg0("zfHpSetFrequencyEx: Do ColdReset "); - } - if ( hpPriv->isSiteSurvey == 2 ) - { - /* wait time for AGC and noise calibration : not in sitesurvey and connected */ - checkLoopCount = 2000; /* 2000*100 = 200ms */ - } - else - { - /* wait time for AGC and noise calibration : in sitesurvey */ - checkLoopCount = 1000; /* 1000*100 = 100ms */ - } - - hpPriv->latestFrequency = frequency; - hpPriv->latestBw40 = bw40; - hpPriv->latestExtOffset = extOffset; - - if ((hpPriv->dot11Mode == ZM_HAL_80211_MODE_IBSS_GENERAL) || - (hpPriv->dot11Mode == ZM_HAL_80211_MODE_IBSS_WPA2PSK)) - { - if ( frequency <= ZM_CH_G_14 ) - { - /* workaround for 11g Ad Hoc beacon distribution */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, 0x7f0007); - //zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_AIFS, 0x1c04901c); - } - } - - /* AHB, DAC, ADC clock selection by static20/ht2040 */ - zfSelAdcClk(dev, bw40, frequency); - - /* clear bb_heavy_clip_enable */ - reg_write(0x99e0, 0x200); - zfFlushDelayWrite(dev); - - /* Set CTS/RTS rate */ - if ( frequency > ZM_CH_G_14 ) - { - //zfHpSetRTSCTSRate(dev, 0x10b010b); /* OFDM 6M */ - new_band = 1; - } - else - { - //zfHpSetRTSCTSRate(dev, 0x30003); /* CCK 11M */ - new_band = 0; - } - - if (((struct zsHpPriv*)wd->hpPrivate)->hwFrequency > ZM_CH_G_14) - old_band = 1; - else - old_band = 0; - - //Workaround for 2.4GHz only device - if ((hpPriv->OpFlags & 0x1) == 0) - { - if ((((struct zsHpPriv*)wd->hpPrivate)->hwFrequency == ZM_CH_G_1) && (frequency == ZM_CH_G_2)) - { - /* Force to do band switching */ - old_band = 1; - } - } - - /* Notify channel switch to firmware */ - /* TX/RX must be stopped by now */ - cmd[0] = 0 | (ZM_CMD_FREQ_STRAT << 8); - ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, 0); - - if ((initRF != 0) || (new_band != old_band) - || (((struct zsHpPriv*)wd->hpPrivate)->hwBw40 != bw40)) - { - /* band switch */ - zm_msg0_scan(ZM_LV_1, "=====band switch====="); - - if (initRF == 2 ) - { - //Cold reset BB/ADDA - zfDelayWriteInternalReg(dev, 0x1d4004, 0x800); - zfFlushDelayWrite(dev); - zm_msg0_scan(ZM_LV_1, "Do cold reset BB/ADDA"); - } - else - { - //Warm reset BB/ADDA - zfDelayWriteInternalReg(dev, 0x1d4004, 0x400); - zfFlushDelayWrite(dev); - } - - /* reset workaround state to default */ - hpPriv->rxStrongRSSI = 0; - hpPriv->strongRSSI = 0; - - zfDelayWriteInternalReg(dev, 0x1d4004, 0x0); - zfFlushDelayWrite(dev); - - zfInitPhy(dev, frequency, bw40); - -// zfiCheckRifs(dev); - - /* Bank 0 1 2 3 5 6 7 */ - zfSetRfRegs(dev, frequency); - /* Bank 4 */ - zfSetBank4AndPowerTable(dev, frequency, bw40, extOffset); - - cmd[0] = 32 | (ZM_CMD_RF_INIT << 8); - } - else //((new_band == old_band) && !initRF) - { - /* same band */ - - /* Force disable CR671 bit20 / 7823 */ - /* The bug has to do with the polarity of the pdadc offset calibration. There */ - /* is an initial calibration that is OK, and there is a continuous */ - /* calibration that updates the pddac with the wrong polarity. Fortunately */ - /* the second loop can be disabled with a bit called en_pd_dc_offset_thr. */ -#if 0 - cmdB[0] = 8 | (ZM_CMD_BITAND << 8);; - cmdB[1] = (0xa27c + 0x1bc000); - cmdB[2] = 0xffefffff; - ret = zfIssueCmd(dev, cmdB, 12, ZM_OID_INTERNAL_WRITE, 0); -#endif - - /* Bank 4 */ - zfSetBank4AndPowerTable(dev, frequency, bw40, extOffset); - - - cmd[0] = 32 | (ZM_CMD_FREQUENCY << 8); - } - - /* Compatibility for new layout UB83 */ - /* Setting code at CR1 here move from the func:zfHwHTEnable() in firmware */ - if (((struct zsHpPriv*)wd->hpPrivate)->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM) - { - /* UB83 : one stream */ - tmpValue = 0; - } - else - { - /* UB81, UB82 : two stream */ - tmpValue = 0x100; - } - - if (1) //if (((struct zsHpPriv*)wd->hpPrivate)->hw_HT_ENABLE == 1) - { - if (bw40 == 1) - { - if (extOffset == 1) { - reg_write(0x9804, tmpValue | 0x2d4); //3d4 for real - } - else { - reg_write(0x9804, tmpValue | 0x2c4); //3c4 for real - } - //# Dyn HT2040.Refer to Reg 1. - //#[3]:single length (4us) 1st HT long training symbol; use Walsh spatial spreading for 2 chains 2 streams TX - //#[c]:allow short GI for HT40 packets; enable HT detection. - //#[4]:enable 20/40 MHz channel detection. - } - else - { - reg_write(0x9804, tmpValue | 0x240); - //# Static HT20 - //#[3]:single length (4us) 1st HT long training symbol; use Walsh spatial spreading for 2 chains 2 streams TX - //#[4]:Otus don't allow short GI for HT20 packets yet; enable HT detection. - //#[0]:disable 20/40 MHz channel detection. - } - } - else - { - reg_write(0x9804, 0x0); - //# Legacy;# Direct Mapping for each chain. - //#Be modified by Oligo to add dynanic for legacy. - if (bw40 == 1) - { - reg_write(0x9804, 0x4); //# Dyn Legacy .Refer to reg 1. - } - else - { - reg_write(0x9804, 0x0); //# Static Legacy - } - } - zfFlushDelayWrite(dev); - /* end of ub83 compatibility */ - - /* Set Power, TPC, Gain table... */ - zfSetPowerCalTable(dev, frequency, bw40, extOffset); - - - /* store frequency */ - ((struct zsHpPriv*)wd->hpPrivate)->hwFrequency = (u16_t)frequency; - ((struct zsHpPriv*)wd->hpPrivate)->hwBw40 = bw40; - ((struct zsHpPriv*)wd->hpPrivate)->hwExtOffset = extOffset; - - zfGetHwTurnOffdynParam(dev, - frequency, bw40, extOffset, - &delta_slope_coeff_exp, - &delta_slope_coeff_man, - &delta_slope_coeff_exp_shgi, - &delta_slope_coeff_man_shgi); - - /* related functions */ - frequency = frequency*1000; - /* len[36] : type[0x30] : seq[?] */ -// cmd[0] = 28 | (ZM_CMD_FREQUENCY << 8); - cmd[1] = frequency; - cmd[2] = bw40;//((struct zsHpPriv*)wd->hpPrivate)->hw_DYNAMIC_HT2040_EN; - cmd[3] = (extOffset<<2)|0x1;//((wd->ExtOffset << 2) | ((struct zsHpPriv*)wd->hpPrivate)->hw_HT_ENABLE); - cmd[4] = delta_slope_coeff_exp; - cmd[5] = delta_slope_coeff_man; - cmd[6] = delta_slope_coeff_exp_shgi; - cmd[7] = delta_slope_coeff_man_shgi; - cmd[8] = checkLoopCount; - - ret = zfIssueCmd(dev, cmd, 36, ZM_CMD_SET_FREQUENCY, 0); - - // delay temporarily, wait for new PHY and RF - //zfwSleep(dev, 1000); -} - - -/******************** Key ********************/ - -u16_t zfHpResetKeyCache(zdev_t* dev) -{ - u8_t i; - u32_t key[4] = {0, 0, 0, 0}; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - for(i=0;i<4;i++) - { - zfHpSetDefaultKey(dev, i, ZM_WEP64, key, NULL); - } - zfDelayWriteInternalReg(dev, ZM_MAC_REG_ROLL_CALL_TBL_L, 0x00); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_ROLL_CALL_TBL_H, 0x00); - zfFlushDelayWrite(dev); - - hpPriv->camRollCallTable = (u64_t) 0; - - return 0; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfSetKey */ -/* Set key. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2006.1 */ -/* */ -/************************************************************************/ -/* ! please use zfCoreSetKey() in 80211Core for SetKey */ -u32_t zfHpSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type, - u16_t* mac, u32_t* key) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t ret; - u16_t i; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - -#if 0 /* remove to zfCoreSetKey() */ - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - wd->sta.flagKeyChanging++; - zm_debug_msg1(" zfHpSetKey++++ ", wd->sta.flagKeyChanging); - zmw_leave_critical_section(dev); -#endif - - cmd[0] = 0x0000281C; - cmd[1] = ((u32_t)keyId<<16) + (u32_t)user; - cmd[2] = ((u32_t)mac[0]<<16) + (u32_t)type; - cmd[3] = ((u32_t)mac[2]<<16) + ((u32_t)mac[1]); - - for (i=0; i<4; i++) - { - cmd[4+i] = key[i]; - } - - if (user < 64) - { - hpPriv->camRollCallTable |= ((u64_t) 1) << user; - } - - //ret = zfIssueCmd(dev, cmd, 32, ZM_OID_INTERNAL_WRITE, NULL); - ret = zfIssueCmd(dev, cmd, 32, ZM_CMD_SET_KEY, NULL); - return ret; -} - - -u32_t zfHpSetApPairwiseKey(zdev_t* dev, u16_t* staMacAddr, u8_t type, - u32_t* key, u32_t* micKey, u16_t staAid) -{ - if ((staAid!=0) && (staAid<64)) - { - zfHpSetKey(dev, (staAid-1), 0, type, staMacAddr, key); - if ((type == ZM_TKIP) -#ifdef ZM_ENABLE_CENC - || (type == ZM_CENC) -#endif //ZM_ENABLE_CENC - ) - zfHpSetKey(dev, (staAid-1), 1, type, staMacAddr, micKey); - return 0; - } - return 1; -} - -u32_t zfHpSetApGroupKey(zdev_t* dev, u16_t* apMacAddr, u8_t type, - u32_t* key, u32_t* micKey, u16_t vapId) -{ - zfHpSetKey(dev, ZM_USER_KEY_DEFAULT - 1 - vapId, 0, type, apMacAddr, key); // 6D18 modify from 0 to 1 ?? - if ((type == ZM_TKIP) -#ifdef ZM_ENABLE_CENC - || (type == ZM_CENC) -#endif //ZM_ENABLE_CENC - ) - zfHpSetKey(dev, ZM_USER_KEY_DEFAULT - 1 - vapId, 1, type, apMacAddr, micKey); - return 0; -} - -u32_t zfHpSetDefaultKey(zdev_t* dev, u8_t keyId, u8_t type, u32_t* key, u32_t* micKey) -{ - u16_t macAddr[3] = {0, 0, 0}; - - #ifdef ZM_ENABLE_IBSS_WPA2PSK - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - if ( hpPriv->dot11Mode == ZM_HAL_80211_MODE_IBSS_WPA2PSK ) - { /* If not wpa2psk , use traditional */ - /* Because the bug of chip , defaultkey should follow the key map rule in register 700 */ - if ( keyId == 0 ) - zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0, type, macAddr, key); - else - zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 1, type, macAddr, key); - } - else - zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0, type, macAddr, key); - #else - zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0, type, macAddr, key); - #endif - if ((type == ZM_TKIP) - -#ifdef ZM_ENABLE_CENC - || (type == ZM_CENC) -#endif //ZM_ENABLE_CENC - ) - { - zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 1, type, macAddr, micKey); - } - - return 0; -} - -u32_t zfHpSetPerUserKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t* mac, u8_t type, u32_t* key, u32_t* micKey) -{ -#ifdef ZM_ENABLE_IBSS_WPA2PSK - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - if ( hpPriv->dot11Mode == ZM_HAL_80211_MODE_IBSS_WPA2PSK ) - { /* If not wpa2psk , use traditional */ - if(keyId) - { /* Set Group Key */ - zfHpSetKey(dev, user, 1, type, (u16_t *)mac, key); - } - else if(keyId == 0) - { /* Set Pairwise Key */ - zfHpSetKey(dev, user, 0, type, (u16_t *)mac, key); - } - } - else - { - zfHpSetKey(dev, user, keyId, type, (u16_t *)mac, key); - } -#else - zfHpSetKey(dev, user, keyId, type, (u16_t *)mac, key); -#endif - - if ((type == ZM_TKIP) -#ifdef ZM_ENABLE_CENC - || (type == ZM_CENC) -#endif //ZM_ENABLE_CENC - ) - { - zfHpSetKey(dev, user, keyId + 1, type, (u16_t *)mac, micKey); - } - return 0; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfHpRemoveKey */ -/* Remove key. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Yuan-Gu Wei ZyDAS Technology Corporation 2006.6 */ -/* */ -/************************************************************************/ -u16_t zfHpRemoveKey(zdev_t* dev, u16_t user) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t ret = 0; - - cmd[0] = 0x00002904; - cmd[1] = (u32_t)user; - - ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, NULL); - return ret; -} - - - -/******************** DMA ********************/ -u16_t zfHpStartRecv(zdev_t* dev) -{ - zfDelayWriteInternalReg(dev, 0x1c3d30, 0x100); - zfFlushDelayWrite(dev); - - return 0; -} - -u16_t zfHpStopRecv(zdev_t* dev) -{ - return 0; -} - - -/******************** MAC ********************/ -void zfInitMac(zdev_t* dev) -{ - /* ACK extension register */ - // jhlee temp : change value 0x2c -> 0x40 - // honda resolve short preamble problem : 0x40 -> 0x75 - zfDelayWriteInternalReg(dev, ZM_MAC_REG_ACK_EXTENSION, 0x40); // 0x28 -> 0x2c 6522:yflee - - /* TxQ0/1/2/3 Retry MAX=2 => transmit 3 times and degrade rate for retry */ - /* PB42 AP crash issue: */ - /* Workaround the crash issue by CTS/RTS, set retry max to zero for */ - /* workaround tx underrun which enable CTS/RTS */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_RETRY_MAX, 0); // 0x11111 => 0 - - /* use hardware MIC check */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_SNIFFER, 0x2000000); - - /* Set Rx threshold to 1600 */ -#if ZM_LARGEPAYLOAD_TEST == 1 - zfDelayWriteInternalReg(dev, ZM_MAC_REG_RX_THRESHOLD, 0xc4000); -#else - #ifndef ZM_DISABLE_AMSDU8K_SUPPORT - /* The maximum A-MSDU length is 3839/7935 */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_RX_THRESHOLD, 0xc1f80); - #else - zfDelayWriteInternalReg(dev, ZM_MAC_REG_RX_THRESHOLD, 0xc0f80); - #endif -#endif - - //zfDelayWriteInternalReg(dev, ZM_MAC_REG_DYNAMIC_SIFS_ACK, 0x10A); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_RX_PE_DELAY, 0x70); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xa144000); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_SLOT_TIME, 9<<10); - - /* CF-END mode */ - zfDelayWriteInternalReg(dev, 0x1c3b2c, 0x19000000); - - //NAV protects ACK only (in TXOP) - zfDelayWriteInternalReg(dev, 0x1c3b38, 0x201); - - - /* Set Beacon PHY CTRL's TPC to 0x7, TA1=1 */ - /* OTUS set AM to 0x1 */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_HT1, 0x8000170); - - /* TODO : wep backoff protection 0x63c */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BACKOFF_PROTECT, 0x105); - - /* AGG test code*/ - /* Aggregation MAX number and timeout */ - zfDelayWriteInternalReg(dev, 0x1c3b9c, 0x10000a); - /* Filter any control frames, BAR is bit 24 */ - zfDelayWriteInternalReg(dev, 0x1c368c, 0x0500ffff); - /* Enable deaggregator */ - zfDelayWriteInternalReg(dev, 0x1c3c40, 0x1); - - /* Basic rate */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BASIC_RATE, 0x150f); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_MANDATORY_RATE, 0x150f); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_RTS_CTS_RATE, 0x10b01bb); - - /* MIMO resposne control */ - zfDelayWriteInternalReg(dev, 0x1c3694, 0x4003C1E);/* bit 26~28 otus-AM */ - - /* Enable LED0 and LED1 */ - zfDelayWriteInternalReg(dev, 0x1d0100, 0x3); - zfDelayWriteInternalReg(dev, 0x1d0104, 0x3); - - /* switch MAC to OTUS interface */ - zfDelayWriteInternalReg(dev, 0x1c3600, 0x3); - - /* RXMAC A-MPDU length threshold */ - zfDelayWriteInternalReg(dev, 0x1c3c50, 0xffff); - - /* Phy register read timeout */ - zfDelayWriteInternalReg(dev, 0x1c3680, 0xf00008); - - /* Disable Rx TimeOut : workaround for BB. - * OTUS would interrupt the rx frame that sent by OWL TxUnderRun - * because OTUS rx timeout behavior, then OTUS would not ack the BA for - * this AMPDU from OWL. - * Fix by Perry Hwang. 2007/05/10. - * 0x1c362c : Rx timeout value : bit 27~16 - */ - zfDelayWriteInternalReg(dev, 0x1c362c, 0x0); - - //Set USB Rx stream mode MAX packet number to 2 - // Max packet number = *0x1e1110 + 1 - zfDelayWriteInternalReg(dev, 0x1e1110, 0x4); - //Set USB Rx stream mode timeout to 10us - zfDelayWriteInternalReg(dev, 0x1e1114, 0x80); - - //Set CPU clock frequency to 88/80MHz - zfDelayWriteInternalReg(dev, 0x1D4008, 0x73); - - //Set WLAN DMA interrupt mode : generate int per packet - zfDelayWriteInternalReg(dev, 0x1c3d7c, 0x110011); - - /* 7807 */ - /* enable func : Reset FIFO1 and FIFO2 when queue-gnt is low */ - /* 0x1c3bb0 Bit2 */ - /* Disable SwReset in firmware for TxHang, enable reset FIFO func. */ - zfDelayWriteInternalReg(dev, 0x1c3bb0, 0x4); - - /* Disables the CF_END frame */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_TXOP_NOT_ENOUGH_INDICATION, 0x141E0F48); - - /* Disable the SW Decrypt*/ - zfDelayWriteInternalReg(dev, 0x1c3678, 0x70); - zfFlushDelayWrite(dev); - //--------------------- - - /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */ - zfUpdateDefaultQosParameter(dev, 0); - - //zfSelAdcClk(dev, 0); - - return; -} - - -u16_t zfHpSetSnifferMode(zdev_t* dev, u16_t on) -{ - if (on != 0) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_SNIFFER, 0x2000001); - } - else - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_SNIFFER, 0x2000000); - } - zfFlushDelayWrite(dev); - return 0; -} - - -u16_t zfHpSetApStaMode(zdev_t* dev, u8_t mode) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - hpPriv->dot11Mode = mode; - - switch(mode) - { - case ZM_HAL_80211_MODE_AP: - zfDelayWriteInternalReg(dev, 0x1c3700, 0x0f0000a1); - zfDelayWriteInternalReg(dev, 0x1c3c40, 0x1); - break; - - case ZM_HAL_80211_MODE_STA: - zfDelayWriteInternalReg(dev, 0x1c3700, 0x0f000002); - zfDelayWriteInternalReg(dev, 0x1c3c40, 0x1); - break; - - case ZM_HAL_80211_MODE_IBSS_GENERAL: - zfDelayWriteInternalReg(dev, 0x1c3700, 0x0f000000); - zfDelayWriteInternalReg(dev, 0x1c3c40, 0x1); - break; - - case ZM_HAL_80211_MODE_IBSS_WPA2PSK: - zfDelayWriteInternalReg(dev, 0x1c3700, 0x0f0000e0); - zfDelayWriteInternalReg(dev, 0x1c3c40, 0x41); // for multiple ( > 2 ) stations IBSS network - break; - - default: - goto skip; - } - - zfFlushDelayWrite(dev); - -skip: - return 0; -} - - -u16_t zfHpSetBssid(zdev_t* dev, u8_t* bssidSrc) -{ - u32_t address; - u16_t *bssid = (u16_t *)bssidSrc; - - address = bssid[0] + (((u32_t)bssid[1]) << 16); - zfDelayWriteInternalReg(dev, 0x1c3618, address); - - address = (u32_t)bssid[2]; - zfDelayWriteInternalReg(dev, 0x1c361C, address); - zfFlushDelayWrite(dev); - return 0; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfHpUpdateQosParameter */ -/* Update TxQs CWMIN, CWMAX, AIFS and TXOP. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* cwminTbl : CWMIN parameter for TxQs */ -/* cwmaxTbl : CWMAX parameter for TxQs */ -/* aifsTbl: AIFS parameter for TxQs */ -/* txopTbl : TXOP parameter for TxQs */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2006.6 */ -/* */ -/************************************************************************/ -u8_t zfHpUpdateQosParameter(zdev_t* dev, u16_t* cwminTbl, u16_t* cwmaxTbl, - u16_t* aifsTbl, u16_t* txopTbl) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - zm_msg0_mm(ZM_LV_0, "zfHalUpdateQosParameter()"); - - /* Note : Do not change cwmin for Q0 in Ad Hoc mode */ - /* otherwise driver will fail in Wifi beacon distribution */ - if (hpPriv->dot11Mode == ZM_HAL_80211_MODE_STA) - { -#if 0 //Restore CWmin to improve down link throughput - //cheating in BE traffic - if (wd->sta.EnableHT == 1) - { - //cheating in BE traffic - cwminTbl[0] = 7;//15; - } -#endif - cwmaxTbl[0] = 127;//1023; - aifsTbl[0] = 2*9+10;//3 * 9 + 10; - } - - /* CWMIN and CWMAX */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, cwminTbl[0] - + ((u32_t)cwmaxTbl[0]<<16)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_CW, cwminTbl[1] - + ((u32_t)cwmaxTbl[1]<<16)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC2_CW, cwminTbl[2] - + ((u32_t)cwmaxTbl[2]<<16)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC3_CW, cwminTbl[3] - + ((u32_t)cwmaxTbl[3]<<16)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC4_CW, cwminTbl[4] - + ((u32_t)cwmaxTbl[4]<<16)); - - /* AIFS */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_AIFS, aifsTbl[0] - +((u32_t)aifsTbl[0]<<12)+((u32_t)aifsTbl[0]<<24)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC3_AC2_AIFS, (aifsTbl[0]>>8) - +((u32_t)aifsTbl[0]<<4)+((u32_t)aifsTbl[0]<<16)); - - /* TXOP */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, txopTbl[0] - + ((u32_t)txopTbl[1]<<16)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC3_AC2_TXOP, txopTbl[2] - + ((u32_t)txopTbl[3]<<16)); - - zfFlushDelayWrite(dev); - - hpPriv->txop[0] = txopTbl[0]; - hpPriv->txop[1] = txopTbl[1]; - hpPriv->txop[2] = txopTbl[2]; - hpPriv->txop[3] = txopTbl[3]; - hpPriv->cwmin[0] = cwminTbl[0]; - hpPriv->cwmax[0] = cwmaxTbl[0]; - hpPriv->cwmin[1] = cwminTbl[1]; - hpPriv->cwmax[1] = cwmaxTbl[1]; - - return 0; -} - - -void zfHpSetAtimWindow(zdev_t* dev, u16_t atimWin) -{ - zm_msg1_mm(ZM_LV_0, "Set ATIM window to ", atimWin); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_ATIM_WINDOW, atimWin); - zfFlushDelayWrite(dev); -} - - -void zfHpSetBasicRateSet(zdev_t* dev, u16_t bRateBasic, u16_t gRateBasic) -{ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BASIC_RATE, bRateBasic - | ((u16_t)gRateBasic<<8)); - zfFlushDelayWrite(dev); -} - - -/* HT40 send by OFDM 6M */ -/* otherwise use reg 0x638 */ -void zfHpSetRTSCTSRate(zdev_t* dev, u32_t rate) -{ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_RTS_CTS_RATE, rate); - zfFlushDelayWrite(dev); -} - -void zfHpSetMacAddress(zdev_t* dev, u16_t* macAddr, u16_t macAddrId) -{ - if (macAddrId == 0) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_L, - (((u32_t)macAddr[1])<<16) | macAddr[0]); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_H, macAddr[2]); - } - else if (macAddrId <= 7) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_ACK_TABLE+((macAddrId-1)*8), - macAddr[0] + ((u32_t)macAddr[1]<<16)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_ACK_TABLE+((macAddrId-1)*8)+4, - macAddr[2]); - } - zfFlushDelayWrite(dev); -} - -void zfHpSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList, u8_t bAllMulticast) -{ - struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pList; - u8_t i; - u32_t value; - u32_t swRegMulHashValueH, swRegMulHashValueL; - - swRegMulHashValueH = 0x80000000; - swRegMulHashValueL = 0; - - if ( bAllMulticast ) - { - swRegMulHashValueH = swRegMulHashValueL = ~0; - } - else - { - for(i=0; i> 2; - - if ( value < 32 ) - { - swRegMulHashValueL |= (1 << value); - } - else - { - swRegMulHashValueH |= (1 << (value-32)); - } - } - } - - zfDelayWriteInternalReg(dev, ZM_MAC_REG_GROUP_HASH_TBL_L, - swRegMulHashValueL); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_GROUP_HASH_TBL_H, - swRegMulHashValueH); - zfFlushDelayWrite(dev); - return; -} - -/******************** Beacon ********************/ -void zfHpEnableBeacon(zdev_t* dev, u16_t mode, u16_t bcnInterval, u16_t dtim, u8_t enableAtim) -{ - u32_t value; - - zmw_get_wlan_dev(dev); - - /* Beacon Ready */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_CTRL, 0); - /* Beacon DMA buffer address */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_ADDR, ZM_BEACON_BUFFER_ADDRESS); - - value = bcnInterval; - - value |= (((u32_t) dtim) << 16); - - if (mode == ZM_MODE_AP) - { - - value |= 0x1000000; - } - else if (mode == ZM_MODE_IBSS) - { - value |= 0x2000000; - - if ( enableAtim ) - { - value |= 0x4000000; - } - ((struct zsHpPriv*)wd->hpPrivate)->ibssBcnEnabled = 1; - ((struct zsHpPriv*)wd->hpPrivate)->ibssBcnInterval = value; - } - zfDelayWriteInternalReg(dev, ZM_MAC_REG_PRETBTT, (bcnInterval-6)<<16); - - /* Beacon period and beacon enable */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, value); - zfFlushDelayWrite(dev); -} - -void zfHpDisableBeacon(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - ((struct zsHpPriv*)wd->hpPrivate)->ibssBcnEnabled = 0; - - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, 0); - zfFlushDelayWrite(dev); -} - -void zfHpLedCtrl(zdev_t* dev, u16_t ledId, u8_t mode) -{ - u16_t state; - zmw_get_wlan_dev(dev); - - //zm_debug_msg1("LED ID=", ledId); - //zm_debug_msg1("LED mode=", mode); - if (ledId < 2) - { - if (((struct zsHpPriv*)wd->hpPrivate)->ledMode[ledId] != mode) - { - ((struct zsHpPriv*)wd->hpPrivate)->ledMode[ledId] = mode; - - state = ((struct zsHpPriv*)wd->hpPrivate)->ledMode[0] - | (((struct zsHpPriv*)wd->hpPrivate)->ledMode[1]<<1); - zfDelayWriteInternalReg(dev, 0x1d0104, state); - zfFlushDelayWrite(dev); - //zm_debug_msg0("Update LED"); - } - } -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfHpResetTxRx */ -/* Reset Tx and Rx Desc. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Chao-Wen Yang ZyDAS Technology Corporation 2007.3 */ -/* */ -/************************************************************************/ -u16_t zfHpUsbReset(zdev_t* dev) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t ret = 0; - - //zm_debug_msg0("CWY - Reset Tx and Rx"); - - cmd[0] = 0 | (ZM_CMD_RESET << 8); - - ret = zfIssueCmd(dev, cmd, 4, ZM_OID_INTERNAL_WRITE, NULL); - return ret; -} - -u16_t zfHpDKReset(zdev_t* dev, u8_t flag) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t ret = 0; - - //zm_debug_msg0("CWY - Reset Tx and Rx"); - - cmd[0] = 4 | (ZM_CMD_DKRESET << 8); - cmd[1] = flag; - - ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, NULL); - return ret; -} - -u32_t zfHpCwmUpdate(zdev_t* dev) -{ - //u32_t cmd[3]; - //u16_t ret; - // - //cmd[0] = 0x00000008; - //cmd[1] = 0x1c36e8; - //cmd[2] = 0x1c36ec; - // - //ret = zfIssueCmd(dev, cmd, 12, ZM_CWM_READ, 0); - //return ret; - - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - zfCoreCwmBusy(dev, zfCwmIsExtChanBusy(hpPriv->ctlBusy, hpPriv->extBusy)); - - hpPriv->ctlBusy = 0; - hpPriv->extBusy = 0; - - return 0; -} - -u32_t zfHpAniUpdate(zdev_t* dev) -{ - u32_t cmd[5]; - u16_t ret; - - cmd[0] = 0x00000010; - cmd[1] = 0x1c36e8; - cmd[2] = 0x1c36ec; - cmd[3] = 0x1c3cb4; - cmd[4] = 0x1c3cb8; - - ret = zfIssueCmd(dev, cmd, 20, ZM_ANI_READ, 0); - return ret; -} - -/* - * Update Beacon RSSI in ANI - */ -u32_t zfHpAniUpdateRssi(zdev_t* dev, u8_t rssi) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - hpPriv->stats.ast_nodestats.ns_avgbrssi = rssi; - - return 0; -} - -#define ZM_SEEPROM_MAC_ADDRESS_OFFSET (0x1400 + (0x106<<1)) -#define ZM_SEEPROM_REGDOMAIN_OFFSET (0x1400 + (0x104<<1)) -#define ZM_SEEPROM_VERISON_OFFSET (0x1400 + (0x102<<1)) -#define ZM_SEEPROM_HARDWARE_TYPE_OFFSET (0x1374) -#define ZM_SEEPROM_HW_HEAVY_CLIP (0x161c) - -u32_t zfHpGetMacAddress(zdev_t* dev) -{ - u32_t cmd[7]; - u16_t ret; - - cmd[0] = 0x00000000 | 24; - cmd[1] = ZM_SEEPROM_MAC_ADDRESS_OFFSET; - cmd[2] = ZM_SEEPROM_MAC_ADDRESS_OFFSET+4; - cmd[3] = ZM_SEEPROM_REGDOMAIN_OFFSET; - cmd[4] = ZM_SEEPROM_VERISON_OFFSET; - cmd[5] = ZM_SEEPROM_HARDWARE_TYPE_OFFSET; - cmd[6] = ZM_SEEPROM_HW_HEAVY_CLIP; - - ret = zfIssueCmd(dev, cmd, 28, ZM_MAC_READ, 0); - return ret; -} - -u32_t zfHpGetTransmitPower(zdev_t* dev) -{ - struct zsHpPriv* hpPriv; - u16_t tpc = 0; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - if (hpPriv->hwFrequency < 3000) { - tpc = hpPriv->tPow2x2g[0] & 0x3f; - wd->maxTxPower2 &= 0x3f; - tpc = (tpc > wd->maxTxPower2)? wd->maxTxPower2 : tpc; - } else { - tpc = hpPriv->tPow2x5g[0] & 0x3f; - wd->maxTxPower5 &= 0x3f; - tpc = (tpc > wd->maxTxPower5)? wd->maxTxPower5 : tpc; - } - - return tpc; -} - -u8_t zfHpGetMinTxPower(zdev_t* dev) -{ - struct zsHpPriv* hpPriv; - u8_t tpc = 0; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - if (hpPriv->hwFrequency < 3000) - { - if(wd->BandWidth40) - { - //40M - tpc = (hpPriv->tPow2x2gHt40[7]&0x3f); - } - else - { - //20M - tpc = (hpPriv->tPow2x2gHt20[7]&0x3f); - } - } - else - { - if(wd->BandWidth40) - { - //40M - tpc = (hpPriv->tPow2x5gHt40[7]&0x3f); - } - else - { - //20M - tpc = (hpPriv->tPow2x5gHt20[7]&0x3f); - } - } - - return tpc; -} - -u8_t zfHpGetMaxTxPower(zdev_t* dev) -{ - struct zsHpPriv* hpPriv; - u8_t tpc = 0; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - if (hpPriv->hwFrequency < 3000) - { - tpc = (hpPriv->tPow2xCck[0]&0x3f); - } - else - { - tpc =(hpPriv->tPow2x5g[0]&0x3f); - } - - return tpc; -} - -u32_t zfHpLoadEEPROMFromFW(zdev_t* dev) -{ - u32_t cmd[16]; - u32_t ret=0, i, j; - zmw_get_wlan_dev(dev); - - i = ((struct zsHpPriv*)wd->hpPrivate)->eepromImageRdReq; - - cmd[0] = ZM_HAL_MAX_EEPROM_PRQ*4; - - for (j=0; jhpPrivate; - - /* Workaround : Make OTUS fire more beacon in ad hoc mode in 2.4GHz */ - if (hpPriv->ibssBcnEnabled != 0) - { - if (hpPriv->hwFrequency <= ZM_CH_G_14) - { - if ((wd->tick % 10) == 0) - { - if ((wd->tick % 40) == 0) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, hpPriv->ibssBcnInterval-1); - polluted = 1; - } - else - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, hpPriv->ibssBcnInterval); - polluted = 1; - } - } - } - } - - if ((wd->tick & 0x3f) == 0x25) - { - /* Workaround for beacon stuck after SW reset */ - if (hpPriv->ibssBcnEnabled != 0) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_ADDR, ZM_BEACON_BUFFER_ADDRESS); - polluted = 1; - } - - //DbgPrint("hpPriv->aggMaxDurationBE=%d", hpPriv->aggMaxDurationBE); - //DbgPrint("wd->sta.avgSizeOfReceivePackets=%d", wd->sta.avgSizeOfReceivePackets); - if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - && (zfStaIsConnected(dev)) - && (wd->sta.EnableHT == 1) //11n mode - && (wd->BandWidth40 == 1) //40MHz mode - && (wd->sta.enableDrvBA ==0) //Marvel AP - && (hpPriv->aggMaxDurationBE > 2000) //BE TXOP > 2ms - && (wd->sta.avgSizeOfReceivePackets > 1420)) - { - zfDelayWriteInternalReg(dev, 0x1c3b9c, 0x8000a); - polluted = 1; - } - else - { - zfDelayWriteInternalReg(dev, 0x1c3b9c, hpPriv->aggPktNum); - polluted = 1; - } - - if (wd->dynamicSIFSEnable == 0) - { - if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - && (zfStaIsConnected(dev)) - && (wd->sta.EnableHT == 1) //11n mode - && (wd->BandWidth40 == 0) //20MHz mode - && (wd->sta.enableDrvBA ==0)) //Marvel AP - { - zfDelayWriteInternalReg(dev, 0x1c3698, 0x5144000); - polluted = 1; - } - else - { - zfDelayWriteInternalReg(dev, 0x1c3698, 0xA144000); - polluted = 1; - } - } - else - { - if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - && (zfStaIsConnected(dev)) - && (wd->sta.EnableHT == 1) //11n mode - && (wd->sta.athOwlAp == 1)) //Atheros AP - { - if (hpPriv->retransmissionEvent) - { - switch(hpPriv->latestSIFS) - { - case 0: - hpPriv->latestSIFS = 1; - zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0x8144000); - break; - case 1: - hpPriv->latestSIFS = 2; - zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xa144000); - break; - case 2: - hpPriv->latestSIFS = 3; - zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xc144000); - break; - case 3: - hpPriv->latestSIFS = 0; - zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xa144000); - break; - default: - hpPriv->latestSIFS = 0; - zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xa144000); - break; - } - polluted = 1; - zm_debug_msg1("##### Correct Tx retransmission issue #####, ", hpPriv->latestSIFS); - hpPriv->retransmissionEvent = 0; - } - } - else - { - hpPriv->latestSIFS = 0; - hpPriv->retransmissionEvent = 0; - zfDelayWriteInternalReg(dev, 0x1c3698, 0xA144000); - polluted = 1; - } - } - - if ((wd->sta.bScheduleScan == FALSE) && (wd->sta.bChannelScan == FALSE)) - { -#define ZM_SIGNAL_THRESHOLD 66 - if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - && (zfStaIsConnected(dev)) - && (wd->SignalStrength > ZM_SIGNAL_THRESHOLD)) - { - /* remove state handle, always rewrite register setting */ - //if (hpPriv->strongRSSI == 0) - { - hpPriv->strongRSSI = 1; - /* Strong RSSI, set ACK to one Tx stream and lower Tx power 7dbm */ - if (hpPriv->currentAckRtsTpc > (14+10)) - { - ackTpc = hpPriv->currentAckRtsTpc - 14; - } - else - { - ackTpc = 10; - } - zfDelayWriteInternalReg(dev, 0x1c3694, ((ackTpc) << 20) | (0x1<<26)); - zfDelayWriteInternalReg(dev, 0x1c3bb4, ((ackTpc) << 5 ) | (0x1<<11) | - ((ackTpc) << 21) | (0x1<<27) ); - polluted = 1; - } - } - else - { - /* remove state handle, always rewrite register setting */ - //if (hpPriv->strongRSSI == 1) - { - hpPriv->strongRSSI = 0; - if (hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM) - { - zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->currentAckRtsTpc&0x3f) << 20) | (0x1<<26)); - zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->currentAckRtsTpc&0x3f) << 5 ) | (0x1<<11) | - ((hpPriv->currentAckRtsTpc&0x3f) << 21) | (0x1<<27) ); - } - else - { - zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->currentAckRtsTpc&0x3f) << 20) | (0x5<<26)); - zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->currentAckRtsTpc&0x3f) << 5 ) | (0x5<<11) | - ((hpPriv->currentAckRtsTpc&0x3f) << 21) | (0x5<<27) ); - } - polluted = 1; - } - } -#undef ZM_SIGNAL_THRESHOLD - } - - if ((hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM) == 0) - { - if ((wd->sta.bScheduleScan == FALSE) && (wd->sta.bChannelScan == FALSE)) - { - #define ZM_RX_SIGNAL_THRESHOLD_H 71 - #define ZM_RX_SIGNAL_THRESHOLD_L 66 - u8_t rxSignalThresholdH = ZM_RX_SIGNAL_THRESHOLD_H; - u8_t rxSignalThresholdL = ZM_RX_SIGNAL_THRESHOLD_L; - #undef ZM_RX_SIGNAL_THRESHOLD_H - #undef ZM_RX_SIGNAL_THRESHOLD_L - - if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - && (zfStaIsConnected(dev)) - && (wd->SignalStrength > rxSignalThresholdH) - )//&& (hpPriv->rxStrongRSSI == 0)) - { - hpPriv->rxStrongRSSI = 1; - //zfDelayWriteInternalReg(dev, 0x1c5964, 0x1220); - //zfDelayWriteInternalReg(dev, 0x1c5960, 0x900); - //zfDelayWriteInternalReg(dev, 0x1c6960, 0x900); - //zfDelayWriteInternalReg(dev, 0x1c7960, 0x900); - if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE - { - if (hpPriv->hwFrequency <= ZM_CH_G_14) - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x900); - } - else - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b49); - } - } - else - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x0900); - } - polluted = 1; - } - else if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - && (zfStaIsConnected(dev)) - && (wd->SignalStrength > rxSignalThresholdL) - )//&& (hpPriv->rxStrongRSSI == 1)) - { - //Do nothing to prevent frequently Rx switching - } - else - { - /* remove state handle, always rewrite register setting */ - //if (hpPriv->rxStrongRSSI == 1) - { - hpPriv->rxStrongRSSI = 0; - //zfDelayWriteInternalReg(dev, 0x1c5964, 0x1120); - //zfDelayWriteInternalReg(dev, 0x1c5960, 0x9b40); - //zfDelayWriteInternalReg(dev, 0x1c6960, 0x9b40); - //zfDelayWriteInternalReg(dev, 0x1c7960, 0x9b40); - if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE - { - if (hpPriv->hwFrequency <= ZM_CH_G_14) - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b49); - } - else - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x0900); - } - } - else - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b40); - } - polluted = 1; - } - } - - } - } - - if (hpPriv->usbAcSendBytes[3] > (hpPriv->usbAcSendBytes[0]*2)) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, hpPriv->txop[3]); - polluted = 1; - } - else if (hpPriv->usbAcSendBytes[2] > (hpPriv->usbAcSendBytes[0]*2)) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, hpPriv->txop[2]); - polluted = 1; - } - else if (hpPriv->usbAcSendBytes[1] > (hpPriv->usbAcSendBytes[0]*2)) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, hpPriv->cwmin[1]+((u32_t)hpPriv->cwmax[1]<<16)); - polluted = 1; - } - else - { - if (hpPriv->slotType == 1) - { - if ((wd->sta.enableDrvBA ==0) //Marvel AP - && (hpPriv->aggMaxDurationBE > 2000)) //BE TXOP > 2ms - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, (hpPriv->cwmin[0]/2)+((u32_t)hpPriv->cwmax[0]<<16)); - } - else - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, hpPriv->cwmin[0]+((u32_t)hpPriv->cwmax[0]<<16)); - } - polluted = 1; - } - else - { - /* Compensation for 20us slot time */ - //zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, 58+((u32_t)hpPriv->cwmax[0]<<16)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, hpPriv->cwmin[0]+((u32_t)hpPriv->cwmax[0]<<16)); - polluted = 1; - } - - if ((wd->sta.SWEncryptEnable & (ZM_SW_TKIP_ENCRY_EN|ZM_SW_WEP_ENCRY_EN)) == 0) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, hpPriv->txop[0]); - polluted = 1; - } - else - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, 0x30); - polluted = 1; - } - - } - hpPriv->usbAcSendBytes[3] = 0; - hpPriv->usbAcSendBytes[2] = 0; - hpPriv->usbAcSendBytes[1] = 0; - hpPriv->usbAcSendBytes[0] = 0; - } - - if (polluted == 1) - { - zfFlushDelayWrite(dev); - } - - return; -} - -/* - * 0x1d4008 : AHB, DAC, ADC clock selection - * bit1~0 AHB_CLK : AHB clock selection, - * 00 : OSC 40MHz; - * 01 : 20MHz in A mode, 22MHz in G mode; - * 10 : 40MHz in A mode, 44MHz in G mode; - * 11 : 80MHz in A mode, 88MHz in G mode. - * bit3~2 CLK_SEL : Select the clock source of clk160 in ADDAC. - * 00 : PLL divider's output; - * 01 : PLL divider's output divided by 2; - * 10 : PLL divider's output divided by 4; - * 11 : REFCLK from XTALOSCPAD. - */ -void zfSelAdcClk(zdev_t* dev, u8_t bw40, u32_t frequency) -{ - if(bw40 == 1) - { - //zfDelayWriteInternalReg(dev, 0x1D4008, 0x73); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_DYNAMIC_SIFS_ACK, 0x10A); - zfFlushDelayWrite(dev); - } - else - { - //zfDelayWriteInternalReg(dev, 0x1D4008, 0x70); - if ( frequency <= ZM_CH_G_14 ) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_DYNAMIC_SIFS_ACK, 0x105); - } - else - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_DYNAMIC_SIFS_ACK, 0x104); - } - zfFlushDelayWrite(dev); - } -} - -u32_t zfHpEchoCommand(zdev_t* dev, u32_t value) -{ - u32_t cmd[2]; - u16_t ret; - - cmd[0] = 0x00008004; - cmd[1] = value; - - ret = zfIssueCmd(dev, cmd, 8, ZM_CMD_ECHO, NULL); - return ret; -} - -#ifdef ZM_DRV_INIT_USB_MODE - -#define ZM_USB_US_STREAM_MODE 0x00000000 -#define ZM_USB_US_PACKET_MODE 0x00000008 -#define ZM_USB_DS_ENABLE 0x00000001 -#define ZM_USB_US_ENABLE 0x00000002 - -#define ZM_USB_RX_STREAM_4K 0x00000000 -#define ZM_USB_RX_STREAM_8K 0x00000010 -#define ZM_USB_RX_STREAM_16K 0x00000020 -#define ZM_USB_RX_STREAM_32K 0x00000030 - -#define ZM_USB_TX_STREAM_MODE 0x00000040 - -#define ZM_USB_MODE_CTRL_REG 0x001E1108 - -void zfInitUsbMode(zdev_t* dev) -{ - u32_t mode; - zmw_get_wlan_dev(dev); - - /* TODO: Set USB mode by reading registery */ - mode = ZM_USB_DS_ENABLE | ZM_USB_US_ENABLE | ZM_USB_US_PACKET_MODE; - - zfDelayWriteInternalReg(dev, ZM_USB_MODE_CTRL_REG, mode); - zfFlushDelayWrite(dev); -} -#endif - -void zfDumpEepBandEdges(struct ar5416Eeprom* eepromImage); -void zfPrintTargetPower2G(u8_t* tPow2xCck, u8_t* tPow2x2g, u8_t* tPow2x2gHt20, u8_t* tPow2x2gHt40); -void zfPrintTargetPower5G(u8_t* tPow2x5g, u8_t* tPow2x5gHt20, u8_t* tPow2x5gHt40); - - -s32_t zfInterpolateFunc(s32_t x, s32_t x1, s32_t y1, s32_t x2, s32_t y2) -{ - s32_t y; - - if (y2 == y1) - { - y = y1; - } - else if (x == x1) - { - y = y1; - } - else if (x == x2) - { - y = y2; - } - else if (x2 != x1) - { - y = y1 + (((y2-y1) * (x-x1))/(x2-x1)); - } - else - { - y = y1; - } - - return y; -} - -//#define ZM_ENABLE_TPC_WINDOWS_DEBUG -//#define ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - -/* the tx power offset workaround for ART vs NDIS/MDK */ -#define HALTX_POWER_OFFSET 0 - -u8_t zfInterpolateFuncX(u8_t x, u8_t x1, u8_t y1, u8_t x2, u8_t y2) -{ - s32_t y; - s32_t inc; - - #define ZM_MULTIPLIER 8 - y = zfInterpolateFunc((s32_t)x<> (ZM_MULTIPLIER-1); - y = (y >> ZM_MULTIPLIER) + inc; - #undef ZM_MULTIPLIER - - return (u8_t)y; -} - -u8_t zfGetInterpolatedValue(u8_t x, u8_t* x_array, u8_t* y_array) -{ - s32_t y; - u16_t xIndex; - - if (x <= x_array[1]) - { - xIndex = 0; - } - else if (x <= x_array[2]) - { - xIndex = 1; - } - else if (x <= x_array[3]) - { - xIndex = 2; - } - else //(x > x_array[3]) - { - xIndex = 3; - } - - y = zfInterpolateFuncX(x, - x_array[xIndex], - y_array[xIndex], - x_array[xIndex+1], - y_array[xIndex+1]); - - return (u8_t)y; -} - -u8_t zfFindFreqIndex(u8_t f, u8_t* fArray, u8_t fArraySize) -{ - u8_t i; -#ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("f=%d ", f); - for (i=0; i= fArray[i]) - { - return i; - } - if (i!=0) - { - i--; - } - else - { - return 0; - } - } -} - - - - -void zfInitPowerCal(zdev_t* dev) -{ - //Program PHY Tx power relatives registers -#define zm_write_phy_reg(cr, val) reg_write((cr*4)+0x9800, val) - - zm_write_phy_reg(79, 0x7f); - zm_write_phy_reg(77, 0x3f3f3f3f); - zm_write_phy_reg(78, 0x3f3f3f3f); - zm_write_phy_reg(653, 0x3f3f3f3f); - zm_write_phy_reg(654, 0x3f3f3f3f); - zm_write_phy_reg(739, 0x3f3f3f3f); - zm_write_phy_reg(740, 0x3f3f3f3f); - zm_write_phy_reg(755, 0x3f3f3f3f); - zm_write_phy_reg(756, 0x3f3f3f3f); - zm_write_phy_reg(757, 0x3f3f3f3f); - -#undef zm_write_phy_reg -} - - - -void zfPrintTp(u8_t* pwr0, u8_t* vpd0, u8_t* pwr1, u8_t* vpd1) -{ - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("pwr0 : %d, %d, %d, %d ,%d\n", pwr0[0], pwr0[1], pwr0[2], pwr0[3], pwr0[4]); - DbgPrint("vpd0 : %d, %d, %d, %d ,%d\n", vpd0[0], vpd0[1], vpd0[2], vpd0[3], vpd0[4]); - DbgPrint("pwr1 : %d, %d, %d, %d ,%d\n", pwr1[0], pwr1[1], pwr1[2], pwr1[3], pwr1[4]); - DbgPrint("vpd1 : %d, %d, %d, %d ,%d\n", vpd1[0], vpd1[1], vpd1[2], vpd1[3], vpd1[4]); - #endif -} - - -/* - * To find CTL index(0~23) - * return 24(AR5416_NUM_CTLS)=>no desired index found - */ -u8_t zfFindCtlEdgesIndex(zdev_t* dev, u8_t desired_CtlIndex) -{ - u8_t i; - struct zsHpPriv* hpPriv; - struct ar5416Eeprom* eepromImage; - - zmw_get_wlan_dev(dev); - - hpPriv = wd->hpPrivate; - - eepromImage = (struct ar5416Eeprom*)&(hpPriv->eepromImage[(1024+512)/4]); - - //for (i = 0; (i < AR5416_NUM_CTLS) && eepromImage->ctlIndex[i]; i++) - for (i = 0; i < AR5416_NUM_CTLS; i++) - { - if(desired_CtlIndex == eepromImage->ctlIndex[i]) - break; - } - return i; -} - -/************************************************************************** - * fbin2freq - * - * Get channel value from binary representation held in eeprom - * RETURNS: the frequency in MHz - */ -u32_t -fbin2freq(u8_t fbin, u8_t is2GHz) -{ - /* - * Reserved value 0xFF provides an empty definition both as - * an fbin and as a frequency - do not convert - */ - if (fbin == AR5416_BCHAN_UNUSED) { - return fbin; - } - - return (u32_t)((is2GHz==1) ? (2300 + fbin) : (4800 + 5 * fbin)); -} - - -u8_t zfGetMaxEdgePower(zdev_t* dev, CAL_CTL_EDGES *pCtlEdges, u32_t freq) -{ - u8_t i; - u8_t maxEdgePower; - u8_t is2GHz; - struct zsHpPriv* hpPriv; - struct ar5416Eeprom* eepromImage; - - zmw_get_wlan_dev(dev); - - hpPriv = wd->hpPrivate; - - eepromImage = (struct ar5416Eeprom*)&(hpPriv->eepromImage[(1024+512)/4]); - - if(freq > ZM_CH_G_14) - is2GHz = 0; - else - is2GHz = 1; - - maxEdgePower = AR5416_MAX_RATE_POWER; - - /* Get the edge power */ - for (i = 0; (i < AR5416_NUM_BAND_EDGES) && (pCtlEdges[i].bChannel != AR5416_BCHAN_UNUSED) ; i++) - { - /* - * If there's an exact channel match or an inband flag set - * on the lower channel use the given rdEdgePower - */ - if (freq == fbin2freq(pCtlEdges[i].bChannel, is2GHz)) - { - maxEdgePower = pCtlEdges[i].tPower; - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("zfGetMaxEdgePower index i = %d \n", i)); - #endif - break; - } - else if ((i > 0) && (freq < fbin2freq(pCtlEdges[i].bChannel, is2GHz))) - { - if (fbin2freq(pCtlEdges[i - 1].bChannel, is2GHz) < freq && pCtlEdges[i - 1].flag) - { - maxEdgePower = pCtlEdges[i - 1].tPower; - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("zfGetMaxEdgePower index i-1 = %d \n", i-1)); - #endif - } - /* Leave loop - no more affecting edges possible in this monotonic increasing list */ - break; - } - - } - - if( i == AR5416_NUM_BAND_EDGES ) - { - if (freq > fbin2freq(pCtlEdges[i - 1].bChannel, is2GHz) && pCtlEdges[i - 1].flag) - { - maxEdgePower = pCtlEdges[i - 1].tPower; - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("zfGetMaxEdgePower index=>i-1 = %d \n", i-1)); - #endif - } - } - - zm_assert(maxEdgePower > 0); - - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - if ( maxEdgePower == AR5416_MAX_RATE_POWER ) - { - zm_dbg(("zfGetMaxEdgePower = %d !!!\n", AR5416_MAX_RATE_POWER)); - } - #endif - return maxEdgePower; -} - -u32_t zfAdjustHT40FreqOffset(zdev_t* dev, u32_t frequency, u8_t bw40, u8_t extOffset) -{ - u32_t newFreq = frequency; - - if (bw40 == 1) - { - if (extOffset == 1) - { - newFreq += 10; - } - else - { - newFreq -= 10; - } - } - return newFreq; -} - -u32_t zfHpCheckDoHeavyClip(zdev_t* dev, u32_t freq, CAL_CTL_EDGES *pCtlEdges, u8_t bw40) -{ - u32_t ret = 0; - u8_t i; - u8_t is2GHz; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - - hpPriv = wd->hpPrivate; - - if(freq > ZM_CH_G_14) - is2GHz = 0; - else - is2GHz = 1; - - /* HT40 force enable heavy clip */ - if (bw40) - { - ret |= 0xf0; - } -#if 1 - /* HT20 : frequency bandedge */ - for (i = 0; (i < AR5416_NUM_BAND_EDGES) && (pCtlEdges[i].bChannel != AR5416_BCHAN_UNUSED) ; i++) - { - if (freq == fbin2freq(pCtlEdges[i].bChannel, is2GHz)) - { - if (pCtlEdges[i].flag == 0) - { - ret |= 0xf; - } - break; - } - } -#endif - - return ret; -} - - -void zfSetPowerCalTable(zdev_t* dev, u32_t frequency, u8_t bw40, u8_t extOffset) -{ - struct ar5416Eeprom* eepromImage; - u8_t pwr0[5]; - u8_t pwr1[5]; - u8_t vpd0[5]; - u8_t vpd1[5]; - u8_t vpd_chain1[128]; - u8_t vpd_chain3[128]; - u16_t boundary1 = 18; //CR 667 - u16_t powerTxMax = 63; //CR 79 - u8_t i; - struct zsHpPriv* hpPriv; - u8_t fbin; - u8_t index, max2gIndex, max5gIndex; - u8_t chain0pwrPdg0[5]; - u8_t chain0vpdPdg0[5]; - u8_t chain0pwrPdg1[5]; - u8_t chain0vpdPdg1[5]; - u8_t chain2pwrPdg0[5]; - u8_t chain2vpdPdg0[5]; - u8_t chain2pwrPdg1[5]; - u8_t chain2vpdPdg1[5]; - u8_t fbinArray[8]; - - /* 4 CTL */ - u8_t ctl_i; - u8_t desired_CtlIndex; - - u8_t ctlEdgesMaxPowerCCK = AR5416_MAX_RATE_POWER; - u8_t ctlEdgesMaxPower2G = AR5416_MAX_RATE_POWER; - u8_t ctlEdgesMaxPower2GHT20 = AR5416_MAX_RATE_POWER; - u8_t ctlEdgesMaxPower2GHT40 = AR5416_MAX_RATE_POWER; - u8_t ctlEdgesMaxPower5G = AR5416_MAX_RATE_POWER; - u8_t ctlEdgesMaxPower5GHT20 = AR5416_MAX_RATE_POWER; - u8_t ctlEdgesMaxPower5GHT40 = AR5416_MAX_RATE_POWER; - - u8_t ctlOffset; - - zmw_get_wlan_dev(dev); - - hpPriv = wd->hpPrivate; - - eepromImage = (struct ar5416Eeprom*)&(hpPriv->eepromImage[(1024+512)/4]); - - // Check the total bytes of the EEPROM structure to see the dongle have been calibrated or not. - if (eepromImage->baseEepHeader.length == 0xffff) - { - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("Warning! This dongle not been calibrated\n")); - #endif - return; - } - - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("-----zfSetPowerCalTable : frequency=%d-----\n", frequency); - #endif - /* TODO : 1. boundary1 and powerTxMax should be refered to CR667 and CR79 */ - /* in otus.ini file */ - - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - /* 2. Interpolate pwr and vpd test points from frequency */ - DbgPrint("calFreqPier5G : %d, %d, %d, %d ,%d, %d, %d, %d\n", - eepromImage->calFreqPier5G[0]*5+4800, - eepromImage->calFreqPier5G[1]*5+4800, - eepromImage->calFreqPier5G[2]*5+4800, - eepromImage->calFreqPier5G[3]*5+4800, - eepromImage->calFreqPier5G[4]*5+4800, - eepromImage->calFreqPier5G[5]*5+4800, - eepromImage->calFreqPier5G[6]*5+4800, - eepromImage->calFreqPier5G[7]*5+4800 - ); - DbgPrint("calFreqPier2G : %d, %d, %d, %d\n", - eepromImage->calFreqPier2G[0]+2300, - eepromImage->calFreqPier2G[1]+2300, - eepromImage->calFreqPier2G[2]+2300, - eepromImage->calFreqPier2G[3]+2300 - ); - #endif - if (frequency < 3000) - { - for (i=0; i<4; i++) - { - if (eepromImage->calFreqPier2G[i] == 0xff) - { - break; - } - } - max2gIndex = i; - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("max2gIndex : %d\n", max2gIndex); - #endif - fbin = (u8_t)(frequency - 2300); - index = zfFindFreqIndex(fbin, eepromImage->calFreqPier2G, max2gIndex); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("2G index : %d\n", index); - DbgPrint("chain 0 index\n"); - #endif - zfPrintTp(&eepromImage->calPierData2G[0][index].pwrPdg[0][0], - &eepromImage->calPierData2G[0][index].vpdPdg[0][0], - &eepromImage->calPierData2G[0][index].pwrPdg[1][0], - &eepromImage->calPierData2G[0][index].vpdPdg[1][0] - ); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("chain 0 index+1\n"); - #endif - zfPrintTp(&eepromImage->calPierData2G[0][index+1].pwrPdg[0][0], - &eepromImage->calPierData2G[0][index+1].vpdPdg[0][0], - &eepromImage->calPierData2G[0][index+1].pwrPdg[1][0], - &eepromImage->calPierData2G[0][index+1].vpdPdg[1][0] - ); - - for (i=0; i<5; i++) - { - chain0pwrPdg0[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier2G[index], - eepromImage->calPierData2G[0][index].pwrPdg[0][i], - eepromImage->calFreqPier2G[index+1], - eepromImage->calPierData2G[0][index+1].pwrPdg[0][i] - ); - chain0vpdPdg0[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier2G[index], - eepromImage->calPierData2G[0][index].vpdPdg[0][i], - eepromImage->calFreqPier2G[index+1], - eepromImage->calPierData2G[0][index+1].vpdPdg[0][i] - ); - chain0pwrPdg1[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier2G[index], - eepromImage->calPierData2G[0][index].pwrPdg[1][i], - eepromImage->calFreqPier2G[index+1], - eepromImage->calPierData2G[0][index+1].pwrPdg[1][i] - ); - chain0vpdPdg1[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier2G[index], - eepromImage->calPierData2G[0][index].vpdPdg[1][i], - eepromImage->calFreqPier2G[index+1], - eepromImage->calPierData2G[0][index+1].vpdPdg[1][i] - ); - - chain2pwrPdg0[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier2G[index], - eepromImage->calPierData2G[1][index].pwrPdg[0][i], - eepromImage->calFreqPier2G[index+1], - eepromImage->calPierData2G[1][index+1].pwrPdg[0][i] - ); - chain2vpdPdg0[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier2G[index], - eepromImage->calPierData2G[1][index].vpdPdg[0][i], - eepromImage->calFreqPier2G[index+1], - eepromImage->calPierData2G[1][index+1].vpdPdg[0][i] - ); - chain2pwrPdg1[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier2G[index], - eepromImage->calPierData2G[1][index].pwrPdg[1][i], - eepromImage->calFreqPier2G[index+1], - eepromImage->calPierData2G[1][index+1].pwrPdg[1][i] - ); - chain2vpdPdg1[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier2G[index], - eepromImage->calPierData2G[1][index].vpdPdg[1][i], - eepromImage->calFreqPier2G[index+1], - eepromImage->calPierData2G[1][index+1].vpdPdg[1][i] - ); - } - } - else - { - for (i=0; i<8; i++) - { - if (eepromImage->calFreqPier5G[i] == 0xff) - { - break; - } - } - max5gIndex = i; - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("max5gIndex : %d\n", max5gIndex); - #endif - fbin = (u8_t)((frequency - 4800)/5); - index = zfFindFreqIndex(fbin, eepromImage->calFreqPier5G, max5gIndex); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("5G index : %d\n", index); - #endif - - for (i=0; i<5; i++) - { - chain0pwrPdg0[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier5G[index], - eepromImage->calPierData5G[0][index].pwrPdg[0][i], - eepromImage->calFreqPier5G[index+1], - eepromImage->calPierData5G[0][index+1].pwrPdg[0][i] - ); - chain0vpdPdg0[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier5G[index], - eepromImage->calPierData5G[0][index].vpdPdg[0][i], - eepromImage->calFreqPier5G[index+1], - eepromImage->calPierData5G[0][index+1].vpdPdg[0][i] - ); - chain0pwrPdg1[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier5G[index], - eepromImage->calPierData5G[0][index].pwrPdg[1][i], - eepromImage->calFreqPier5G[index+1], - eepromImage->calPierData5G[0][index+1].pwrPdg[1][i] - ); - chain0vpdPdg1[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier5G[index], - eepromImage->calPierData5G[0][index].vpdPdg[1][i], - eepromImage->calFreqPier5G[index+1], - eepromImage->calPierData5G[0][index+1].vpdPdg[1][i] - ); - - chain2pwrPdg0[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier5G[index], - eepromImage->calPierData5G[1][index].pwrPdg[0][i], - eepromImage->calFreqPier5G[index+1], - eepromImage->calPierData5G[1][index+1].pwrPdg[0][i] - ); - chain2vpdPdg0[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier5G[index], - eepromImage->calPierData5G[1][index].vpdPdg[0][i], - eepromImage->calFreqPier5G[index+1], - eepromImage->calPierData5G[1][index+1].vpdPdg[0][i] - ); - chain2pwrPdg1[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier5G[index], - eepromImage->calPierData5G[1][index].pwrPdg[1][i], - eepromImage->calFreqPier5G[index+1], - eepromImage->calPierData5G[1][index+1].pwrPdg[1][i] - ); - chain2vpdPdg1[i] = zfInterpolateFuncX(fbin, - eepromImage->calFreqPier5G[index], - eepromImage->calPierData5G[1][index].vpdPdg[1][i], - eepromImage->calFreqPier5G[index+1], - eepromImage->calPierData5G[1][index+1].vpdPdg[1][i] - ); - } - - } - - - /* Chain 1 */ - /* Get pwr and vpd test points from frequency */ - for (i=0; i<5; i++) - { - pwr0[i] = chain0pwrPdg0[i]>>1; - vpd0[i] = chain0vpdPdg0[i]; - pwr1[i] = chain0pwrPdg1[i]>>1; - vpd1[i] = chain0vpdPdg1[i]; - } - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("Test Points\n"); - DbgPrint("pwr0 : %d, %d, %d, %d ,%d\n", pwr0[0], pwr0[1], pwr0[2], pwr0[3], pwr0[4]); - DbgPrint("vpd0 : %d, %d, %d, %d ,%d\n", vpd0[0], vpd0[1], vpd0[2], vpd0[3], vpd0[4]); - DbgPrint("pwr1 : %d, %d, %d, %d ,%d\n", pwr1[0], pwr1[1], pwr1[2], pwr1[3], pwr1[4]); - DbgPrint("vpd1 : %d, %d, %d, %d ,%d\n", vpd1[0], vpd1[1], vpd1[2], vpd1[3], vpd1[4]); - #endif - /* Generate the vpd arrays */ - for (i=0; i>1; - vpd0[i] = chain2vpdPdg0[i]; - pwr1[i] = chain2pwrPdg1[i]>>1; - vpd1[i] = chain2vpdPdg1[i]; - } - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("Test Points\n"); - DbgPrint("pwr0 : %d, %d, %d, %d ,%d\n", pwr0[0], pwr0[1], pwr0[2], pwr0[3], pwr0[4]); - DbgPrint("vpd0 : %d, %d, %d, %d ,%d\n", vpd0[0], vpd0[1], vpd0[2], vpd0[3], vpd0[4]); - DbgPrint("pwr1 : %d, %d, %d, %d ,%d\n", pwr1[0], pwr1[1], pwr1[2], pwr1[3], pwr1[4]); - DbgPrint("vpd1 : %d, %d, %d, %d ,%d\n", vpd1[0], vpd1[1], vpd1[2], vpd1[3], vpd1[4]); - #endif - /* Generate the vpd arrays */ - for (i=0; icalTargetPowerCck[i].bChannel != 0xff) - { - fbinArray[i] = eepromImage->calTargetPowerCck[i].bChannel; - } - else - { - break; - } - - } - index = zfFindFreqIndex(fbin, fbinArray, i); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("CCK index=%d\n", index); - #endif - for (i=0; i<4; i++) - { - hpPriv->tPow2xCck[i] = zfInterpolateFuncX(fbin, - eepromImage->calTargetPowerCck[index].bChannel, - eepromImage->calTargetPowerCck[index].tPow2x[i], - eepromImage->calTargetPowerCck[index+1].bChannel, - eepromImage->calTargetPowerCck[index+1].tPow2x[i] - ); - } - - for (i=0; i<4; i++) - { - if (eepromImage->calTargetPower2G[i].bChannel != 0xff) - { - fbinArray[i] = eepromImage->calTargetPower2G[i].bChannel; - } - else - { - break; - } - - } - index = zfFindFreqIndex(fbin, fbinArray, i); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("2G index=%d\n", index); - #endif - for (i=0; i<4; i++) - { - hpPriv->tPow2x2g[i] = zfInterpolateFuncX(fbin, - eepromImage->calTargetPower2G[index].bChannel, - eepromImage->calTargetPower2G[index].tPow2x[i], - eepromImage->calTargetPower2G[index+1].bChannel, - eepromImage->calTargetPower2G[index+1].tPow2x[i] - ); - } - - for (i=0; i<4; i++) - { - if (eepromImage->calTargetPower2GHT20[i].bChannel != 0xff) - { - fbinArray[i] = eepromImage->calTargetPower2GHT20[i].bChannel; - } - else - { - break; - } - - } - index = zfFindFreqIndex(fbin, fbinArray, i); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("2G HT20 index=%d\n", index); - #endif - for (i=0; i<8; i++) - { - hpPriv->tPow2x2gHt20[i] = zfInterpolateFuncX(fbin, - eepromImage->calTargetPower2GHT20[index].bChannel, - eepromImage->calTargetPower2GHT20[index].tPow2x[i], - eepromImage->calTargetPower2GHT20[index+1].bChannel, - eepromImage->calTargetPower2GHT20[index+1].tPow2x[i] - ); - } - - for (i=0; i<4; i++) - { - if (eepromImage->calTargetPower2GHT40[i].bChannel != 0xff) - { - fbinArray[i] = eepromImage->calTargetPower2GHT40[i].bChannel; - } - else - { - break; - } - - } - index = zfFindFreqIndex( (u8_t)zfAdjustHT40FreqOffset(dev, fbin, bw40, extOffset), fbinArray, i); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("2G HT40 index=%d\n", index); - #endif - for (i=0; i<8; i++) - { - hpPriv->tPow2x2gHt40[i] = zfInterpolateFuncX( - (u8_t)zfAdjustHT40FreqOffset(dev, fbin, bw40, extOffset), - eepromImage->calTargetPower2GHT40[index].bChannel, - eepromImage->calTargetPower2GHT40[index].tPow2x[i], - eepromImage->calTargetPower2GHT40[index+1].bChannel, - eepromImage->calTargetPower2GHT40[index+1].tPow2x[i] - ); - } - - zfPrintTargetPower2G(hpPriv->tPow2xCck, - hpPriv->tPow2x2g, - hpPriv->tPow2x2gHt20, - hpPriv->tPow2x2gHt40); - } - else - { - /* 5G */ - for (i=0; i<8; i++) - { - if (eepromImage->calTargetPower5G[i].bChannel != 0xff) - { - fbinArray[i] = eepromImage->calTargetPower5G[i].bChannel; - } - else - { - break; - } - - } - index = zfFindFreqIndex(fbin, fbinArray, i); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("5G index=%d\n", index); - #endif - for (i=0; i<4; i++) - { - hpPriv->tPow2x5g[i] = zfInterpolateFuncX(fbin, - eepromImage->calTargetPower5G[index].bChannel, - eepromImage->calTargetPower5G[index].tPow2x[i], - eepromImage->calTargetPower5G[index+1].bChannel, - eepromImage->calTargetPower5G[index+1].tPow2x[i] - ); - } - - for (i=0; i<8; i++) - { - if (eepromImage->calTargetPower5GHT20[i].bChannel != 0xff) - { - fbinArray[i] = eepromImage->calTargetPower5GHT20[i].bChannel; - } - else - { - break; - } - - } - index = zfFindFreqIndex(fbin, fbinArray, i); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("5G HT20 index=%d\n", index); - #endif - for (i=0; i<8; i++) - { - hpPriv->tPow2x5gHt20[i] = zfInterpolateFuncX(fbin, - eepromImage->calTargetPower5GHT20[index].bChannel, - eepromImage->calTargetPower5GHT20[index].tPow2x[i], - eepromImage->calTargetPower5GHT20[index+1].bChannel, - eepromImage->calTargetPower5GHT20[index+1].tPow2x[i] - ); - } - - for (i=0; i<8; i++) - { - if (eepromImage->calTargetPower5GHT40[i].bChannel != 0xff) - { - fbinArray[i] = eepromImage->calTargetPower5GHT40[i].bChannel; - } - else - { - break; - } - - } - index = zfFindFreqIndex((u8_t)zfAdjustHT40FreqOffset(dev, fbin, bw40, extOffset), fbinArray, i); - #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - DbgPrint("5G HT40 index=%d\n", index); - #endif - for (i=0; i<8; i++) - { - hpPriv->tPow2x5gHt40[i] = zfInterpolateFuncX( - (u8_t)zfAdjustHT40FreqOffset(dev, fbin, bw40, extOffset), - eepromImage->calTargetPower5GHT40[index].bChannel, - eepromImage->calTargetPower5GHT40[index].tPow2x[i], - eepromImage->calTargetPower5GHT40[index+1].bChannel, - eepromImage->calTargetPower5GHT40[index+1].tPow2x[i] - ); - } - - zfPrintTargetPower5G( - hpPriv->tPow2x5g, - hpPriv->tPow2x5gHt20, - hpPriv->tPow2x5gHt40); - } - - - - /* 4. CTL */ - /* - * 4.1 Get the bandedges tx power by frequency - * 2.4G we get ctlEdgesMaxPowerCCK - * ctlEdgesMaxPower2G - * ctlEdgesMaxPower2GHT20 - * ctlEdgesMaxPower2GHT40 - * 5G we get ctlEdgesMaxPower5G - * ctlEdgesMaxPower5GHT20 - * ctlEdgesMaxPower5GHT40 - * 4.2 Update (3.) target power table by 4.1 - * 4.3 Tx power offset for ART - NDIS/MDK - * 4.4 Write MAC reg 0x694 for ACK's TPC - * - */ - - //zfDumpEepBandEdges(eepromImage); - - /* get the cfg from Eeprom: regionCode => RegulatoryDomain : 0x10-FFC 0x30-eu 0x40-jap */ - desired_CtlIndex = zfHpGetRegulatoryDomain(dev); - if ((desired_CtlIndex == 0x30) || (desired_CtlIndex == 0x40) || (desired_CtlIndex == 0x0)) - { - /* skip CTL and heavy clip */ - hpPriv->enableBBHeavyClip = 0; - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("RegulatoryDomain = 0, skip CTL and heavy clip\n")); - #endif - } - else - { - hpPriv->enableBBHeavyClip = 1; - - if (desired_CtlIndex == 0xff) - { - /* desired index not found */ - desired_CtlIndex = 0x10; - } - - /* first part : 2.4G */ - if (frequency <= ZM_CH_G_14) - { - /* 2.4G - CTL_11B */ - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11B); - if(ctl_ictlData[ctl_i].ctlEdges[1], frequency); - } - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("CTL_11B ctl_i = %d\n", ctl_i)); - #endif - - /* 2.4G - CTL_11G */ - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11G); - if(ctl_ictlData[ctl_i].ctlEdges[1], frequency); - } - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("CTL_11G ctl_i = %d\n", ctl_i)); - #endif - - /* 2.4G - CTL_2GHT20 */ - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_2GHT20); - if(ctl_ictlData[ctl_i].ctlEdges[1], frequency); - } - else - { - /* workaround for no data in Eeprom, replace by normal 2G */ - ctlEdgesMaxPower2GHT20 = ctlEdgesMaxPower2G; - } - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("CTL_2GHT20 ctl_i = %d\n", ctl_i)); - #endif - - /* 2.4G - CTL_2GHT40 */ - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_2GHT40); - if(ctl_ictlData[ctl_i].ctlEdges[1], - zfAdjustHT40FreqOffset(dev, frequency, bw40, extOffset)); - } - else - { - /* workaround for no data in Eeprom, replace by normal 2G */ - ctlEdgesMaxPower2GHT40 = ctlEdgesMaxPower2G; - } - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("CTL_2GHT40 ctl_i = %d\n", ctl_i)); - #endif - - - /* 7a17 : */ - /* Max power (dBm) for channel range when using DFS define by madwifi*/ - for (i=0; iregulationTable.allowChannelCnt; i++) - { - if (wd->regulationTable.allowChannel[i].channel == frequency) - { - if (zfHpIsDfsChannel(dev, (u16_t)frequency)) - { - zm_debug_msg1("frequency use DFS -- ", frequency); - ctlEdgesMaxPowerCCK = zm_min(ctlEdgesMaxPowerCCK, wd->regulationTable.allowChannel[i].maxRegTxPower*2); - ctlEdgesMaxPower2G = zm_min(ctlEdgesMaxPower2G, wd->regulationTable.allowChannel[i].maxRegTxPower*2); - ctlEdgesMaxPower2GHT20 = zm_min(ctlEdgesMaxPower2GHT20, wd->regulationTable.allowChannel[i].maxRegTxPower*2); - ctlEdgesMaxPower2GHT40 = zm_min(ctlEdgesMaxPower2GHT40, wd->regulationTable.allowChannel[i].maxRegTxPower*2); - } - break; - } - } - - /* Apply ctl mode to correct target power set */ - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_debug_msg1("ctlEdgesMaxPowerCCK = ", ctlEdgesMaxPowerCCK); - zm_debug_msg1("ctlEdgesMaxPower2G = ", ctlEdgesMaxPower2G); - zm_debug_msg1("ctlEdgesMaxPower2GHT20 = ", ctlEdgesMaxPower2GHT20); - zm_debug_msg1("ctlEdgesMaxPower2GHT40 = ", ctlEdgesMaxPower2GHT40); - #endif - for (i=0; i<4; i++) - { - hpPriv->tPow2xCck[i] = zm_min(hpPriv->tPow2xCck[i], ctlEdgesMaxPowerCCK) + HALTX_POWER_OFFSET; - } - hpPriv->tPow2x2g24HeavyClipOffset = 0; - if (hpPriv->enableBBHeavyClip) - { - ctlOffset = 2; - } - else - { - ctlOffset = 0; - } - for (i=0; i<4; i++) - { - if (((frequency == 2412) || (frequency == 2462))) - { - if (i != 0) - { - hpPriv->tPow2x2g[i] = zm_min(hpPriv->tPow2x2g[i], ctlEdgesMaxPower2G-ctlOffset) + HALTX_POWER_OFFSET; - } - else - { - hpPriv->tPow2x2g[i] = zm_min(hpPriv->tPow2x2g[i], ctlEdgesMaxPower2G) + HALTX_POWER_OFFSET; - if (hpPriv->tPow2x2g[i] > (ctlEdgesMaxPower2G-ctlOffset)) - { - hpPriv->tPow2x2g24HeavyClipOffset = hpPriv->tPow2x2g[i] - (ctlEdgesMaxPower2G-ctlOffset); - } - } - } - else - { - hpPriv->tPow2x2g[i] = zm_min(hpPriv->tPow2x2g[i], ctlEdgesMaxPower2G) + HALTX_POWER_OFFSET; - } - } - for (i=0; i<8; i++) - { - if (((frequency == 2412) || (frequency == 2462)) && (i>=3)) - { - hpPriv->tPow2x2gHt20[i] = zm_min(hpPriv->tPow2x2gHt20[i], ctlEdgesMaxPower2GHT20-ctlOffset) + HALTX_POWER_OFFSET; - } - else - { - hpPriv->tPow2x2gHt20[i] = zm_min(hpPriv->tPow2x2gHt20[i], ctlEdgesMaxPower2GHT20) + HALTX_POWER_OFFSET; - } - } - for (i=0; i<8; i++) - { - if ((frequency == 2412) && (i>=3)) - { - hpPriv->tPow2x2gHt40[i] = zm_min(hpPriv->tPow2x2gHt40[i], ctlEdgesMaxPower2GHT40-ctlOffset) + HALTX_POWER_OFFSET; - } - else if ((frequency == 2462) && (i>=3)) - { - hpPriv->tPow2x2gHt40[i] = zm_min(hpPriv->tPow2x2gHt40[i], ctlEdgesMaxPower2GHT40-(ctlOffset*2)) + HALTX_POWER_OFFSET; - } - else - { - hpPriv->tPow2x2gHt40[i] = zm_min(hpPriv->tPow2x2gHt40[i], ctlEdgesMaxPower2GHT40) + HALTX_POWER_OFFSET; - } - } - } - else - { - /* 5G - CTL_11A */ - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11A); - if(ctl_ictlData[ctl_i].ctlEdges[1], frequency); - } - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("CTL_11A ctl_i = %d\n", ctl_i)); - #endif - - /* 5G - CTL_5GHT20 */ - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_5GHT20); - if(ctl_ictlData[ctl_i].ctlEdges[1], frequency); - } - else - { - /* workaround for no data in Eeprom, replace by normal 5G */ - ctlEdgesMaxPower5GHT20 = ctlEdgesMaxPower5G; - } - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("CTL_5GHT20 ctl_i = %d\n", ctl_i)); - #endif - - /* 5G - CTL_5GHT40 */ - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_5GHT40); - if(ctl_ictlData[ctl_i].ctlEdges[1], - zfAdjustHT40FreqOffset(dev, frequency, bw40, extOffset)); - } - else - { - /* workaround for no data in Eeprom, replace by normal 5G */ - ctlEdgesMaxPower5GHT40 = ctlEdgesMaxPower5G; - } - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("CTL_5GHT40 ctl_i = %d\n", ctl_i)); - #endif - - /* 7a17 : */ - /* Max power (dBm) for channel range when using DFS define by madwifi*/ - for (i=0; iregulationTable.allowChannelCnt; i++) - { - if (wd->regulationTable.allowChannel[i].channel == frequency) - { - if (zfHpIsDfsChannel(dev, (u16_t)frequency)) - { - zm_debug_msg1("frequency use DFS -- ", frequency); - ctlEdgesMaxPower5G = zm_min(ctlEdgesMaxPower5G, wd->regulationTable.allowChannel[i].maxRegTxPower*2); - ctlEdgesMaxPower5GHT20 = zm_min(ctlEdgesMaxPower5GHT20, wd->regulationTable.allowChannel[i].maxRegTxPower*2); - ctlEdgesMaxPower5GHT40 = zm_min(ctlEdgesMaxPower5GHT40, wd->regulationTable.allowChannel[i].maxRegTxPower*2); - } - break; - } - } - - - /* Apply ctl mode to correct target power set */ - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_debug_msg1("ctlEdgesMaxPower5G = ", ctlEdgesMaxPower5G); - zm_debug_msg1("ctlEdgesMaxPower5GHT20 = ", ctlEdgesMaxPower5GHT20); - zm_debug_msg1("ctlEdgesMaxPower5GHT40 = ", ctlEdgesMaxPower5GHT40); - #endif - for (i=0; i<4; i++) - { - hpPriv->tPow2x5g[i] = zm_min(hpPriv->tPow2x5g[i], ctlEdgesMaxPower5G) + HALTX_POWER_OFFSET; - } - for (i=0; i<8; i++) - { - hpPriv->tPow2x5gHt20[i] = zm_min(hpPriv->tPow2x5gHt20[i], ctlEdgesMaxPower5GHT20) + HALTX_POWER_OFFSET; - } - for (i=0; i<8; i++) - { - hpPriv->tPow2x5gHt40[i] = zm_min(hpPriv->tPow2x5gHt40[i], ctlEdgesMaxPower5GHT40) + HALTX_POWER_OFFSET; - } - - }/* end of bandedges of 5G */ - }/* end of if ((desired_CtlIndex = zfHpGetRegulatoryDomain(dev)) == 0) */ - - /* workaround */ - /* 5. BB heavy clip */ - /* only 2.4G do heavy clip */ - if (hpPriv->enableBBHeavyClip && hpPriv->hwBBHeavyClip && (frequency <= ZM_CH_G_14)) - { - if (frequency <= ZM_CH_G_14) - { - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11G); - } - else - { - ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11A); - } - - hpPriv->setValueHeavyClip = zfHpCheckDoHeavyClip(dev, frequency, eepromImage->ctlData[ctl_i].ctlEdges[1], bw40); - - if (hpPriv->setValueHeavyClip) - { - hpPriv->doBBHeavyClip = 1; - } - else - { - hpPriv->doBBHeavyClip = 0; - } - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - zm_dbg(("zfHpCheckDoHeavyClip ret = %02x, doBBHeavyClip = %d\n", - hpPriv->setValueHeavyClip, hpPriv->doBBHeavyClip)); - #endif - - if (hpPriv->doBBHeavyClip) - { - if (hpPriv->setValueHeavyClip & 0xf0) - { - hpPriv->tPow2x2gHt40[0] -= 1; - hpPriv->tPow2x2gHt40[1] -= 1; - hpPriv->tPow2x2gHt40[2] -= 1; - } - - if (hpPriv->setValueHeavyClip & 0xf) - { - hpPriv->tPow2x2gHt20[0] += 1; - hpPriv->tPow2x2gHt20[1] += 1; - hpPriv->tPow2x2gHt20[2] += 1; - } - } - } - else - { - hpPriv->doBBHeavyClip = 0; - hpPriv->setValueHeavyClip = 0; - } - - /* Final : write MAC register for some ctrl frame Tx power */ - /* first part : 2.4G */ - if (frequency <= ZM_CH_G_14) - { - /* Write MAC reg 0x694 for ACK's TPC */ - /* Write MAC reg 0xbb4 RTS and SF-CTS frame power control */ - /* Always use two stream for low legacy rate */ - #if 0 - //if (hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM) - //{ - zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->tPow2x2g[0]&0x3f) << 20) | (0x1<<26)); - zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->tPow2x2g[0]&0x3f) << 5 ) | (0x1<<11) | - ((hpPriv->tPow2x2g[0]&0x3f) << 21) | (0x1<<27) ); - //} - #endif - #if 1 - //else - { - #ifndef ZM_OTUS_LINUX_PHASE_2 - zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->tPow2x2g[0]&0x3f) << 20) | (0x5<<26)); - zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->tPow2x2g[0]&0x3f) << 5 ) | (0x5<<11) | - ((hpPriv->tPow2x2g[0]&0x3f) << 21) | (0x5<<27) ); - #endif - hpPriv->currentAckRtsTpc = hpPriv->tPow2x2g[0]; - } - #endif - zfFlushDelayWrite(dev); - - zfPrintTargetPower2G(hpPriv->tPow2xCck, - hpPriv->tPow2x2g, - hpPriv->tPow2x2gHt20, - hpPriv->tPow2x2gHt40); - } - else - { - /* Write MAC reg 0x694 for ACK's TPC */ - /* Write MAC reg 0xbb4 RTS and SF-CTS frame power control */ - /* Always use two stream for low legacy rate */ - if (hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM) - { - #ifndef ZM_OTUS_LINUX_PHASE_2 - zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->tPow2x5g[0]&0x3f) << 20) | (0x1<<26)); - zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->tPow2x5g[0]&0x3f) << 5 ) | (0x1<<11) | - ((hpPriv->tPow2x5g[0]&0x3f) << 21) | (0x1<<27) ); - #endif - } - else - { - #ifndef ZM_OTUS_LINUX_PHASE_2 - zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->tPow2x5g[0]&0x3f) << 20) | (0x5<<26)); - zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->tPow2x5g[0]&0x3f) << 5 ) | (0x5<<11) | - ((hpPriv->tPow2x5g[0]&0x3f) << 21) | (0x5<<27) ); - #endif - hpPriv->currentAckRtsTpc = hpPriv->tPow2x2g[0]; - } - - - zfFlushDelayWrite(dev); - - zfPrintTargetPower5G( - hpPriv->tPow2x5g, - hpPriv->tPow2x5gHt20, - hpPriv->tPow2x5gHt40); - }/* end of bandedges of 5G */ - -} - -void zfDumpEepBandEdges(struct ar5416Eeprom* eepromImage) -{ - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - u8_t i, j, k; - -#if 0 - zm_dbg(("\n === BandEdges index dump ==== \n")); - - for (i = 0; i < AR5416_NUM_CTLS; i++) - { - zm_dbg(("%02x ", eepromImage->ctlIndex[i])); - } - - zm_dbg(("\n === BandEdges data dump ==== \n")); - - for (i = 0; i < AR5416_NUM_CTLS; i++) - { - for (j = 0; j < 2; j++) - { - for(k = 0; k < AR5416_NUM_BAND_EDGES; k++) - { - u8_t *pdata = (u8_t*)&(eepromImage->ctlData[i].ctlEdges[j][k]); - zm_dbg(("(%02x %02x)", pdata[0], pdata[1])); - } - zm_dbg(("\n")); - } - } -#else - zm_dbg(("\n === BandEdges index dump ==== \n")); - for (i = 0; i < 24; i+=8) - { - zm_dbg(("%02x %02x %02x %02x %02x %02x %02x %02x", - eepromImage->ctlIndex[i+0], eepromImage->ctlIndex[i+1], eepromImage->ctlIndex[i+2], eepromImage->ctlIndex[i+3], - eepromImage->ctlIndex[i+4], eepromImage->ctlIndex[i+5], eepromImage->ctlIndex[i+6], eepromImage->ctlIndex[i+7] - )); - } - - zm_dbg(("\n === BandEdges data dump ==== \n")); - - for (i = 0; i < AR5416_NUM_CTLS; i++) - { - for (j = 0; j < 2; j++) - { - u8_t *pdata = (u8_t*)&(eepromImage->ctlData[i].ctlEdges[j]); - zm_dbg(("(%03d %02x) (%03d %02x) (%03d %02x) (%03d %02x) \n", - pdata[0], pdata[1], pdata[2], pdata[3], - pdata[4], pdata[5], pdata[6], pdata[7] - )); - zm_dbg(("(%03d %02x) (%03d %02x) (%03d %02x) (%03d %02x) \n", - pdata[8], pdata[9], pdata[10], pdata[11], - pdata[12], pdata[13], pdata[14], pdata[15] - )); - } - } -#endif - #endif -} - -void zfPrintTargetPower2G(u8_t* tPow2xCck, u8_t* tPow2x2g, u8_t* tPow2x2gHt20, u8_t* tPow2x2gHt40) -{ - //#ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - DbgPrint("targetPwr CCK : %d, %d, %d, %d\n", - tPow2xCck[0], - tPow2xCck[1], - tPow2xCck[2], - tPow2xCck[3] - ); - DbgPrint("targetPwr 2G : %d, %d, %d, %d\n", - tPow2x2g[0], - tPow2x2g[1], - tPow2x2g[2], - tPow2x2g[3] - ); - DbgPrint("targetPwr 2GHT20 : %d, %d, %d, %d, %d, %d, %d, %d\n", - tPow2x2gHt20[0], - tPow2x2gHt20[1], - tPow2x2gHt20[2], - tPow2x2gHt20[3], - tPow2x2gHt20[4], - tPow2x2gHt20[5], - tPow2x2gHt20[6], - tPow2x2gHt20[7] - ); - DbgPrint("targetPwr 2GHT40 : %d, %d, %d, %d, %d, %d, %d, %d\n", - tPow2x2gHt40[0], - tPow2x2gHt40[1], - tPow2x2gHt40[2], - tPow2x2gHt40[3], - tPow2x2gHt40[4], - tPow2x2gHt40[5], - tPow2x2gHt40[6], - tPow2x2gHt40[7] - ); - #endif - return; -} - -void zfPrintTargetPower5G(u8_t* tPow2x5g, u8_t* tPow2x5gHt20, u8_t* tPow2x5gHt40) -{ - //#ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG - #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG - DbgPrint("targetPwr 5G : %d, %d, %d, %d\n", - tPow2x5g[0], - tPow2x5g[1], - tPow2x5g[2], - tPow2x5g[3] - ); - DbgPrint("targetPwr 5GHT20 : %d, %d, %d, %d, %d, %d, %d, %d\n", - tPow2x5gHt20[0], - tPow2x5gHt20[1], - tPow2x5gHt20[2], - tPow2x5gHt20[3], - tPow2x5gHt20[4], - tPow2x5gHt20[5], - tPow2x5gHt20[6], - tPow2x5gHt20[7] - ); - DbgPrint("targetPwr 5GHT40 : %d, %d, %d, %d, %d, %d, %d, %d\n", - tPow2x5gHt40[0], - tPow2x5gHt40[1], - tPow2x5gHt40[2], - tPow2x5gHt40[3], - tPow2x5gHt40[4], - tPow2x5gHt40[5], - tPow2x5gHt40[6], - tPow2x5gHt40[7] - ); - #endif - return; -} - -void zfHpPowerSaveSetMode(zdev_t* dev, u8_t staMode, u8_t psMode, u16_t bcnInterval) -{ - if ( staMode == 0 ) - { - if ( psMode == 0 ) - { - // Turn off pre-TBTT interrupt - zfDelayWriteInternalReg(dev, ZM_MAC_REG_PRETBTT, 0); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, 0); - zfFlushDelayWrite(dev); - } - else - { - // Turn on pre-TBTT interrupt - zfDelayWriteInternalReg(dev, ZM_MAC_REG_PRETBTT, (bcnInterval-6)<<16); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, bcnInterval); - zfFlushDelayWrite(dev); - } - } -} - -void zfHpPowerSaveSetState(zdev_t* dev, u8_t psState) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - //DbgPrint("INTO zfHpPowerSaveSetState"); - - if ( psState == 0 ) //power up - { - //DbgPrint("zfHpPowerSaveSetState Wake up from PS\n"); - reg_write(0x982C, 0x0000a000); //wake up ADDAC - reg_write(0x9808, 0x0); //enable all agc gain and offset updates to a2 - //# bank 3 - if (((struct zsHpPriv*)wd->hpPrivate)->hwFrequency <= ZM_CH_G_14) - { - /* 11g */ - //reg_write (0x98f0, 0x01c00018); - reg_write (0x98f0, 0x01c20098);//syn_on+RX_ON - } - else - { - /* 11a */ - //reg_write (0x98f0, 0x01400018); - reg_write (0x98f0, 0x01420098);//syn_on+RX_ON - } - - ////#bank 5 - //reg_write(0x98b0, 0x00000013); - //reg_write(0x98e4, 0x00000002); - - - zfFlushDelayWrite(dev); - } - else //power down - { - //DbgPrint("zfHpPowerSaveSetState Go to PS\n"); - //reg_write(0x982C, 0xa000a000); - reg_write(0x9808, 0x8000000); //disable all agc gain and offset updates to a2 - reg_write(0x982C, 0xa000a000); //power down ADDAC - //# bank 3 - if (((struct zsHpPriv*)wd->hpPrivate)->hwFrequency <= ZM_CH_G_14) - { - /* 11g */ - reg_write (0x98f0, 0x00c00018);//syn_off+RX_off - } - else - { - /* 11a */ - reg_write (0x98f0, 0x00400018);//syn_off+RX_off - } - - ////#bank 5 - //reg_write(0x98b0, 0x000e0013); - //reg_write(0x98e4, 0x00018002); - - - zfFlushDelayWrite(dev); - } -} - -void zfHpSetAggPktNum(zdev_t* dev, u32_t num) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - num = (num << 16) | (0xa); - - hpPriv->aggPktNum = num; - - //aggregation number will be update in HAL heart beat - //zfDelayWriteInternalReg(dev, 0x1c3b9c, num); - //zfFlushDelayWrite(dev); -} - -void zfHpSetMPDUDensity(zdev_t* dev, u8_t density) -{ - u32_t value; - - if (density > ZM_MPDU_DENSITY_8US) - { - return; - } - - /* Default value in this register */ - value = 0x140A00 | density; - - zfDelayWriteInternalReg(dev, 0x1c3ba0, value); - zfFlushDelayWrite(dev); - return; -} - -void zfHpSetSlotTime(zdev_t* dev, u8_t type) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - if (type == 0) - { - //normal slot = 20us - hpPriv->slotType = 0; - } - else //if (type == 1) - { - //short slot = 9us - hpPriv->slotType = 1; - } - - return; -} - -void zfHpSetSlotTimeRegister(zdev_t* dev, u8_t type) -{ - if(type == 0) - { - //normal slot = 20us - zfDelayWriteInternalReg(dev, ZM_MAC_REG_SLOT_TIME, 20<<10); - } - else - { - //short slot = 9us - zfDelayWriteInternalReg(dev, ZM_MAC_REG_SLOT_TIME, 9<<10); - } -} - -void zfHpSetRifs(zdev_t* dev, u8_t ht_enable, u8_t ht2040, u8_t g_mode) -{ - zfDelayWriteInternalReg(dev, 0x1c6388, 0x0c000000); - - zfDelayWriteInternalReg(dev, 0x1c59ec, 0x0cc80caa); - - if (ht_enable) - { - if (ht2040) - { - zfDelayWriteInternalReg(dev, 0x1c5918, 40); - } - else - { - zfDelayWriteInternalReg(dev, 0x1c5918, 20); - } - } - - if (g_mode) - { - zfDelayWriteInternalReg(dev, 0x1c5850, 0xec08b4e2); - zfDelayWriteInternalReg(dev, 0x1c585c, 0x313a5d5e); - } - else - { - zfDelayWriteInternalReg(dev, 0x1c5850, 0xede8b4e0); - zfDelayWriteInternalReg(dev, 0x1c585c, 0x3139605e); - } - - zfFlushDelayWrite(dev); - return; -} - -void zfHpBeginSiteSurvey(zdev_t* dev, u8_t status) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - if ( status == 1 ) - { // Connected - hpPriv->isSiteSurvey = 1; - } - else - { // Not connected - hpPriv->isSiteSurvey = 0; - } - - /* reset workaround state to default */ -// if (hpPriv->rxStrongRSSI == 1) - { - hpPriv->rxStrongRSSI = 0; - if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE - { - if (hpPriv->hwFrequency <= ZM_CH_G_14) - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b49); - } - else - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x0900); - } - } - else - { - zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b40); - } - zfFlushDelayWrite(dev); - } -// if (hpPriv->strongRSSI == 1) - { - hpPriv->strongRSSI = 0; - zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->currentAckRtsTpc&0x3f) << 20) | (0x5<<26)); - zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->currentAckRtsTpc&0x3f) << 5 ) | (0x5<<11) | - ((hpPriv->currentAckRtsTpc&0x3f) << 21) | (0x5<<27) ); - zfFlushDelayWrite(dev); - } -} - -void zfHpFinishSiteSurvey(zdev_t* dev, u8_t status) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - if ( status == 1 ) - { - hpPriv->isSiteSurvey = 2; - } - else - { - hpPriv->isSiteSurvey = 0; - } - zmw_leave_critical_section(dev); -} - -u16_t zfFwRetry(zdev_t* dev, u8_t enable) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t ret = 0; - - cmd[0] = 4 | (0x92 << 8); - cmd[1] = (enable == 1) ? 0x01 : 0x00; - - ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, NULL); - return ret; -} - -u16_t zfHpEnableHwRetry(zdev_t* dev) -{ - u16_t ret; - - ret = zfFwRetry(dev, 0); - - zfDelayWriteInternalReg(dev, 0x1c3b28, 0x33333); - zfFlushDelayWrite(dev); - - return ret; -} - -u16_t zfHpDisableHwRetry(zdev_t* dev) -{ - u16_t ret; - - ret = zfFwRetry(dev, 1); - - zfDelayWriteInternalReg(dev, 0x1c3b28, 0x00000); - zfFlushDelayWrite(dev); - - return ret; -} - -/* Download SPI Fw */ -#define ZM_FIRMWARE_WLAN 0 -#define ZM_FIRMWARE_SPI_FLASH 1 - - -u16_t zfHpFirmwareDownload(zdev_t* dev, u8_t fwType) -{ - u16_t ret = ZM_SUCCESS; - - if (fwType == ZM_FIRMWARE_WLAN) - { - ret = zfFirmwareDownload(dev, (u32_t*)zcFwImage, - (u32_t)zcFwImageSize, ZM_FIRMWARE_WLAN_ADDR); - } - else if (fwType == ZM_FIRMWARE_SPI_FLASH) - { - ret = zfFirmwareDownload(dev, (u32_t*)zcFwImageSPI, - (u32_t)zcFwImageSPISize, ZM_FIRMWARE_SPI_ADDR); - } - else - { - zm_debug_msg1("Unknown firmware type = ", fwType); - ret = ZM_ERR_FIRMWARE_WRONG_TYPE; - } - - return ret; -} - -/* Enable software decryption */ -void zfHpSWDecrypt(zdev_t* dev, u8_t enable) -{ - u32_t value = 0x70; - - /* Bit 4 for enable software decryption */ - if (enable == 1) - { - value = 0x78; - } - - zfDelayWriteInternalReg(dev, 0x1c3678, value); - zfFlushDelayWrite(dev); -} - -/* Enable software encryption */ -void zfHpSWEncrypt(zdev_t* dev, u8_t enable) -{ - /* Because encryption by software or hardware is judged by driver in Otus, - we don't need to do anything in the HAL layer. - */ -} - -u32_t zfHpCapability(zdev_t* dev) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - return hpPriv->halCapability; -} - -void zfHpSetRollCallTable(zdev_t* dev) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - if (hpPriv->camRollCallTable != (u64_t) 0) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_ROLL_CALL_TBL_L, (u32_t)(hpPriv->camRollCallTable & 0xffffffff)); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_ROLL_CALL_TBL_H, (u32_t)((hpPriv->camRollCallTable >> 32) & 0xffffffff)); - zfFlushDelayWrite(dev); - } -} - -void zfHpSetTTSIFSTime(zdev_t* dev, u8_t sifs_time) -{ - u32_t reg_value = 0; - - sifs_time &= 0x3f; - reg_value = 0x14400b | (((u32_t)sifs_time)<<24); - - zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, reg_value); - zfFlushDelayWrite(dev); -} - -/* #3 Enable RIFS function if the RIFS pattern matched ! */ -void zfHpEnableRifs(zdev_t* dev, u8_t mode24g, u8_t modeHt, u8_t modeHt2040) -{ - - /* # Enable Reset TDOMAIN - * $rddata = &$phyreg_read(0x9800+(738<<2)); - * $wrdata = $rddata | (0x1 << 26) | (0x1 << 27); - * &$phyreg_write(0x9800+(738<<2), $wrdata); - */ - reg_write (0x9800+(738<<2), 0x08000000 | (0x1 << 26) | (0x1 << 27)); - //reg_write (0x9800+(738<<2), 0x08000000 | (0x1 << 26)); - - /* # reg 123: heavy clip factor, xr / RIFS search parameters */ - reg_write (0x99ec, 0x0cc80caa); - - /* # Reduce Search Start Delay for RIFS */ - if (modeHt == 1) /* ($HT_ENABLE == 1) */ - { - if (modeHt2040 == 0x1) /* ($DYNAMIC_HT2040_EN == 0x1) */ - { - reg_write(0x9800+(70<<2), 40);/*40*/ - } - else - { - reg_write(0x9800+(70<<2), 20); - if(mode24g == 0x0) - { - /* $rddata = &$phyreg_read(0x9800+(24<<2));#0x9860;0x1c5860 - *$wrdata = ($rddata & 0xffffffc7) | (0x4 << 3); - * &$phyreg_write(0x9800+(24<<2), $wrdata); - */ - reg_write(0x9800+(24<<2), (0x0004dd10 & 0xffffffc7) | (0x4 << 3)); - } - } - } - - if (mode24g == 0x1) - { - reg_write(0x9850, 0xece8b4e4);/*org*/ - //reg_write(0x9850, 0xece8b4e2); - reg_write(0x985c, 0x313a5d5e); - } - else - { - reg_write(0x9850, 0xede8b4e4); - reg_write(0x985c, 0x3139605e); - } - - zfFlushDelayWrite(dev); - - return; -} - -/* #4 Disable RIFS function if the RIFS timer is timeout ! */ -void zfHpDisableRifs(zdev_t* dev) -{ - zmw_get_wlan_dev(dev); - - /* Disable RIFS function is to store these HW register initial value while the device plug-in and - re-write to these register if the RIFS function is disabled */ - - // reg : 9850 - reg_write(0x9850, ((struct zsHpPriv*)wd->hpPrivate)->initDesiredSigSize); - - // reg : 985c - reg_write(0x985c, ((struct zsHpPriv*)wd->hpPrivate)->initAGC); - - // reg : 9860 - reg_write(0x9800+(24<<2), ((struct zsHpPriv*)wd->hpPrivate)->initAgcControl); - - // reg : 9918 - reg_write(0x9800+(70<<2), ((struct zsHpPriv*)wd->hpPrivate)->initSearchStartDelay); - - // reg : 991c - reg_write (0x99ec, ((struct zsHpPriv*)wd->hpPrivate)->initRIFSSearchParams); - - // reg : a388 - reg_write (0x9800+(738<<2), ((struct zsHpPriv*)wd->hpPrivate)->initFastChannelChangeControl); - - zfFlushDelayWrite(dev); - - return; -} diff --git a/drivers/staging/otus/hal/hpreg.c b/drivers/staging/otus/hal/hpreg.c deleted file mode 100644 index 9b04653c1c53..000000000000 --- a/drivers/staging/otus/hal/hpreg.c +++ /dev/null @@ -1,2270 +0,0 @@ -/* - * 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.c */ -/* */ -/* Abstract */ -/* This module contains Regulatory Table and related function. */ -/* */ -/* NOTES */ -/* None */ -/* */ -/************************************************************************/ -#include "../80211core/cprecomp.h" -#include "hpani.h" -#include "hpreg.h" -#include "hpusb.h" - -#define HAL_MODE_11A_TURBO HAL_MODE_108A -#define HAL_MODE_11G_TURBO HAL_MODE_108G - -#if 0 -enum { - /* test groups */ - FCC = 0x10, - MKK = 0x40, - ETSI = 0x30, - SD_NO_CTL = 0xe0, - NO_CTL = 0xff, - /* test modes */ - CTL_MODE_M = 0x0f, - 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 -}; -#endif - -/* - * The following are flags for different requirements per reg domain. - * These requirements are either inhereted from the reg domain pair or - * from the unitary reg domain if the reg domain pair flags value is - * 0 - */ - -enum { - NO_REQ = 0x00000000, - DISALLOW_ADHOC_11A = 0x00000001, - DISALLOW_ADHOC_11A_TURB = 0x00000002, - NEED_NFC = 0x00000004, - - ADHOC_PER_11D = 0x00000008, /* Start Ad-Hoc mode */ - ADHOC_NO_11A = 0x00000010, - - PUBLIC_SAFETY_DOMAIN = 0x00000020, /* public safety domain */ - LIMIT_FRAME_4MS = 0x00000040, /* 4msec limit on the frame length */ -}; - -#define MKK5GHZ_FLAG1 (DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS) -#define MKK5GHZ_FLAG2 (DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS) - -typedef enum { - DFS_UNINIT_DOMAIN = 0, /* Uninitialized dfs domain */ - DFS_FCC_DOMAIN = 1, /* FCC3 dfs domain */ - DFS_ETSI_DOMAIN = 2, /* ETSI dfs domain */ -} HAL_DFS_DOMAIN; - -/* - * Used to set the RegDomain bitmask which chooses which frequency - * band specs are used. - */ - -#define BMLEN 2 /* Use 2 64 bit uint for channel bitmask - NB: Must agree with macro below (BM) */ -#define BMZERO {(u64_t) 0, (u64_t) 0} /* BMLEN zeros */ - -#if 0 - -#define BM(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh, _fi, _fj, _fk, _fl) \ - {((((_fa >= 0) && (_fa < 64)) ? (((u64_t) 1) << _fa) : (u64_t) 0) | \ - (((_fb >= 0) && (_fb < 64)) ? (((u64_t) 1) << _fb) : (u64_t) 0) | \ - (((_fc >= 0) && (_fc < 64)) ? (((u64_t) 1) << _fc) : (u64_t) 0) | \ - (((_fd >= 0) && (_fd < 64)) ? (((u64_t) 1) << _fd) : (u64_t) 0) | \ - (((_fe >= 0) && (_fe < 64)) ? (((u64_t) 1) << _fe) : (u64_t) 0) | \ - (((_ff >= 0) && (_ff < 64)) ? (((u64_t) 1) << _ff) : (u64_t) 0) | \ - (((_fg >= 0) && (_fg < 64)) ? (((u64_t) 1) << _fg) : (u64_t) 0) | \ - (((_fh >= 0) && (_fh < 64)) ? (((u64_t) 1) << _fh) : (u64_t) 0) | \ - (((_fi >= 0) && (_fi < 64)) ? (((u64_t) 1) << _fi) : (u64_t) 0) | \ - (((_fj >= 0) && (_fj < 64)) ? (((u64_t) 1) << _fj) : (u64_t) 0) | \ - (((_fk >= 0) && (_fk < 64)) ? (((u64_t) 1) << _fk) : (u64_t) 0) | \ - (((_fl >= 0) && (_fl < 64)) ? (((u64_t) 1) << _fl) : (u64_t) 0) | \ - ((((_fa > 63) && (_fa < 128)) ? (((u64_t) 1) << (_fa - 64)) : (u64_t) 0) | \ - (((_fb > 63) && (_fb < 128)) ? (((u64_t) 1) << (_fb - 64)) : (u64_t) 0) | \ - (((_fc > 63) && (_fc < 128)) ? (((u64_t) 1) << (_fc - 64)) : (u64_t) 0) | \ - (((_fd > 63) && (_fd < 128)) ? (((u64_t) 1) << (_fd - 64)) : (u64_t) 0) | \ - (((_fe > 63) && (_fe < 128)) ? (((u64_t) 1) << (_fe - 64)) : (u64_t) 0) | \ - (((_ff > 63) && (_ff < 128)) ? (((u64_t) 1) << (_ff - 64)) : (u64_t) 0) | \ - (((_fg > 63) && (_fg < 128)) ? (((u64_t) 1) << (_fg - 64)) : (u64_t) 0) | \ - (((_fh > 63) && (_fh < 128)) ? (((u64_t) 1) << (_fh - 64)) : (u64_t) 0) | \ - (((_fi > 63) && (_fi < 128)) ? (((u64_t) 1) << (_fi - 64)) : (u64_t) 0) | \ - (((_fj > 63) && (_fj < 128)) ? (((u64_t) 1) << (_fj - 64)) : (u64_t) 0) | \ - (((_fk > 63) && (_fk < 128)) ? (((u64_t) 1) << (_fk - 64)) : (u64_t) 0) | \ - (((_fl > 63) && (_fl < 128)) ? (((u64_t) 1) << (_fl - 64)) : (u64_t) 0)))} - -#else - -#define BM(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh, _fi, _fj, _fk, _fl) \ - {((((_fa >= 0) && (_fa < 64)) ? (((u64_t) 1) << (_fa&0x3f)) : (u64_t) 0) | \ - (((_fb >= 0) && (_fb < 64)) ? (((u64_t) 1) << (_fb&0x3f)) : (u64_t) 0) | \ - (((_fc >= 0) && (_fc < 64)) ? (((u64_t) 1) << (_fc&0x3f)) : (u64_t) 0) | \ - (((_fd >= 0) && (_fd < 64)) ? (((u64_t) 1) << (_fd&0x3f)) : (u64_t) 0) | \ - (((_fe >= 0) && (_fe < 64)) ? (((u64_t) 1) << (_fe&0x3f)) : (u64_t) 0) | \ - (((_ff >= 0) && (_ff < 64)) ? (((u64_t) 1) << (_ff&0x3f)) : (u64_t) 0) | \ - (((_fg >= 0) && (_fg < 64)) ? (((u64_t) 1) << (_fg&0x3f)) : (u64_t) 0) | \ - (((_fh >= 0) && (_fh < 64)) ? (((u64_t) 1) << (_fh&0x3f)) : (u64_t) 0) | \ - (((_fi >= 0) && (_fi < 64)) ? (((u64_t) 1) << (_fi&0x3f)) : (u64_t) 0) | \ - (((_fj >= 0) && (_fj < 64)) ? (((u64_t) 1) << (_fj&0x3f)) : (u64_t) 0) | \ - (((_fk >= 0) && (_fk < 64)) ? (((u64_t) 1) << (_fk&0x3f)) : (u64_t) 0) | \ - (((_fl >= 0) && (_fl < 64)) ? (((u64_t) 1) << (_fl&0x3f)) : (u64_t) 0) | \ - ((((_fa > 63) && (_fa < 128)) ? (((u64_t) 1) << ((_fa - 64)&0x3f)) : (u64_t) 0) | \ - (((_fb > 63) && (_fb < 128)) ? (((u64_t) 1) << ((_fb - 64)&0x3f)) : (u64_t) 0) | \ - (((_fc > 63) && (_fc < 128)) ? (((u64_t) 1) << ((_fc - 64)&0x3f)) : (u64_t) 0) | \ - (((_fd > 63) && (_fd < 128)) ? (((u64_t) 1) << ((_fd - 64)&0x3f)) : (u64_t) 0) | \ - (((_fe > 63) && (_fe < 128)) ? (((u64_t) 1) << ((_fe - 64)&0x3f)) : (u64_t) 0) | \ - (((_ff > 63) && (_ff < 128)) ? (((u64_t) 1) << ((_ff - 64)&0x3f)) : (u64_t) 0) | \ - (((_fg > 63) && (_fg < 128)) ? (((u64_t) 1) << ((_fg - 64)&0x3f)) : (u64_t) 0) | \ - (((_fh > 63) && (_fh < 128)) ? (((u64_t) 1) << ((_fh - 64)&0x3f)) : (u64_t) 0) | \ - (((_fi > 63) && (_fi < 128)) ? (((u64_t) 1) << ((_fi - 64)&0x3f)) : (u64_t) 0) | \ - (((_fj > 63) && (_fj < 128)) ? (((u64_t) 1) << ((_fj - 64)&0x3f)) : (u64_t) 0) | \ - (((_fk > 63) && (_fk < 128)) ? (((u64_t) 1) << ((_fk - 64)&0x3f)) : (u64_t) 0) | \ - (((_fl > 63) && (_fl < 128)) ? (((u64_t) 1) << ((_fl - 64)&0x3f)) : (u64_t) 0)))} - -#endif - -/* Mask to check whether a domain is a multidomain or a single - domain */ - -#define MULTI_DOMAIN_MASK 0xFF00 - - -/* - * The following describe the bit masks for different passive scan - * capability/requirements per regdomain. - */ -#define NO_PSCAN 0x0ULL -#define PSCAN_FCC 0x0000000000000001ULL -#define PSCAN_FCC_T 0x0000000000000002ULL -#define PSCAN_ETSI 0x0000000000000004ULL -#define PSCAN_MKK1 0x0000000000000008ULL -#define PSCAN_MKK2 0x0000000000000010ULL -#define PSCAN_MKKA 0x0000000000000020ULL -#define PSCAN_MKKA_G 0x0000000000000040ULL -#define PSCAN_ETSIA 0x0000000000000080ULL -#define PSCAN_ETSIB 0x0000000000000100ULL -#define PSCAN_ETSIC 0x0000000000000200ULL -#define PSCAN_WWR 0x0000000000000400ULL -#define PSCAN_MKKA1 0x0000000000000800ULL -#define PSCAN_MKKA1_G 0x0000000000001000ULL -#define PSCAN_MKKA2 0x0000000000002000ULL -#define PSCAN_MKKA2_G 0x0000000000004000ULL -#define PSCAN_MKK3 0x0000000000008000ULL -#define PSCAN_DEFER 0x7FFFFFFFFFFFFFFFULL -#define IS_ECM_CHAN 0x8000000000000000ULL - -/* - * THE following table is the mapping of regdomain pairs specified by - * an 8 bit regdomain value to the individual unitary reg domains - */ - -typedef struct reg_dmn_pair_mapping { - u16_t regDmnEnum; /* 16 bit reg domain pair */ - u16_t regDmn5GHz; /* 5GHz reg domain */ - u16_t regDmn2GHz; /* 2GHz reg domain */ - u32_t flags5GHz; /* Requirements flags (AdHoc - disallow, noise floor cal needed, - etc) */ - u32_t flags2GHz; /* Requirements flags (AdHoc - disallow, noise floor cal needed, - etc) */ - u64_t pscanMask; /* Passive Scan flags which - can override unitary domain - passive scan flags. This - value is used as a mask on - the unitary flags*/ - u16_t singleCC; /* Country code of single country if - a one-on-one mapping exists */ -} REG_DMN_PAIR_MAPPING; - -static REG_DMN_PAIR_MAPPING regDomainPairs[] = { - {NO_ENUMRD, FCC2, DEBUG_REG_DMN, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {NULL1_WORLD, NULL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {NULL1_ETSIB, NULL1, ETSIB, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {NULL1_ETSIC, NULL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - - {FCC2_FCCA, FCC2, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {FCC2_WORLD, FCC2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {FCC2_ETSIC, FCC2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {FCC3_FCCA, FCC3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {FCC3_WORLD, FCC3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {FCC4_FCCA, FCC4, FCCA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {FCC5_FCCA, FCC5, FCCA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {FCC6_FCCA, FCC6, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {FCC6_WORLD, FCC6, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - - {ETSI1_WORLD, ETSI1, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {ETSI2_WORLD, ETSI2, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {ETSI3_WORLD, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {ETSI4_WORLD, ETSI4, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {ETSI5_WORLD, ETSI5, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {ETSI6_WORLD, ETSI6, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - - {ETSI3_ETSIA, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {FRANCE_RES, ETSI3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - - {FCC1_WORLD, FCC1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {FCC1_FCCA, FCC1, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL1_WORLD, APL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL2_WORLD, APL2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL3_WORLD, APL3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL4_WORLD, APL4, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL5_WORLD, APL5, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL6_WORLD, APL6, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL8_WORLD, APL8, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL9_WORLD, APL9, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - - {APL3_FCCA, APL3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL1_ETSIC, APL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL2_ETSIC, APL2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL2_FCCA, APL2, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {APL2_APLD, APL2, APLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0}, - {APL7_FCCA, APL7, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - - {MKK1_MKKA, MKK1, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA, CTRY_JAPAN }, - {MKK1_MKKB, MKK1, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN1 }, - {MKK1_FCCA, MKK1, FCCA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN2 }, - {MKK1_MKKA1, MKK1, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN4 }, - {MKK1_MKKA2, MKK1, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN5 }, - {MKK1_MKKC, MKK1, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN6 }, - - /* MKK2 */ - {MKK2_MKKA, MKK2, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK2 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN3 }, - - /* MKK3 */ - {MKK3_MKKA, MKK3, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN25 }, - {MKK3_MKKB, MKK3, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN7 }, - {MKK3_MKKA1, MKK3, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN26 }, - {MKK3_MKKA2, MKK3, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN8 }, - {MKK3_MKKC, MKK3, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN9 }, - {MKK3_FCCA, MKK3, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN27 }, - - /* MKK4 */ - {MKK4_MKKB, MKK4, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN10 }, - {MKK4_MKKA1, MKK4, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN28 }, - {MKK4_MKKA2, MKK4, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN11 }, - {MKK4_MKKC, MKK4, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN12 }, - {MKK4_FCCA, MKK4, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN29 }, - {MKK4_MKKA, MKK4, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA, CTRY_JAPAN36 }, - - /* MKK5 */ - {MKK5_MKKB, MKK5, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN13 }, - {MKK5_MKKA2, MKK5, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN14 }, - {MKK5_MKKC, MKK5, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN15 }, - - /* MKK6 */ - {MKK6_MKKB, MKK6, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN16 }, - {MKK6_MKKA2, MKK6, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN17 }, - {MKK6_MKKC, MKK6, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN18 }, - {MKK6_MKKA1, MKK6, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN30 }, - {MKK6_FCCA, MKK6, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN31 }, - - /* MKK7 */ - {MKK7_MKKB, MKK7, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN19 }, - {MKK7_MKKA, MKK7, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN20 }, - {MKK7_MKKC, MKK7, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3, CTRY_JAPAN21 }, - {MKK7_MKKA1, MKK7, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN32 }, - {MKK7_FCCA, MKK7, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN33 }, - - /* MKK8 */ - {MKK8_MKKB, MKK8, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN22 }, - {MKK8_MKKA2, MKK8, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN23 }, - {MKK8_MKKC, MKK8, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 , CTRY_JAPAN24 }, - - /* MKK9 */ - {MKK9_MKKA, MKK9, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN34 }, - {MKK9_FCCA, MKK9, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN37 }, - {MKK9_MKKA1, MKK9, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN38 }, - {MKK9_MKKC, MKK9, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN39 }, - {MKK9_MKKA2, MKK9, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN40 }, - - /* MKK10 */ - {MKK10_MKKA, MKK10, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN35 }, - {MKK10_FCCA, MKK10, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN41 }, - {MKK10_MKKA1, MKK10, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN42 }, - {MKK10_MKKC, MKK10, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN43 }, - {MKK10_MKKA2, MKK10, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN44 }, - - /* MKK11 */ - {MKK11_MKKA, MKK11, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN45 }, - {MKK11_FCCA, MKK11, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN46 }, - {MKK11_MKKA1, MKK11, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN47 }, - {MKK11_MKKC, MKK11, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN48 }, - {MKK11_MKKA2, MKK11, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN49 }, - - /* MKK12 */ - {MKK12_MKKA, MKK12, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN50 }, - {MKK12_FCCA, MKK12, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN51 }, - {MKK12_MKKA1, MKK12, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN52 }, - {MKK12_MKKC, MKK12, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN53 }, - {MKK12_MKKA2, MKK12, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN54 }, - - - /* These are super domains */ - {WOR0_WORLD, WOR0_WORLD, WOR0_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {WOR1_WORLD, WOR1_WORLD, WOR1_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {WOR2_WORLD, WOR2_WORLD, WOR2_WORLD, DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {WOR3_WORLD, WOR3_WORLD, WOR3_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {WOR4_WORLD, WOR4_WORLD, WOR4_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {WOR5_ETSIC, WOR5_ETSIC, WOR5_ETSIC, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {WOR01_WORLD, WOR01_WORLD, WOR01_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {WOR02_WORLD, WOR02_WORLD, WOR02_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {EU1_WORLD, EU1_WORLD, EU1_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, - {WOR9_WORLD, WOR9_WORLD, WOR9_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, - {WORA_WORLD, WORA_WORLD, WORA_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 }, -}; - -/* - * The following table is the master list for all different freqeuncy - * bands with the complete matrix of all possible flags and settings - * for each band if it is used in ANY reg domain. - */ - -#define DEF_REGDMN FCC1_FCCA -#define DEF_DMN_5 FCC1 -#define DEF_DMN_2 FCCA -#define COUNTRY_ERD_FLAG 0x8000 -#define WORLDWIDE_ROAMING_FLAG 0x4000 -#define SUPER_DOMAIN_MASK 0x0fff -#define COUNTRY_CODE_MASK 0x03ff -#define CF_INTERFERENCE (CHANNEL_CW_INT | CHANNEL_RADAR_INT) -#define CHANNEL_14 (2484) /* 802.11g operation is not permitted on channel 14 */ -#define IS_11G_CH14(_ch, _cf) \ - (((_ch) == CHANNEL_14) && ((_cf) == CHANNEL_G)) - -#define YES TRUE -#define NO FALSE - -enum { - CTRY_DEBUG = 0x1ff, /* debug country code */ - CTRY_DEFAULT = 0 /* default country code */ -}; - -typedef struct { - HAL_CTRY_CODE countryCode; - HAL_REG_DOMAIN regDmnEnum; - const char *isoName; - const char *name; - HAL_BOOL allow11g; - HAL_BOOL allow11aTurbo; - HAL_BOOL allow11gTurbo; - HAL_BOOL allow11na; /* HT-40 allowed in 5GHz? */ - HAL_BOOL allow11ng; /* HT-40 allowed in 2GHz? */ - u16_t outdoorChanStart; -} COUNTRY_CODE_TO_ENUM_RD; - -static COUNTRY_CODE_TO_ENUM_RD allCountries[] = { - {CTRY_DEBUG, NO_ENUMRD, "DB", "DEBUG", YES, YES, YES, YES, YES, 7000 }, - {CTRY_DEFAULT, DEF_REGDMN, "NA", "NO_COUNTRY_SET", YES, YES, YES, YES, YES, 7000 }, - {CTRY_ALBANIA, NULL1_WORLD, "AL", "ALBANIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_ALGERIA, NULL1_WORLD, "DZ", "ALGERIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_ARGENTINA, APL3_WORLD, "AR", "ARGENTINA", YES, NO, NO, NO, NO, 7000 }, - {CTRY_ARMENIA, ETSI4_WORLD, "AM", "ARMENIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_AUSTRALIA, FCC6_WORLD, "AU", "AUSTRALIA", YES, YES, YES, YES, YES, 7000 }, - {CTRY_AUSTRIA, ETSI2_WORLD, "AT", "AUSTRIA", YES, NO, YES, YES, YES, 7000 }, - {CTRY_AZERBAIJAN, ETSI4_WORLD, "AZ", "AZERBAIJAN", YES, YES, YES, YES, YES, 7000 }, - {CTRY_BAHRAIN, APL6_WORLD, "BH", "BAHRAIN", YES, NO, YES, NO, YES, 7000 }, - {CTRY_BELARUS, ETSI1_WORLD, "BY", "BELARUS", YES, NO, YES, YES, YES, 7000 }, - {CTRY_BELGIUM, ETSI1_WORLD, "BE", "BELGIUM", YES, NO, YES, YES, YES, 7000 }, - {CTRY_BELIZE, APL1_ETSIC, "BZ", "BELIZE", YES, YES, YES, YES, YES, 7000 }, - {CTRY_BOLIVIA, APL1_ETSIC, "BO", "BOLVIA", YES, YES, YES, YES, YES, 7000 }, - {CTRY_BRAZIL, FCC3_WORLD, "BR", "BRAZIL", NO, NO, NO, NO, NO, 7000 }, - {CTRY_BRUNEI_DARUSSALAM, APL1_WORLD, "BN", "BRUNEI DARUSSALAM", YES, YES, YES, YES, YES, 7000 }, - {CTRY_BULGARIA, ETSI6_WORLD, "BG", "BULGARIA", YES, NO, YES, YES, YES, 7000 }, - {CTRY_CANADA, FCC6_FCCA, "CA", "CANADA", YES, YES, YES, YES, YES, 7000 }, - {CTRY_CHILE, APL6_WORLD, "CL", "CHILE", YES, YES, YES, YES, YES, 7000 }, - {CTRY_CHINA, APL1_WORLD, "CN", "CHINA", YES, YES, YES, YES, YES, 7000 }, - {CTRY_COLOMBIA, FCC1_FCCA, "CO", "COLOMBIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_COSTA_RICA, FCC1_WORLD, "CR", "COSTA RICA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_CROATIA, ETSI3_WORLD, "HR", "CROATIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_CYPRUS, ETSI3_WORLD, "CY", "CYPRUS", YES, YES, YES, YES, YES, 7000 }, - {CTRY_CZECH, ETSI3_WORLD, "CZ", "CZECH REPUBLIC", YES, NO, YES, YES, YES, 7000 }, - {CTRY_DENMARK, ETSI1_WORLD, "DK", "DENMARK", YES, NO, YES, YES, YES, 7000 }, - {CTRY_DOMINICAN_REPUBLIC, FCC1_FCCA, "DO", "DOMINICAN REPUBLIC", YES, YES, YES, YES, YES, 7000 }, - {CTRY_ECUADOR, FCC1_WORLD, "EC", "ECUADOR", YES, NO, NO, NO, YES, 7000 }, - {CTRY_EGYPT, ETSI3_WORLD, "EG", "EGYPT", YES, NO, YES, NO, YES, 7000 }, - {CTRY_EL_SALVADOR, FCC1_WORLD, "SV", "EL SALVADOR", YES, NO, YES, NO, YES, 7000 }, - {CTRY_ESTONIA, ETSI1_WORLD, "EE", "ESTONIA", YES, NO, YES, YES, YES, 7000 }, - {CTRY_FINLAND, ETSI1_WORLD, "FI", "FINLAND", YES, NO, YES, YES, YES, 7000 }, - {CTRY_FRANCE, ETSI1_WORLD, "FR", "FRANCE", YES, NO, YES, YES, YES, 7000 }, - {CTRY_FRANCE2, ETSI3_WORLD, "F2", "FRANCE_RES", YES, NO, YES, YES, YES, 7000 }, - {CTRY_GEORGIA, ETSI4_WORLD, "GE", "GEORGIA", YES, YES, YES, YES, YES, 7000 }, - {CTRY_GERMANY, ETSI1_WORLD, "DE", "GERMANY", YES, NO, YES, YES, YES, 7000 }, - {CTRY_GREECE, ETSI1_WORLD, "GR", "GREECE", YES, NO, YES, YES, YES, 7000 }, - {CTRY_GUATEMALA, FCC1_FCCA, "GT", "GUATEMALA", YES, YES, YES, YES, YES, 7000 }, - {CTRY_HONDURAS, NULL1_WORLD, "HN", "HONDURAS", YES, NO, YES, NO, YES, 7000 }, - {CTRY_HONG_KONG, FCC2_WORLD, "HK", "HONG KONG", YES, YES, YES, YES, YES, 7000 }, - {CTRY_HUNGARY, ETSI4_WORLD, "HU", "HUNGARY", YES, NO, YES, YES, YES, 7000 }, - {CTRY_ICELAND, ETSI1_WORLD, "IS", "ICELAND", YES, NO, YES, YES, YES, 7000 }, - {CTRY_INDIA, APL6_WORLD, "IN", "INDIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_INDONESIA, APL1_WORLD, "ID", "INDONESIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_IRAN, APL1_WORLD, "IR", "IRAN", YES, YES, YES, YES, YES, 7000 }, - {CTRY_IRELAND, ETSI1_WORLD, "IE", "IRELAND", YES, NO, YES, YES, YES, 7000 }, - {CTRY_ISRAEL, ETSI3_WORLD, "IL", "ISRAEL", YES, NO, YES, NO, YES, 7000 }, - {CTRY_ISRAEL2, NULL1_ETSIB, "ISR", "ISRAEL_RES", YES, NO, YES, NO, YES, 7000 }, - {CTRY_ITALY, ETSI1_WORLD, "IT", "ITALY", YES, NO, YES, YES, YES, 7000 }, - {CTRY_JAMAICA, ETSI1_WORLD, "JM", "JAMAICA", YES, NO, YES, YES, YES, 7000 }, - {CTRY_JAPAN, MKK1_MKKA, "JP", "JAPAN", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN1, MKK1_MKKB, "J1", "JAPAN1", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN2, MKK1_FCCA, "J2", "JAPAN2", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN3, MKK2_MKKA, "J3", "JAPAN3", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN4, MKK1_MKKA1, "J4", "JAPAN4", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN5, MKK1_MKKA2, "J5", "JAPAN5", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN6, MKK1_MKKC, "J6", "JAPAN6", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN7, MKK3_MKKB, "J7", "JAPAN7", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN8, MKK3_MKKA2, "J8", "JAPAN8", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN9, MKK3_MKKC, "J9", "JAPAN9", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN10, MKK4_MKKB, "J10", "JAPAN10", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN11, MKK4_MKKA2, "J11", "JAPAN11", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN12, MKK4_MKKC, "J12", "JAPAN12", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN13, MKK5_MKKB, "J13", "JAPAN13", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN14, MKK5_MKKA2, "J14", "JAPAN14", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN15, MKK5_MKKC, "J15", "JAPAN15", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN16, MKK6_MKKB, "J16", "JAPAN16", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN17, MKK6_MKKA2, "J17", "JAPAN17", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN18, MKK6_MKKC, "J18", "JAPAN18", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN19, MKK7_MKKB, "J19", "JAPAN19", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN20, MKK7_MKKA, "J20", "JAPAN20", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN21, MKK7_MKKC, "J21", "JAPAN21", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN22, MKK8_MKKB, "J22", "JAPAN22", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN23, MKK8_MKKA2, "J23", "JAPAN23", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN24, MKK8_MKKC, "J24", "JAPAN24", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN25, MKK3_MKKA, "J25", "JAPAN25", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN26, MKK3_MKKA1, "J26", "JAPAN26", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN27, MKK3_FCCA, "J27", "JAPAN27", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN28, MKK4_MKKA1, "J28", "JAPAN28", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN29, MKK4_FCCA, "J29", "JAPAN29", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN30, MKK6_MKKA1, "J30", "JAPAN30", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN31, MKK6_FCCA, "J31", "JAPAN31", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN32, MKK7_MKKA1, "J32", "JAPAN32", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN33, MKK7_FCCA, "J33", "JAPAN33", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN34, MKK9_MKKA, "J34", "JAPAN34", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN35, MKK10_MKKA, "J35", "JAPAN35", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN36, MKK4_MKKA, "J36", "JAPAN36", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN37, MKK9_FCCA, "J37", "JAPAN37", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN38, MKK9_MKKA1, "J38", "JAPAN38", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN39, MKK9_MKKC, "J39", "JAPAN39", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN40, MKK10_MKKA2, "J40", "JAPAN40", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN41, MKK10_FCCA, "J41", "JAPAN41", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN42, MKK10_MKKA1, "J42", "JAPAN42", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN43, MKK10_MKKC, "J43", "JAPAN43", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN44, MKK10_MKKA2, "J44", "JAPAN44", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN45, MKK11_MKKA, "J45", "JAPAN45", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN46, MKK11_FCCA, "J46", "JAPAN46", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN47, MKK11_MKKA1, "J47", "JAPAN47", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN48, MKK11_MKKC, "J48", "JAPAN48", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN49, MKK11_MKKA2, "J49", "JAPAN49", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN50, MKK12_MKKA, "J50", "JAPAN50", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN51, MKK12_FCCA, "J51", "JAPAN51", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN52, MKK12_MKKA1, "J52", "JAPAN52", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN53, MKK12_MKKC, "J53", "JAPAN53", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JAPAN54, MKK12_MKKA2, "J54", "JAPAN54", YES, NO, NO, NO, NO, 7000 }, - {CTRY_JORDAN, ETSI2_WORLD, "JO", "JORDAN", YES, NO, YES, NO, YES, 7000 }, - {CTRY_KAZAKHSTAN, NULL1_WORLD, "KZ", "KAZAKHSTAN", YES, NO, YES, NO, YES, 7000 }, - {CTRY_KOREA_NORTH, APL9_WORLD, "KP", "NORTH KOREA", YES, NO, NO, YES, YES, 7000 }, - {CTRY_KOREA_ROC, APL9_WORLD, "KR", "KOREA REPUBLIC", YES, NO, NO, NO, NO, 7000 }, - {CTRY_KOREA_ROC2, APL2_APLD, "K2", "KOREA REPUBLIC2", YES, NO, NO, NO, NO, 7000 }, - {CTRY_KOREA_ROC3, APL9_WORLD, "K3", "KOREA REPUBLIC3", YES, NO, NO, NO, NO, 7000 }, - {CTRY_KUWAIT, NULL1_WORLD, "KW", "KUWAIT", YES, NO, YES, NO, YES, 7000 }, - {CTRY_LATVIA, ETSI1_WORLD, "LV", "LATVIA", YES, NO, YES, YES, YES, 7000 }, - {CTRY_LEBANON, NULL1_WORLD, "LB", "LEBANON", YES, NO, YES, NO, YES, 7000 }, - {CTRY_LIECHTENSTEIN, ETSI1_WORLD, "LI", "LIECHTENSTEIN", YES, NO, YES, YES, YES, 7000 }, - {CTRY_LITHUANIA, ETSI1_WORLD, "LT", "LITHUANIA", YES, NO, YES, YES, YES, 7000 }, - {CTRY_LUXEMBOURG, ETSI1_WORLD, "LU", "LUXEMBOURG", YES, NO, YES, YES, YES, 7000 }, - {CTRY_MACAU, FCC2_WORLD, "MO", "MACAU", YES, YES, YES, YES, YES, 7000 }, - {CTRY_MACEDONIA, NULL1_WORLD, "MK", "MACEDONIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_MALAYSIA, APL8_WORLD, "MY", "MALAYSIA", NO, NO, NO, NO, NO, 7000 }, - {CTRY_MALTA, ETSI1_WORLD, "MT", "MALTA", YES, NO, YES, YES, YES, 7000 }, - {CTRY_MEXICO, FCC1_FCCA, "MX", "MEXICO", YES, YES, YES, YES, YES, 7000 }, - {CTRY_MONACO, ETSI4_WORLD, "MC", "MONACO", YES, YES, YES, YES, YES, 7000 }, - {CTRY_MOROCCO, NULL1_WORLD, "MA", "MOROCCO", YES, NO, YES, NO, YES, 7000 }, - {CTRY_NETHERLANDS, ETSI1_WORLD, "NL", "NETHERLANDS", YES, NO, YES, YES, YES, 7000 }, - {CTRY_NETHERLANDS_ANT, ETSI1_WORLD, "AN", "NETHERLANDS-ANTILLES", YES, NO, YES, YES, YES, 7000 }, - {CTRY_NEW_ZEALAND, FCC2_ETSIC, "NZ", "NEW ZEALAND", YES, NO, YES, NO, YES, 7000 }, - {CTRY_NORWAY, ETSI1_WORLD, "NO", "NORWAY", YES, NO, YES, YES, YES, 7000 }, - {CTRY_OMAN, APL6_WORLD, "OM", "OMAN", YES, NO, YES, NO, YES, 7000 }, - {CTRY_PAKISTAN, NULL1_WORLD, "PK", "PAKISTAN", YES, NO, YES, NO, YES, 7000 }, - {CTRY_PANAMA, FCC1_FCCA, "PA", "PANAMA", YES, YES, YES, YES, YES, 7000 }, - {CTRY_PERU, APL1_WORLD, "PE", "PERU", YES, NO, YES, NO, YES, 7000 }, - {CTRY_PHILIPPINES, APL1_WORLD, "PH", "PHILIPPINES", YES, YES, YES, YES, YES, 7000 }, - {CTRY_POLAND, ETSI1_WORLD, "PL", "POLAND", YES, NO, YES, YES, YES, 7000 }, - {CTRY_PORTUGAL, ETSI1_WORLD, "PT", "PORTUGAL", YES, NO, YES, YES, YES, 7000 }, - {CTRY_PUERTO_RICO, FCC1_FCCA, "PR", "PUERTO RICO", YES, YES, YES, YES, YES, 7000 }, - {CTRY_QATAR, NULL1_WORLD, "QA", "QATAR", YES, NO, YES, NO, YES, 7000 }, - {CTRY_ROMANIA, NULL1_WORLD, "RO", "ROMANIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_RUSSIA, NULL1_WORLD, "RU", "RUSSIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_SAUDI_ARABIA, NULL1_WORLD, "SA", "SAUDI ARABIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_SERBIA_MONT, ETSI1_WORLD, "CS", "SERBIA & MONTENEGRO", YES, NO, YES, YES, YES, 7000 }, - {CTRY_SINGAPORE, APL6_WORLD, "SG", "SINGAPORE", YES, YES, YES, YES, YES, 7000 }, - {CTRY_SLOVAKIA, ETSI1_WORLD, "SK", "SLOVAK REPUBLIC", YES, NO, YES, YES, YES, 7000 }, - {CTRY_SLOVENIA, ETSI1_WORLD, "SI", "SLOVENIA", YES, NO, YES, YES, YES, 7000 }, - {CTRY_SOUTH_AFRICA, FCC3_WORLD, "ZA", "SOUTH AFRICA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_SPAIN, ETSI1_WORLD, "ES", "SPAIN", YES, NO, YES, YES, YES, 7000 }, - {CTRY_SRILANKA, FCC3_WORLD, "LK", "SRI LANKA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_SWEDEN, ETSI1_WORLD, "SE", "SWEDEN", YES, NO, YES, YES, YES, 7000 }, - {CTRY_SWITZERLAND, ETSI1_WORLD, "CH", "SWITZERLAND", YES, NO, YES, YES, YES, 7000 }, - {CTRY_SYRIA, NULL1_WORLD, "SY", "SYRIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_TAIWAN, APL3_FCCA, "TW", "TAIWAN", YES, YES, YES, YES, YES, 7000 }, - {CTRY_THAILAND, NULL1_WORLD, "TH", "THAILAND", YES, NO, YES, NO, YES, 7000 }, - {CTRY_TRINIDAD_Y_TOBAGO, ETSI4_WORLD, "TT", "TRINIDAD & TOBAGO", YES, NO, YES, NO, YES, 7000 }, - {CTRY_TUNISIA, ETSI3_WORLD, "TN", "TUNISIA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_TURKEY, ETSI3_WORLD, "TR", "TURKEY", YES, NO, YES, NO, YES, 7000 }, - {CTRY_UKRAINE, NULL1_WORLD, "UA", "UKRAINE", YES, NO, YES, NO, YES, 7000 }, - {CTRY_UAE, NULL1_WORLD, "AE", "UNITED ARAB EMIRATES", YES, NO, YES, NO, YES, 7000 }, - {CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB", "UNITED KINGDOM", YES, NO, YES, NO, YES, 7000 }, - {CTRY_UNITED_STATES, FCC3_FCCA, "US", "UNITED STATES", YES, YES, YES, YES, YES, 5825 }, - {CTRY_UNITED_STATES_FCC49, FCC4_FCCA, "PS", "UNITED STATES (PUBLIC SAFETY)", YES, YES, YES, YES, YES, 7000 }, - {CTRY_URUGUAY, FCC1_WORLD, "UY", "URUGUAY", YES, NO, YES, NO, YES, 7000 }, - {CTRY_UZBEKISTAN, FCC3_FCCA, "UZ", "UZBEKISTAN", YES, YES, YES, YES, YES, 7000 }, - {CTRY_VENEZUELA, APL2_ETSIC, "VE", "VENEZUELA", YES, NO, YES, NO, YES, 7000 }, - {CTRY_VIET_NAM, NULL1_WORLD, "VN", "VIET NAM", YES, NO, YES, NO, YES, 7000 }, - {CTRY_YEMEN, NULL1_WORLD, "YE", "YEMEN", YES, NO, YES, NO, YES, 7000 }, - {CTRY_ZIMBABWE, NULL1_WORLD, "ZW", "ZIMBABWE", YES, NO, YES, NO, YES, 7000 } -}; - -typedef struct RegDmnFreqBand { - u16_t lowChannel; /* Low channel center in MHz */ - u16_t highChannel; /* High Channel center in MHz */ - u8_t powerDfs; /* Max power (dBm) for channel - range when using DFS */ - u8_t antennaMax; /* Max allowed antenna gain */ - u8_t channelBW; /* Bandwidth of the channel */ - u8_t channelSep; /* Channel separation within - the band */ - u64_t useDfs; /* Use DFS in the RegDomain - if corresponding bit is set */ - u64_t usePassScan; /* Use Passive Scan in the RegDomain - if corresponding bit is set */ - u8_t regClassId; /* Regulatory class id */ - u8_t useExtChanDfs; /* Regulatory class id */ -} REG_DMN_FREQ_BAND; - -/* Bit masks for DFS per regdomain */ - -enum { - NO_DFS = 0x0000000000000000ULL, - DFS_FCC3 = 0x0000000000000001ULL, - DFS_ETSI = 0x0000000000000002ULL, - DFS_MKK4 = 0x0000000000000004ULL, -}; - -/* The table of frequency bands is indexed by a bitmask. The ordering - * must be consistent with the enum below. When adding a new - * frequency band, be sure to match the location in the enum with the - * comments - */ - -/* - * 5GHz 11A channel tags - */ - -enum { - F1_4915_4925, - F1_4935_4945, - F1_4920_4980, - F1_4942_4987, - F1_4945_4985, - F1_4950_4980, - F1_5035_5040, - F1_5040_5080, - F1_5055_5055, - - F1_5120_5240, - - F1_5170_5230, - F2_5170_5230, - - F1_5180_5240, - F2_5180_5240, - F3_5180_5240, - F4_5180_5240, - F5_5180_5240, - F6_5180_5240, - F7_5180_5240, - - F1_5180_5320, - - F1_5240_5280, - - F1_5260_5280, - - F1_5260_5320, - F2_5260_5320, - F3_5260_5320, - F4_5260_5320, - F5_5260_5320, - F6_5260_5320, - F7_5260_5320, - - F1_5260_5700, - - F1_5280_5320, - - F1_5500_5580, - - F1_5500_5620, - - F1_5500_5700, - F2_5500_5700, - F3_5500_5700, - F4_5500_5700, - - F1_5660_5700, - - F1_5745_5805, - F2_5745_5805, - F3_5745_5805, - - F1_5745_5825, - F2_5745_5825, - F3_5745_5825, - F4_5745_5825, - F5_5745_5825, - F6_5745_5825, - - W1_4920_4980, - W1_5040_5080, - W1_5170_5230, - W1_5180_5240, - W1_5260_5320, - W1_5745_5825, - W1_5500_5700, - W2_5260_5320, - W2_5180_5240, - W2_5825_5825, -}; - -static REG_DMN_FREQ_BAND regDmn5GhzFreq[] = { - { 4915, 4925, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 16, 0 }, /* F1_4915_4925 */ - { 4935, 4945, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 16, 0 }, /* F1_4935_4945 */ - { 4920, 4980, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2, 7, 0 }, /* F1_4920_4980 */ - { 4942, 4987, 27, 6, 5, 5, DFS_FCC3, PSCAN_FCC, 0, 0 }, /* F1_4942_4987 */ - { 4945, 4985, 30, 6, 10, 5, DFS_FCC3, PSCAN_FCC, 0, 0 }, /* F1_4945_4985 */ - { 4950, 4980, 33, 6, 20, 5, DFS_FCC3, PSCAN_FCC, 0, 0 }, /* F1_4950_4980 */ - { 5035, 5040, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 12, 0 }, /* F1_5035_5040 */ - { 5040, 5080, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2, 2, 0 }, /* F1_5040_5080 */ - { 5055, 5055, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 12, 0 }, /* F1_5055_5055 */ - - { 5120, 5240, 5, 6, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F1_5120_5240 */ - - { 5170, 5230, 23, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2, 1, 0 }, /* F1_5170_5230 */ - { 5170, 5230, 20, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2, 1, 0 }, /* F2_5170_5230 */ - - { 5180, 5240, 15, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F1_5180_5240 */ - { 5180, 5240, 17, 6, 20, 20, NO_DFS, PSCAN_FCC, 1, 0 }, /* F2_5180_5240 */ - { 5180, 5240, 18, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F3_5180_5240 */ - { 5180, 5240, 20, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F4_5180_5240 */ - { 5180, 5240, 23, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F5_5180_5240 */ - { 5180, 5240, 23, 6, 20, 20, NO_DFS, PSCAN_FCC, 0, 0 }, /* F6_5180_5240 */ - { 5180, 5240, 23, 6, 20, 20, NO_DFS, NO_PSCAN, 0 }, /* F7_5180_5240 */ - - { 5180, 5320, 20, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0, 0 }, /* F1_5180_5320 */ - - { 5240, 5280, 23, 0, 20, 20, DFS_FCC3, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F1_5240_5280 */ - - { 5260, 5280, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F1_5260_5280 */ - - { 5260, 5320, 18, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F1_5260_5320 */ - - { 5260, 5320, 20, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_FCC | PSCAN_ETSI | PSCAN_MKK3 , 0, 0 }, - /* F2_5260_5320 */ - - { 5260, 5320, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 2, 0 }, /* F3_5260_5320 */ - { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 2, 0 }, /* F4_5260_5320 */ - { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 0, 0 }, /* F5_5260_5320 */ - { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F6_5260_5320 */ - { 5260, 5320, 17, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0, 0 }, /* F7_5260_5320 */ - - { 5260, 5700, 5, 6, 20, 20, DFS_FCC3 | DFS_ETSI, NO_PSCAN, 0, 0 }, /* F1_5260_5700 */ - - { 5280, 5320, 17, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 0, 0 }, /* F1_5280_5320 */ - - { 5500, 5580, 23, 6, 20, 20, DFS_FCC3, PSCAN_FCC, 0}, /* F1_5500_5580 */ - - { 5500, 5620, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0, 0 }, /* F1_5500_5620 */ - - { 5500, 5700, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 4, 0 }, /* F1_5500_5700 */ - { 5500, 5700, 27, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F2_5500_5700 */ - { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F3_5500_5700 */ - { 5500, 5700, 20, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_MKK3 | PSCAN_FCC, 0, 0 }, - /* F4_5500_5700 */ - - { 5660, 5700, 23, 6, 20, 20, DFS_FCC3, PSCAN_FCC, 0}, /* F1_5660_5700 */ - - { 5745, 5805, 23, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F1_5745_5805 */ - { 5745, 5805, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F2_5745_5805 */ - { 5745, 5805, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0, 0 }, /* F3_5745_5805 */ - { 5745, 5825, 5, 6, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F1_5745_5825 */ - { 5745, 5825, 17, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F2_5745_5825 */ - { 5745, 5825, 20, 0, 20, 20, DFS_ETSI, NO_PSCAN, 0, 0 }, /* F3_5745_5825 */ - { 5745, 5825, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F4_5745_5825 */ - { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 3, 0 }, /* F5_5745_5825 */ - { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F6_5745_5825 */ - - /* - * Below are the world roaming channels - * All WWR domains have no power limit, instead use the card's CTL - * or max power settings. - */ - { 4920, 4980, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0, 0 }, /* W1_4920_4980 */ - { 5040, 5080, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0 }, /* W1_5040_5080 */ - { 5170, 5230, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0 }, /* W1_5170_5230 */ - { 5180, 5240, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0 }, /* W1_5180_5240 */ - { 5260, 5320, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0 }, /* W1_5260_5320 */ - { 5745, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0, 0 }, /* W1_5745_5825 */ - { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0 }, /* W1_5500_5700 */ - { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* W2_5260_5320 */ - { 5180, 5240, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* W2_5180_5240 */ - { 5825, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0, 0 }, /* W2_5825_5825 */ -}; -/* - * 5GHz Turbo (dynamic & static) tags - */ - -enum { - T1_5130_5210, - T1_5250_5330, - T1_5370_5490, - T1_5530_5650, - - T1_5150_5190, - T1_5230_5310, - T1_5350_5470, - T1_5510_5670, - - T1_5200_5240, - T2_5200_5240, - T1_5210_5210, - T2_5210_5210, - - T1_5280_5280, - T2_5280_5280, - T1_5250_5250, - T1_5290_5290, - T1_5250_5290, - T2_5250_5290, - - T1_5540_5660, - T1_5760_5800, - T2_5760_5800, - - T1_5765_5805, - - WT1_5210_5250, - WT1_5290_5290, - WT1_5540_5660, - WT1_5760_5800, -}; - -/* - * 2GHz 11b channel tags - */ -enum { - F1_2312_2372, - F2_2312_2372, - - F1_2412_2472, - F2_2412_2472, - F3_2412_2472, - - F1_2412_2462, - F2_2412_2462, - - F1_2432_2442, - - F1_2457_2472, - - F1_2467_2472, - - F1_2484_2484, - F2_2484_2484, - - F1_2512_2732, - - W1_2312_2372, - W1_2412_2412, - W1_2417_2432, - W1_2437_2442, - W1_2447_2457, - W1_2462_2462, - W1_2467_2467, - W2_2467_2467, - W1_2472_2472, - W2_2472_2472, - W1_2484_2484, - W2_2484_2484, -}; - - -/* - * 2GHz 11g channel tags - */ - -enum { - G1_2312_2372, - G2_2312_2372, - - G1_2412_2472, - G2_2412_2472, - G3_2412_2472, - - G1_2412_2462, - G2_2412_2462, - - G1_2432_2442, - - G1_2457_2472, - - G1_2512_2732, - - G1_2467_2472 , - - WG1_2312_2372, - WG1_2412_2412, - WG1_2417_2432, - WG1_2437_2442, - WG1_2447_2457, - WG1_2462_2462, - WG1_2467_2467, - WG2_2467_2467, - WG1_2472_2472, - WG2_2472_2472, - -}; -static REG_DMN_FREQ_BAND regDmn2Ghz11gFreq[] = { - { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2312_2372 */ - { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G2_2312_2372 */ - - { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2412_2472 */ - { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G, 0, 0}, /* G2_2412_2472 */ - { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G3_2412_2472 */ - - { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2412_2462 */ - { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G, 0, 0}, /* G2_2412_2462 */ - { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2432_2442 */ - - { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2457_2472 */ - - { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2512_2732 */ - - { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA, 0, 0 }, /* G1_2467_2472 */ - - /* - * WWR open up the power to 20dBm - */ - - { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2312_2372 */ - { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2412_2412 */ - { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2417_2432 */ - { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2437_2442 */ - { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2447_2457 */ - { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2462_2462 */ - { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0, 0}, /* WG1_2467_2467 */ - { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0, 0}, /* WG2_2467_2467 */ - { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0, 0}, /* WG1_2472_2472 */ - { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0, 0}, /* WG2_2472_2472 */ -}; -/* - * 2GHz Dynamic turbo tags - */ - -enum { - T1_2312_2372, - T1_2437_2437, - T2_2437_2437, - T3_2437_2437, - T1_2512_2732 -}; - -/* - * 2GHz 11n frequency tags - */ -enum { - NG1_2422_2452, - NG2_2422_2452, - NG3_2422_2452, - - NG_DEMO_ALL_CHANNELS, -}; - -/* - * 5GHz 11n frequency tags - */ -enum { - NA1_5190_5230, - NA2_5190_5230, - NA3_5190_5230, - NA4_5190_5230, - NA5_5190_5230, - - NA1_5270_5270, - - NA1_5270_5310, - NA2_5270_5310, - NA3_5270_5310, - NA4_5270_5310, - - NA1_5310_5310, - - NA1_5510_5630, - - NA1_5510_5670, - NA2_5510_5670, - NA3_5510_5670, - - NA1_5755_5795, - NA2_5755_5795, - NA3_5755_5795, - NA4_5755_5795, - NA5_5755_5795, - - NA1_5795_5795, - - NA_DEMO_ALL_CHANNELS, -}; - -typedef struct regDomain { - u16_t regDmnEnum; /* value from EnumRd table */ - u8_t conformanceTestLimit; - u64_t dfsMask; /* DFS bitmask for 5Ghz tables */ - u64_t pscan; /* Bitmask for passive scan */ - u32_t flags; /* Requirement flags (AdHoc disallow, noise - floor cal needed, etc) */ - u64_t chan11a[BMLEN];/* 128 bit bitmask for channel/band - selection */ - u64_t chan11a_turbo[BMLEN];/* 128 bit bitmask for channel/band - selection */ - u64_t chan11a_dyn_turbo[BMLEN]; /* 128 bit bitmask for channel/band - selection */ - u64_t chan11b[BMLEN];/* 128 bit bitmask for channel/band - selection */ - u64_t chan11g[BMLEN];/* 128 bit bitmask for channel/band - selection */ - u64_t chan11g_turbo[BMLEN];/* 128 bit bitmask for channel/band - selection */ - u64_t chan11ng[BMLEN];/* 128 bit bitmask for 11n in 2GHz */ - u64_t chan11na[BMLEN];/* 128 bit bitmask for 11n in 5GHz */ -} REG_DOMAIN; - -static REG_DOMAIN regDomains[] = { - - {DEBUG_REG_DMN, FCC, NO_DFS, NO_PSCAN, NO_REQ, - BM(F1_5120_5240, F1_5260_5700, F1_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T1_5130_5210, T1_5250_5330, T1_5370_5490, T1_5530_5650, T1_5150_5190, T1_5230_5310, T1_5350_5470, T1_5510_5670, -1, -1, -1, -1), - BM(T1_5200_5240, T1_5280_5280, T1_5540_5660, T1_5765_5805, -1, -1, -1, -1, -1, -1, -1, -1), - BM(F1_2312_2372, F1_2412_2472, F1_2484_2484, F1_2512_2732, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G1_2312_2372, G1_2412_2472, G1_2512_2732, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T1_2312_2372, T1_2437_2437, T1_2512_2732, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(NG_DEMO_ALL_CHANNELS, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(NA_DEMO_ALL_CHANNELS, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {APL1, ETSI, NO_DFS, NO_PSCAN, NO_REQ, - BM(F4_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {APL2, ETSI, NO_DFS, NO_PSCAN, NO_REQ, - BM(F1_5745_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA3_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {APL3, FCC, NO_DFS, NO_PSCAN, NO_REQ, - BM(F1_5280_5320, F2_5745_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA1_5310_5310, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {APL4, ETSI, NO_DFS, NO_PSCAN, NO_REQ, - BM(F4_5180_5240, F3_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {APL5, ETSI, NO_DFS, NO_PSCAN, NO_REQ, - BM(F2_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA1_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {APL6, ETSI, DFS_ETSI, PSCAN_FCC_T | PSCAN_FCC , NO_REQ, - BM(F4_5180_5240, F2_5260_5320, F3_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_5210_5210, T1_5250_5290, T1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5270_5310, NA2_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {APL7, FCC, NO_DFS, PSCAN_FCC_T | PSCAN_FCC , NO_REQ, - BM(F7_5260_5320, F4_5500_5700, F3_5745_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA1_5310_5310, NA2_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - {APL8, ETSI, NO_DFS, NO_PSCAN, DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, - BM(F6_5260_5320, F4_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5270_5310, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {APL9, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB, - BM(F1_5180_5320, F1_5500_5620, F3_5745_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5270_5310, NA1_5510_5630, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {ETSI1, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BM(W2_5180_5240, F2_5260_5320, F2_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5270_5310, NA2_5510_5670, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {ETSI2, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BM(F3_5180_5240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA3_5190_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {ETSI3, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BM(W2_5180_5240, F2_5260_5320, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5270_5310, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {ETSI4, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BM(F3_5180_5240, F1_5260_5320, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA3_5190_5230, NA1_5270_5310, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {ETSI5, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BM(F1_5180_5240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA1_5190_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {ETSI6, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BM(F5_5180_5240, F1_5260_5280, F3_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA5_5190_5230, NA1_5270_5270, NA3_5510_5670, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {FCC1, FCC, NO_DFS, NO_PSCAN, NO_REQ, - BM(F2_5180_5240, F4_5260_5320, F5_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T1_5210_5210, T2_5250_5290, T2_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T1_5200_5240, T1_5280_5280, T1_5765_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA2_5190_5230, NA3_5270_5310, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {FCC2, FCC, NO_DFS, NO_PSCAN, NO_REQ, - BM(F6_5180_5240, F5_5260_5320, F6_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_5200_5240, T1_5280_5280, T1_5765_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA5_5190_5230, NA3_5270_5310, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {FCC3, FCC, DFS_FCC3, PSCAN_FCC | PSCAN_FCC_T, NO_REQ, - BM(F2_5180_5240, F3_5260_5320, F1_5500_5700, F5_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T1_5210_5210, T1_5250_5250, T1_5290_5290, T2_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T1_5200_5240, T2_5280_5280, T1_5540_5660, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA2_5190_5230, NA2_5270_5310, NA3_5510_5670, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {FCC4, FCC, DFS_FCC3, PSCAN_FCC | PSCAN_FCC_T, NO_REQ, - BM(F1_4942_4987, F1_4945_4985, F1_4950_4980, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO}, - - {FCC5, FCC, NO_DFS, NO_PSCAN, NO_REQ, - BM(F2_5180_5240, F5_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA2_5190_5230, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {FCC6, FCC, DFS_FCC3, PSCAN_FCC, NO_REQ, - BM(F7_5180_5240, F5_5260_5320, F1_5500_5580, F1_5660_5700, F6_5745_5825, -1, -1, -1, -1, -1, -1, -1), - BM(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_5200_5240, T1_5280_5280, T1_5765_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA5_5190_5230, NA5_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - {MKK1, MKK, NO_DFS, PSCAN_MKK1, DISALLOW_ADHOC_11A_TURB, - BM(F1_5170_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO}, - - {MKK2, MKK, NO_DFS, PSCAN_MKK2, DISALLOW_ADHOC_11A_TURB, - BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F1_5170_5230, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO}, - - /* UNI-1 even */ - {MKK3, MKK, NO_DFS, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB, - BM(F4_5180_5240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - /* UNI-1 even + UNI-2 */ - {MKK4, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB, - BM(F4_5180_5240, F2_5260_5320, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5270_5310, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - /* UNI-1 even + UNI-2 + mid-band */ - {MKK5, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB, - BM(F4_5180_5240, F2_5260_5320, F4_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5270_5310, NA1_5510_5670, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - /* UNI-1 odd + even */ - {MKK6, MKK, DFS_MKK4, PSCAN_MKK1, DISALLOW_ADHOC_11A_TURB, - BM(F2_5170_5230, F4_5180_5240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - /* UNI-1 odd + UNI-1 even + UNI-2 */ - {MKK7, MKK, DFS_MKK4, PSCAN_MKK1 | PSCAN_MKK3 , DISALLOW_ADHOC_11A_TURB, - BM(F2_5170_5230, F4_5180_5240, F2_5260_5320, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5270_5310, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - /* UNI-1 odd + UNI-1 even + UNI-2 + mid-band */ - {MKK8, MKK, DFS_MKK4, PSCAN_MKK1 | PSCAN_MKK3 , DISALLOW_ADHOC_11A_TURB, - BM(F2_5170_5230, F4_5180_5240, F2_5260_5320, F4_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BM(NA4_5190_5230, NA2_5270_5310, NA1_5510_5670, -1, -1, -1, -1, -1, -1, -1, -1, -1)}, - - /* UNI-1 even + 4.9 GHZ */ - {MKK9, MKK, NO_DFS, NO_PSCAN, DISALLOW_ADHOC_11A_TURB, - BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F4_5180_5240, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO}, - - /* UNI-1 even + UNI-2 + 4.9 GHZ */ - {MKK10, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB, - BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F4_5180_5240, F2_5260_5320, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO}, - - /* UNI-1 even + UNI-2 + 4.9 GHZ + mid-band */ - {MKK11, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB, - BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F4_5180_5240, F2_5260_5320, F4_5500_5700, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO}, - - /* UNI-1 even + UNI-1 odd + UNI-2 + 4.9 GHZ + mid-band */ - {MKK12, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB, - BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F1_5170_5230, F4_5180_5240, F2_5260_5320, F4_5500_5700, -1, -1), - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO}, - - /* Defined here to use when 2G channels are authorised for country K2 */ - {APLD, NO_CTL, NO_DFS, NO_PSCAN, NO_REQ, - BMZERO, - BMZERO, - BMZERO, - BM(F2_2312_2372, F2_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G2_2312_2372, G2_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BMZERO}, - - {ETSIA, NO_CTL, NO_DFS, PSCAN_ETSIA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BMZERO, - BMZERO, - BMZERO, - BM(F1_2457_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G1_2457_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {ETSIB, ETSI, NO_DFS, PSCAN_ETSIB, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BMZERO, - BMZERO, - BMZERO, - BM(F1_2432_2442, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G1_2432_2442, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {ETSIC, ETSI, NO_DFS, PSCAN_ETSIC, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, - BMZERO, - BMZERO, - BMZERO, - BM(F3_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G3_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {FCCA, FCC, NO_DFS, NO_PSCAN, NO_REQ, - BMZERO, - BMZERO, - BMZERO, - BM(F1_2412_2462, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G1_2412_2462, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(NG2_2422_2452, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO}, - - {MKKA, MKK, NO_DFS, PSCAN_MKKA | PSCAN_MKKA_G | PSCAN_MKKA1 | PSCAN_MKKA1_G | PSCAN_MKKA2 | PSCAN_MKKA2_G, DISALLOW_ADHOC_11A_TURB, - BMZERO, - BMZERO, - BMZERO, - BM(F2_2412_2462, F1_2467_2472, F2_2484_2484, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G2_2412_2462, G1_2467_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(NG1_2422_2452, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO}, - - {MKKC, MKK, NO_DFS, NO_PSCAN, NO_REQ, - BMZERO, - BMZERO, - BMZERO, - BM(F2_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G2_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(NG1_2422_2452, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO}, - - {WORLD, ETSI, NO_DFS, NO_PSCAN, NO_REQ, - BMZERO, - BMZERO, - BMZERO, - BM(F2_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(G2_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(T2_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BM(NG1_2422_2452, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO}, - - {WOR0_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D, - BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1), - BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2472_2472, W1_2417_2432, W1_2447_2457, W1_2467_2467, W1_2484_2484, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WOR01_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D, - BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1), - BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2417_2432, W1_2447_2457, -1, -1, -1, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2417_2432, WG1_2447_2457, -1, -1, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WOR02_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D, - BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1), - BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2472_2472, W1_2417_2432, W1_2447_2457, W1_2467_2467, -1, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {EU1_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D, - BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1), - BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W2_2472_2472, W1_2417_2432, W1_2447_2457, W2_2467_2467, -1, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG2_2472_2472, WG1_2417_2432, WG1_2447_2457, WG2_2467_2467, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WOR1_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A, - BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2472_2472, W1_2417_2432, W1_2447_2457, W1_2467_2467, W1_2484_2484, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WOR2_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A, - BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1), - BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2472_2472, W1_2417_2432, W1_2447_2457, W1_2467_2467, W1_2484_2484, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WOR3_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D, - BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1), - BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2472_2472, W1_2417_2432, W1_2447_2457, W1_2467_2467, -1, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WOR4_WORLD, NO_CTL, DFS_FCC3, PSCAN_WWR, ADHOC_NO_11A, - BM(W2_5260_5320, W2_5180_5240, F2_5745_5805, W2_5825_5825, -1, -1, -1, -1, -1, -1, -1, -1), - BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2417_2432, W1_2447_2457, -1, -1, -1, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2417_2432, WG1_2447_2457, -1, -1, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WOR5_ETSIC, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A, - BM(W1_5260_5320, W2_5180_5240, F6_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W2_2472_2472, W1_2417_2432, W1_2447_2457, W2_2467_2467, -1, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WOR9_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A, - BM(W1_5260_5320, W1_5180_5240, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1), - BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2417_2432, W1_2447_2457, -1, -1, -1, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2417_2432, WG1_2447_2457, -1, -1, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {WORA_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A, - BM(W1_5260_5320, W1_5180_5240, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO, - BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2472_2472, W1_2417_2432, W1_2447_2457, W1_2467_2467, -1, -1, -1, -1, -1), - BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1), - BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), - BMZERO, - BMZERO}, - - {NULL1, NO_CTL, NO_DFS, NO_PSCAN, NO_REQ, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO, - BMZERO}, -}; - -struct cmode { - u16_t mode; - u32_t flags; -}; - -static const struct cmode modes[] = { - { HAL_MODE_TURBO, CHANNEL_ST}, /* TURBO means 11a Static Turbo */ - { HAL_MODE_11A, CHANNEL_A}, - { HAL_MODE_11B, CHANNEL_B}, - { HAL_MODE_11G, CHANNEL_G}, - { HAL_MODE_11G_TURBO, CHANNEL_108G}, - { HAL_MODE_11A_TURBO, CHANNEL_108A}, - { HAL_MODE_11NA, CHANNEL_A_HT40}, - { HAL_MODE_11NA, CHANNEL_A_HT20}, - { HAL_MODE_11NG, CHANNEL_G_HT40}, - { HAL_MODE_11NG, CHANNEL_G_HT20}, -}; - -/* - * Return the Wireless Mode Regulatory Domain based - * on the country code and the wireless mode. - */ -u8_t GetWmRD(u16_t regionCode, u16_t channelFlag, REG_DOMAIN *rd) -{ - s16_t i, found, regDmn; - u64_t flags = NO_REQ; - REG_DMN_PAIR_MAPPING *regPair = NULL; - - for (i = 0, found = 0; (i < ARRAY_SIZE(regDomainPairs)) && (!found); i++) { - if (regDomainPairs[i].regDmnEnum == regionCode) { - regPair = ®DomainPairs[i]; - found = 1; - } - } - if (!found) { - zm_debug_msg1("Failed to find reg domain pair ", regionCode); - return FALSE; - } - - if (channelFlag & ZM_REG_FLAG_CHANNEL_2GHZ) { - regDmn = regPair->regDmn2GHz; - flags = regPair->flags2GHz; - } else { - regDmn = regPair->regDmn5GHz; - flags = regPair->flags5GHz; - } - - /* - * We either started with a unitary reg domain or we've found the - * unitary reg domain of the pair - */ - - for (i = 0 ; i < ARRAY_SIZE(regDomains) ; i++) { - if (regDomains[i].regDmnEnum == regDmn) { - if (rd != NULL) { - zfMemoryCopy((u8_t *)rd, (u8_t *)®Domains[i], - sizeof(REG_DOMAIN)); - } - } - } - rd->pscan &= regPair->pscanMask; - rd->flags = (u32_t)flags; - return TRUE; -} - -/* - * Test to see if the bitmask array is all zeros - */ -u8_t isChanBitMaskZero(u64_t *bitmask) -{ - u16_t i; - - for (i = 0; i < BMLEN; i++) { - if (bitmask[i] != 0) - return FALSE; - } - return TRUE; -} - -u8_t IS_BIT_SET(u32_t bit, u64_t *bitmask) -{ - u32_t byteOffset, bitnum; - u64_t val; - - byteOffset = bit/64; - bitnum = bit - byteOffset*64; - val = ((u64_t) 1) << bitnum; - if (bitmask[byteOffset] & val) - return TRUE; - else - return FALSE; -} - - -void zfHpGetRegulationTable(zdev_t *dev, u16_t regionCode, u16_t c_lo, u16_t c_hi) -{ - REG_DOMAIN rd5GHz, rd2GHz; - const struct cmode *cm; - s16_t next = 0, b; - struct zsHpPriv *hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - - zmw_declare_for_critical_section(); - - if (!GetWmRD(regionCode, ~ZM_REG_FLAG_CHANNEL_2GHZ, &rd5GHz)) { - zm_debug_msg1("couldn't find unitary 5GHz reg domain for Region Code ", regionCode); - return; - } - if (!GetWmRD(regionCode, ZM_REG_FLAG_CHANNEL_2GHZ, &rd2GHz)) { - zm_debug_msg1("couldn't find unitary 2GHz reg domain for Region Code ", regionCode); - return; - } - if (wd->regulationTable.regionCode == regionCode) { - zm_debug_msg1("current region code is the same with Region Code ", regionCode); - return; - } else - wd->regulationTable.regionCode = regionCode; - - next = 0; - - zmw_enter_critical_section(dev); - - for (cm = modes; cm < &modes[ARRAY_SIZE(modes)]; cm++) { - u16_t c; - u64_t *channelBM = NULL; - REG_DOMAIN *rd = NULL; - REG_DMN_FREQ_BAND *fband = NULL, *freqs = NULL; - - switch (cm->mode) { - case HAL_MODE_TURBO: - /* we don't have turbo mode so we disable it - //zm_debug_msg0("CWY - HAL_MODE_TURBO"); */ - channelBM = NULL; - /* rd = &rd5GHz; - channelBM = rd->chan11a_turbo; - freqs = ®Dmn5GhzTurboFreq[0]; - ctl = rd->conformanceTestLimit | CTL_TURBO; */ - break; - case HAL_MODE_11A: - if ((hpPriv->OpFlags & 0x1) != 0) { - rd = &rd5GHz; - channelBM = rd->chan11a; - freqs = ®Dmn5GhzFreq[0]; - c_lo = 4920; /* from channel 184 */ - c_hi = 5825; /* to channel 165 */ - /* ctl = rd->conformanceTestLimit; - zm_debug_msg2("CWY - HAL_MODE_11A, channelBM = 0x", *channelBM); */ - } - /* else - channelBM = NULL; - */ - break; - case HAL_MODE_11B: - /* Disable 11B mode because it only has difference with 11G in PowerDFS Data, - and we don't use this now. - zm_debug_msg0("CWY - HAL_MODE_11B"); */ - channelBM = NULL; - /* rd = &rd2GHz; - channelBM = rd->chan11b; - freqs = ®Dmn2GhzFreq[0]; - ctl = rd->conformanceTestLimit | CTL_11B; - zm_debug_msg2("CWY - HAL_MODE_11B, channelBM = 0x", *channelBM); */ - break; - case HAL_MODE_11G: - if ((hpPriv->OpFlags & 0x2) != 0) { - rd = &rd2GHz; - channelBM = rd->chan11g; - freqs = ®Dmn2Ghz11gFreq[0]; - c_lo = 2412; /* from channel 1 */ - /* c_hi = 2462; to channel 11 */ - c_hi = 2472; /* to channel 13 */ - /* ctl = rd->conformanceTestLimit | CTL_11G; */ - /* zm_debug_msg2("CWY - HAL_MODE_11G, channelBM = 0x", *channelBM); */ - } - /* else - channelBM = NULL; - */ - break; - case HAL_MODE_11G_TURBO: - /* we don't have turbo mode so we disable it - zm_debug_msg0("CWY - HAL_MODE_11G_TURBO"); */ - channelBM = NULL; - /* rd = &rd2GHz; - channelBM = rd->chan11g_turbo; - freqs = ®Dmn2Ghz11gTurboFreq[0]; - ctl = rd->conformanceTestLimit | CTL_108G; */ - break; - case HAL_MODE_11A_TURBO: - /* we don't have turbo mode so we disable it - zm_debug_msg0("CWY - HAL_MODE_11A_TURBO"); */ - channelBM = NULL; - /* rd = &rd5GHz; - channelBM = rd->chan11a_dyn_turbo; - freqs = ®Dmn5GhzTurboFreq[0]; - ctl = rd->conformanceTestLimit | CTL_108G; */ - break; - default: - zm_debug_msg1("Unkonwn HAL mode ", cm->mode); - continue; - } - - if (channelBM == NULL) { - /* zm_debug_msg0("CWY - channelBM is NULL"); */ - continue; - } - - if (isChanBitMaskZero(channelBM)) { - /* zm_debug_msg0("CWY - BitMask is Zero"); */ - continue; - } - - /* RAY:Is it ok?? */ - if (freqs == NULL) - continue; - - for (b = 0 ; b < 64*BMLEN ; b++) { - if (IS_BIT_SET(b, channelBM)) { - fband = &freqs[b]; - - /* zm_debug_msg1("CWY - lowChannel = ", fband->lowChannel); - zm_debug_msg1("CWY - highChannel = ", fband->highChannel); - zm_debug_msg1("CWY - channelSep = ", fband->channelSep); */ - for (c = fband->lowChannel; c <= fband->highChannel; - c += fband->channelSep) { - ZM_HAL_CHANNEL icv; - - /* Disable all DFS channel */ - if ((hpPriv->disableDfsCh == 0) || (!(fband->useDfs & rd->dfsMask))) { - if (fband->channelBW < 20) { - /**************************************************************/ - /* */ - /* Temporary discard channel that BW < 20MHz (5 or 10MHz) */ - /* Our architecture does not implemnt it !!! */ - /* */ - /**************************************************************/ - continue; - } - if ((c >= c_lo) && (c <= c_hi)) { - icv.channel = c; - icv.channelFlags = cm->flags; - icv.maxRegTxPower = fband->powerDfs; - if (fband->usePassScan & rd->pscan) - icv.channelFlags |= ZM_REG_FLAG_CHANNEL_PASSIVE; - else - icv.channelFlags &= ~ZM_REG_FLAG_CHANNEL_PASSIVE; - if (fband->useDfs & rd->dfsMask) - icv.privFlags = ZM_REG_FLAG_CHANNEL_DFS; - else - icv.privFlags = 0; - - /* For now disable radar for FCC3 */ - if (fband->useDfs & rd->dfsMask & DFS_FCC3) { - icv.privFlags &= ~ZM_REG_FLAG_CHANNEL_DFS; - icv.privFlags |= ZM_REG_FLAG_CHANNEL_DFS_CLEAR; - } - - if (rd->flags & LIMIT_FRAME_4MS) - icv.privFlags |= ZM_REG_FLAG_CHANNEL_DFS_CLEAR; - - icv.minTxPower = 0; - icv.maxTxPower = 0; - - zm_assert(next < 60); - - wd->regulationTable.allowChannel[next++] = icv; - } - } - } - } - } - } - wd->regulationTable.allowChannelCnt = next; - - #if 0 - { - /* debug print */ - u32_t i; - DbgPrint("\n-------------------------------------------\n"); - DbgPrint("zfHpGetRegulationTable print all channel info regincode = 0x%x\n", wd->regulationTable.regionCode); - DbgPrint("index channel channelFlags maxRegTxPower privFlags useDFS\n"); - - for (i = 0 ; i < wd->regulationTable.allowChannelCnt ; i++) { - DbgPrint("%02d %d %04x %02d %x %x\n", i, - wd->regulationTable.allowChannel[i].channel, - wd->regulationTable.allowChannel[i].channelFlags, - wd->regulationTable.allowChannel[i].maxRegTxPower, - wd->regulationTable.allowChannel[i].privFlags, - wd->regulationTable.allowChannel[i].privFlags & ZM_REG_FLAG_CHANNEL_DFS); - } - } - #endif - - zmw_leave_critical_section(dev); -} - -void zfHpGetRegulationTablefromRegionCode(zdev_t *dev, u16_t regionCode) -{ - u16_t c_lo = 2000, c_hi = 6000; /* default channel is all enable */ - u8_t isoName[3] = {'N', 'A', 0}; - - zfCoreSetIsoName(dev, isoName); - - zfHpGetRegulationTable(dev, regionCode, c_lo, c_hi); -} - -void zfHpGetRegulationTablefromCountry(zdev_t *dev, u16_t CountryCode) -{ - u16_t i; - u16_t c_lo = 2000, c_hi = 6000; /* default channel is all enable */ - u16_t RegDomain; - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - for (i = 0; i < ARRAY_SIZE(allCountries); i++) { - if (CountryCode == allCountries[i].countryCode) { - RegDomain = allCountries[i].regDmnEnum; - - /* read the ACU country code from EEPROM */ - zfCoreSetIsoName(dev, (u8_t *)allCountries[i].isoName); - - /* zm_debug_msg_s("CWY - Country Name = ", allCountries[i].name); */ - - if (wd->regulationTable.regionCode != RegDomain) { - /* zm_debug_msg0("CWY - Change regulatory table"); */ - zfHpGetRegulationTable(dev, RegDomain, c_lo, c_hi); - } - return; - } - } - zm_debug_msg1("Invalid CountryCode = ", CountryCode); -} - -u8_t zfHpGetRegulationTablefromISO(zdev_t *dev, u8_t *countryInfo, u8_t length) -{ - u16_t i; - u16_t RegDomain; - u16_t c_lo = 2000, c_hi = 6000; /* default channel is all enable */ - /* u8_t strLen = 2; */ - - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - if (countryInfo[4] != 0x20) { - /* with (I)ndoor/(O)utdoor info - strLen = 3; */ - } - /* zm_debug_msg_s("Desired iso name = ", isoName); */ - for (i = 0; i < ARRAY_SIZE(allCountries); i++) { - /* zm_debug_msg_s("Current iso name = ", allCountries[i].isoName); */ - if (zfMemoryIsEqual((u8_t *)allCountries[i].isoName, (u8_t *)&countryInfo[2], length-1)) { - /* DbgPrint("Set current iso name = %s\n", allCountries[i].isoName); */ - /* zm_debug_msg0("iso name hit!!"); */ - - RegDomain = allCountries[i].regDmnEnum; - - if (wd->regulationTable.regionCode != RegDomain) - zfHpGetRegulationTable(dev, RegDomain, c_lo, c_hi); - /* - while (index < (countryInfo[1]+2)) { - if (countryInfo[index] <= 14) { - // calculate 2.4GHz low boundary channel frequency - ch = countryInfo[index]; - if ( ch == 14 ) - c_lo = ZM_CH_G_14; - else - c_lo = ZM_CH_G_1 + (ch - 1) * 5; - // calculate 2.4GHz high boundary channel frequency - ch = countryInfo[index] + countryInfo[index + 1] - 1; - if ( ch == 14 ) - c_hi = ZM_CH_G_14; - else - c_hi = ZM_CH_G_1 + (ch - 1) * 5; - } else { - // calculate 5GHz low boundary channel frequency - ch = countryInfo[index]; - if ( (ch >= 184)&&(ch <= 196) ) - c_lo = 4000 + ch*5; - else - c_lo = 5000 + ch*5; - // calculate 5GHz high boundary channel frequency - ch = countryInfo[index] + countryInfo[index + 1] - 1; - if ( (ch >= 184)&&(ch <= 196) ) - c_hi = 4000 + ch*5; - else - c_hi = 5000 + ch*5; - } - - zfHpGetRegulationTable(dev, RegDomain, c_lo, c_hi); - - index+=3; - } - */ - return 0; - } - } - /* zm_debug_msg_s("Invalid iso name = ", &countryInfo[2]); */ - return 1; -} - -const char *zfHpGetisoNamefromregionCode(zdev_t *dev, u16_t regionCode) -{ - u16_t i; - - for (i = 0; i < ARRAY_SIZE(allCountries); i++) { - if (allCountries[i].regDmnEnum == regionCode) - return allCountries[i].isoName; - } - /* no matching item, return default */ - return allCountries[0].isoName; -} - -u16_t zfHpGetRegionCodeFromIsoName(zdev_t *dev, u8_t *countryIsoName) -{ - u16_t i; - u16_t regionCode; - - /* if no matching item, return default */ - regionCode = DEF_REGDMN; - - for (i = 0; i < ARRAY_SIZE(allCountries); i++) { - if (zfMemoryIsEqual((u8_t *)allCountries[i].isoName, countryIsoName, 2)) { - regionCode = allCountries[i].regDmnEnum; - break; - } - } - - return regionCode; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfHpDeleteAllowChannel */ -/* Delete Allow Channel. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* freq : frequency */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Chao-Wen Yang ZyDAS Technology Corporation 2007.3 */ -/* */ -/************************************************************************/ -u16_t zfHpDeleteAllowChannel(zdev_t *dev, u16_t freq) -{ - u16_t i, bandIndex = 0; - u16_t dfs5GBand[][2] = { {5150, 5240}, {5260, 5350}, {5450, 5700}, {5725, 5825} }; - - zmw_get_wlan_dev(dev); - /* Find which band does this frequency belong */ - for (i = 0; i < 4; i++) { - if ((freq >= dfs5GBand[i][0]) && (freq <= dfs5GBand[i][1])) - bandIndex = i + 1; - } - - if (bandIndex == 0) { - /* 2.4G, don't care */ - return 0; - } else - bandIndex--; - /* Set all channels in this band to passive scan */ - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) { - if ((wd->regulationTable.allowChannel[i].channel >= dfs5GBand[bandIndex][0]) && - (wd->regulationTable.allowChannel[i].channel <= dfs5GBand[bandIndex][1])) { - /* if channel is not passive, set it to be passive and mark it */ - if ((wd->regulationTable.allowChannel[i].channelFlags & - ZM_REG_FLAG_CHANNEL_PASSIVE) == 0) { - wd->regulationTable.allowChannel[i].channelFlags |= - (ZM_REG_FLAG_CHANNEL_PASSIVE | ZM_REG_FLAG_CHANNEL_CSA); - } - } - } - - return 0; -} - -u16_t zfHpAddAllowChannel(zdev_t *dev, u16_t freq) -{ - u16_t i, j, arrayIndex; - - zmw_get_wlan_dev(dev); - - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) { - if (wd->regulationTable.allowChannel[i].channel == freq) - break; - } - - if (i == wd->regulationTable.allowChannelCnt) { - for (j = 0; j < wd->regulationTable.allowChannelCnt; j++) { - if (wd->regulationTable.allowChannel[j].channel > freq) - break; - } - - /* zm_debug_msg1("CWY - add frequency = ", freq); - zm_debug_msg1("CWY - channel array index = ", j); */ - - arrayIndex = j; - - if (arrayIndex < wd->regulationTable.allowChannelCnt) { - for (j = wd->regulationTable.allowChannelCnt; j > arrayIndex; j--) - wd->regulationTable.allowChannel[j] = wd->regulationTable.allowChannel[j - 1]; - } - wd->regulationTable.allowChannel[arrayIndex].channel = freq; - - wd->regulationTable.allowChannelCnt++; - } - - return 0; -} - -u16_t zfHpIsDfsChannelNCS(zdev_t *dev, u16_t freq) -{ - u8_t flag = ZM_REG_FLAG_CHANNEL_DFS; - u16_t i; - zmw_get_wlan_dev(dev); - - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) { - /* DbgPrint("DFS:freq=%d, chan=%d", freq, wd->regulationTable.allowChannel[i].channel); */ - if (wd->regulationTable.allowChannel[i].channel == freq) { - flag = wd->regulationTable.allowChannel[i].privFlags; - break; } - } - - return flag & (ZM_REG_FLAG_CHANNEL_DFS|ZM_REG_FLAG_CHANNEL_DFS_CLEAR); -} - -u16_t zfHpIsDfsChannel(zdev_t *dev, u16_t freq) -{ - u8_t flag = ZM_REG_FLAG_CHANNEL_DFS; - u16_t i; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) { - /* DbgPrint("DFS:freq=%d, chan=%d", freq, wd->regulationTable.allowChannel[i].channel); */ - if (wd->regulationTable.allowChannel[i].channel == freq) { - flag = wd->regulationTable.allowChannel[i].privFlags; - break; - } - } - - zmw_leave_critical_section(dev); - - return flag & (ZM_REG_FLAG_CHANNEL_DFS|ZM_REG_FLAG_CHANNEL_DFS_CLEAR); -} - -u16_t zfHpIsAllowedChannel(zdev_t *dev, u16_t freq) -{ - u16_t i; - zmw_get_wlan_dev(dev); - - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) { - if (wd->regulationTable.allowChannel[i].channel == freq) - return 1; - } - - return 0; -} - -u16_t zfHpFindFirstNonDfsChannel(zdev_t *dev, u16_t aBand) -{ - u16_t chan = 2412; - u16_t i; - zmw_get_wlan_dev(dev); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - for (i = 0; i < wd->regulationTable.allowChannelCnt; i++) { - if ((wd->regulationTable.allowChannel[i].privFlags & ZM_REG_FLAG_CHANNEL_DFS) != 0) { - if (aBand) { - if (wd->regulationTable.allowChannel[i].channel > 3000) { - chan = wd->regulationTable.allowChannel[i].channel; - break; - } - } else { - if (wd->regulationTable.allowChannel[i].channel < 3000) { - chan = wd->regulationTable.allowChannel[i].channel; - break; - } - } - } - } - - zmw_leave_critical_section(dev); - - return chan; -} - - -/* porting from ACU */ -/* save RegulatoryDomain in hpriv */ -u8_t zfHpGetRegulatoryDomain(zdev_t *dev) -{ - zmw_get_wlan_dev(dev); - - switch (wd->regulationTable.regionCode) { - case NO_ENUMRD: - return 0; - break; - case FCC1_FCCA: - case FCC1_WORLD: - case FCC4_FCCA: - case FCC5_FCCA: - case FCC2_WORLD: - case FCC2_ETSIC: - case FCC3_FCCA: - case FCC3_WORLD: - case FCC1: - case FCC2: - case FCC3: - case FCC4: - case FCC5: - case FCCA: - return 0x10;/* WG_AMERICAS DOT11_REG_DOMAIN_FCC United States */ - break; - - case FCC2_FCCA: - return 0x20;/* DOT11_REG_DOMAIN_DOC Canada */ - break; - - case ETSI1_WORLD: - case ETSI3_ETSIA: - case ETSI2_WORLD: - case ETSI3_WORLD: - case ETSI4_WORLD: - case ETSI4_ETSIC: - case ETSI5_WORLD: - case ETSI6_WORLD: - case ETSI_RESERVED: - case ETSI1: - case ETSI2: - case ETSI3: - case ETSI4: - case ETSI5: - case ETSI6: - case ETSIA: - case ETSIB: - case ETSIC: - return 0x30;/* WG_EMEA DOT11_REG_DOMAIN_ETSI Most of Europe */ - break; - - case MKK1_MKKA: - case MKK1_MKKB: - case MKK2_MKKA: - case MKK1_FCCA: - case MKK1_MKKA1: - case MKK1_MKKA2: - case MKK1_MKKC: - case MKK3_MKKB: - case MKK3_MKKA2: - case MKK3_MKKC: - case MKK4_MKKB: - case MKK4_MKKA2: - case MKK4_MKKC: - case MKK5_MKKB: - case MKK5_MKKA2: - case MKK5_MKKC: - case MKK6_MKKB: - case MKK6_MKKA2: - case MKK6_MKKC: - case MKK7_MKKB: - case MKK7_MKKA: - case MKK7_MKKC: - case MKK8_MKKB: - case MKK8_MKKA2: - case MKK8_MKKC: - case MKK6_MKKA1: - case MKK6_FCCA: - case MKK7_MKKA1: - case MKK7_FCCA: - case MKK9_FCCA: - case MKK9_MKKA1: - case MKK9_MKKC: - case MKK9_MKKA2: - case MKK10_FCCA: - case MKK10_MKKA1: - case MKK10_MKKC: - case MKK10_MKKA2: - case MKK11_MKKA: - case MKK11_FCCA: - case MKK11_MKKA1: - case MKK11_MKKC: - case MKK11_MKKA2: - case MKK12_MKKA: - case MKK12_FCCA: - case MKK12_MKKA1: - case MKK12_MKKC: - case MKK12_MKKA2: - case MKK3_MKKA: - case MKK3_MKKA1: - case MKK3_FCCA: - case MKK4_MKKA: - case MKK4_MKKA1: - case MKK4_FCCA: - case MKK9_MKKA: - case MKK10_MKKA: - case MKK1: - case MKK2: - case MKK3: - case MKK4: - case MKK5: - case MKK6: - case MKK7: - case MKK8: - case MKK9: - case MKK10: - case MKK11: - case MKK12: - case MKKA: - case MKKC: - return 0x40;/* WG_JAPAN DOT11_REG_DOMAIN_MKK Japan */ - break; - - default: - break; - } - - return 0xFF; /* Didn't input RegDmn by mean to distinguish by customer */ -} - -void zfHpDisableDfsChannel(zdev_t *dev, u8_t disableFlag) -{ - struct zsHpPriv *hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = wd->hpPrivate; - hpPriv->disableDfsCh = disableFlag; - return; -} diff --git a/drivers/staging/otus/hal/hpreg.h b/drivers/staging/otus/hal/hpreg.h deleted file mode 100644 index 6f8c73fd42cc..000000000000 --- a/drivers/staging/otus/hal/hpreg.h +++ /dev/null @@ -1,524 +0,0 @@ -/* - * 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 */ diff --git a/drivers/staging/otus/hal/hprw.c b/drivers/staging/otus/hal/hprw.c deleted file mode 100644 index 4dbd5fb44b0a..000000000000 --- a/drivers/staging/otus/hal/hprw.c +++ /dev/null @@ -1,1568 +0,0 @@ -/* - * 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" -#include "hpreg.h" -#include "../80211core/ratectrl.h" - -extern void zfIdlCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen); - -extern void zfCoreCwmBusy(zdev_t* dev, u16_t busy); -u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val); -u16_t zfFlushDelayWrite(zdev_t* dev); - -//#define zm_hp_priv(x) struct zsHpPriv* hpPriv=zgWlanDev.hpPrivate; - -void zfInitCmdQueue(zdev_t* dev) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv = (struct zsHpPriv*)(wd->hpPrivate); - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); -#ifdef ZM_XP_USB_MULTCMD - hpPriv->cmdTail = hpPriv->cmdHead = hpPriv->cmdSend = 0; -#else - hpPriv->cmdTail = hpPriv->cmdHead = 0; -#endif - hpPriv->cmdPending = 0; - hpPriv->cmd.delayWcmdCount = 0; - zmw_leave_critical_section(dev); -} - -u16_t zfPutCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen, u16_t src, u8_t* buf) -{ - u16_t i; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - /* Make sure command length < ZM_MAX_CMD_SIZE */ - zm_assert(cmdLen <= ZM_MAX_CMD_SIZE); - /* Make sure command queue not full */ - //zm_assert(((hpPriv->cmdTail+1) & (ZM_CMD_QUEUE_SIZE-1)) != hpPriv->cmdHead); - if (((hpPriv->cmdTail+1) & (ZM_CMD_QUEUE_SIZE-1)) == hpPriv->cmdHead ) { - zm_debug_msg0("CMD queue full!!"); - return 0; - } - - hpPriv->cmdQ[hpPriv->cmdTail].cmdLen = cmdLen; - hpPriv->cmdQ[hpPriv->cmdTail].src = src; - hpPriv->cmdQ[hpPriv->cmdTail].buf = buf; - for (i=0; i<(cmdLen>>2); i++) - { - hpPriv->cmdQ[hpPriv->cmdTail].cmd[i] = cmd[i]; - } - - hpPriv->cmdTail = (hpPriv->cmdTail+1) & (ZM_CMD_QUEUE_SIZE-1); - - return 0; -} - -u16_t zfGetCmd(zdev_t* dev, u32_t* cmd, u16_t* cmdLen, u16_t* src, u8_t** buf) -{ - u16_t i; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - if (hpPriv->cmdTail == hpPriv->cmdHead) - { - return 3; - } - - *cmdLen = hpPriv->cmdQ[hpPriv->cmdHead].cmdLen; - *src = hpPriv->cmdQ[hpPriv->cmdHead].src; - *buf = hpPriv->cmdQ[hpPriv->cmdHead].buf; - for (i=0; i<((*cmdLen)>>2); i++) - { - cmd[i] = hpPriv->cmdQ[hpPriv->cmdHead].cmd[i]; - } - - hpPriv->cmdHead = (hpPriv->cmdHead+1) & (ZM_CMD_QUEUE_SIZE-1); - - return 0; -} - -#ifdef ZM_XP_USB_MULTCMD -void zfSendCmdEx(zdev_t* dev) -{ - u32_t ncmd[ZM_MAX_CMD_SIZE/4]; - u16_t ncmdLen = 0; - u16_t cmdFlag = 0; - u16_t i; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - if (hpPriv->cmdPending == 0) - { - if (hpPriv->cmdTail != hpPriv->cmdSend) - { - cmdFlag = 1; - /* Get queueing command */ - ncmdLen= hpPriv->cmdQ[hpPriv->cmdSend].cmdLen; - for (i=0; i<(ncmdLen>>2); i++) - { - ncmd[i] = hpPriv->cmdQ[hpPriv->cmdSend].cmd[i]; - } - hpPriv->cmdSend = (hpPriv->cmdSend+1) & (ZM_CMD_QUEUE_SIZE-1); - - hpPriv->cmdPending = 1; - } - } - - zmw_leave_critical_section(dev); - - if ((cmdFlag == 1)) - { - zfIdlCmd(dev, ncmd, ncmdLen); - } -} - -void zfiSendCmdComp(zdev_t* dev) -{ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - hpPriv->cmdPending = 0; - zmw_leave_critical_section(dev); - - zfSendCmdEx(dev); -} -#endif - -u16_t zfIssueCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen, u16_t src, u8_t* buf) -{ - u16_t cmdFlag = 0; - u16_t ret; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - zmw_declare_for_critical_section(); - - zm_msg2_mm(ZM_LV_1, "cmdLen=", cmdLen); - - zmw_enter_critical_section(dev); - -#ifdef ZM_XP_USB_MULTCMD - ret = zfPutCmd(dev, cmd, cmdLen, src, buf); - zmw_leave_critical_section(dev); - - if (ret != 0) - { - return 1; - } - - zfSendCmdEx(dev); -#else - if (hpPriv->cmdPending == 0) - { - hpPriv->cmdPending = 1; - cmdFlag = 1; - } - ret = zfPutCmd(dev, cmd, cmdLen, src, buf); - - zmw_leave_critical_section(dev); - - if (ret != 0) - { - return 1; - } - - if (cmdFlag == 1) - { - zfIdlCmd(dev, cmd, cmdLen); - } -#endif - return 0; -} - -void zfIdlRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen) -{ - u32_t cmd[ZM_MAX_CMD_SIZE/4]; - u16_t cmdLen; - u16_t src; - u8_t* buf; - u32_t ncmd[ZM_MAX_CMD_SIZE/4]; - u16_t ncmdLen = 0; - u16_t ret; - u16_t cmdFlag = 0; - u16_t i; - s32_t nf; - s32_t noisefloor[4]; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - - zmw_declare_for_critical_section(); - - zmw_enter_critical_section(dev); - - ret = zfGetCmd(dev, cmd, &cmdLen, &src, &buf); - #if 0 - zm_assert(ret == 0); - #else - if (ret != 0) - { - zm_debug_msg0("Error IdlRsp because none cmd!!\n"); - #ifndef ZM_XP_USB_MULTCMD - zmw_leave_critical_section(dev); - return; - #endif - } - #endif -#ifdef ZM_XP_USB_MULTCMD - zmw_leave_critical_section(dev); -#else - if (hpPriv->cmdTail != hpPriv->cmdHead) - { - cmdFlag = 1; - /* Get queueing command */ - ncmdLen= hpPriv->cmdQ[hpPriv->cmdHead].cmdLen; - for (i=0; i<(ncmdLen>>2); i++) - { - ncmd[i] = hpPriv->cmdQ[hpPriv->cmdHead].cmd[i]; - } - } - else - { - hpPriv->cmdPending = 0; - } - - zmw_leave_critical_section(dev); - - if (cmdFlag == 1) - { - zfIdlCmd(dev, ncmd, ncmdLen); - } -#endif - if (src == ZM_OID_READ) - { - ZM_PERFORMANCE_REG(dev, 0x11772c, rsp[1]); - zfwDbgReadRegDone(dev, cmd[1], rsp[1]); - } - else if (src == ZM_OID_FLASH_CHKSUM) - { - zfwDbgGetFlashChkSumDone(dev, rsp+1); - } - else if (src == ZM_OID_FLASH_READ) - { - u32_t datalen; - - datalen = (rsp[0] & 255); - - zfwDbgReadFlashDone(dev, cmd[1], rsp+1, datalen); - } - else if (src == ZM_OID_FLASH_PROGRAM) - { - /* Non do */ - } - else if (src == ZM_OID_WRITE) - { - zfwDbgWriteRegDone(dev, cmd[1], cmd[2]); - } - else if (src == ZM_OID_TALLY) - { - zfCollectHWTally(dev, rsp, 0); - } - else if (src == ZM_OID_TALLY_APD) - { - zfCollectHWTally(dev, rsp, 1); - zfwDbgReadTallyDone(dev); -#ifdef ZM_ENABLE_BA_RATECTRL - zfRateCtrlAggrSta(dev); -#endif - } - else if (src == ZM_OID_DKTX_STATUS) - { - zm_debug_msg0("src = zm_OID_DKTX_STATUS"); - zfwDbgQueryHwTxBusyDone(dev, rsp[1]); - } - else if (src == ZM_CMD_SET_FREQUENCY) - { - -//#ifdef ZM_OTUS_ENABLE_RETRY_FREQ_CHANGE -#if 0 - zm_debug_msg1("Retry Set Frequency = ", rsp[1]); - - #if 1 - // Read the Noise Floor value ! - nf = ((rsp[2]>>19) & 0x1ff); - if ((nf & 0x100) != 0x0) - { - noisefloor[0] = 0 - ((nf ^ 0x1ff) + 1); - } - else - { - noisefloor[0] = nf; - } - - zm_debug_msg1("Noise Floor[1] = ", noisefloor[0]); - - nf = ((rsp[3]>>19) & 0x1ff); - if ((nf & 0x100) != 0x0) - { - noisefloor[1] = 0 - ((nf ^ 0x1ff) + 1); - } - else - { - noisefloor[1] = nf; - } - - zm_debug_msg1("Noise Floor[2] = ", noisefloor[1]); - zm_debug_msg1("Is Site Survey = ", hpPriv->isSiteSurvey); - #endif - - if ( (rsp[1] && hpPriv->freqRetryCounter == 0) || - (((noisefloor[0]>-60)||(noisefloor[1]>-60)) && hpPriv->freqRetryCounter==0) || - ((abs(noisefloor[0]-noisefloor[1])>=9) && hpPriv->freqRetryCounter==0) ) - { - zm_debug_msg0("Retry to issue the frequency change command"); - - if ( hpPriv->recordFreqRetryCounter == 1 ) - { - zm_debug_msg0("Cold Reset"); - - zfHpSetFrequencyEx(dev, hpPriv->latestFrequency, - hpPriv->latestBw40, - hpPriv->latestExtOffset, - 2); - - if ( hpPriv->isSiteSurvey != 2 ) - { - hpPriv->freqRetryCounter++; - } - hpPriv->recordFreqRetryCounter = 0; - } - else - { - zfHpSetFrequencyEx(dev, hpPriv->latestFrequency, - hpPriv->latestBw40, - hpPriv->latestExtOffset, - 0); - } - hpPriv->recordFreqRetryCounter++; - } - else -#endif - -/* ret: Bit0: AGC calibration 0=>finish 1=>unfinish */ -/* Bit1: Noise calibration 0=>finish 1=>unfinish */ -/* Bit2: Noise calibration finish, but NF value unexcepted => 1 */ - if ( (rsp[1] & 0x1) || (rsp[1] & 0x4) ) - { - zm_debug_msg1("Set Frequency fail : ret = ", rsp[1]); - - /* 1. AGC Calibration fail */ - /* 2. Noise Calibration finish but error NoiseFloor value */ - /* and not in sitesurvey, try more twice */ - if ( hpPriv->isSiteSurvey == 2 ) - { - if ( hpPriv->recordFreqRetryCounter < 2 ) - { - /* cold reset */ - zfHpSetFrequencyEx(dev, hpPriv->latestFrequency, - hpPriv->latestBw40, - hpPriv->latestExtOffset, - 2); - hpPriv->recordFreqRetryCounter++; - zm_debug_msg1("Retry to issue the frequency change command(cold reset) counter = ", hpPriv->recordFreqRetryCounter); - } - else - { - /* Fail : we would not accept this result! */ - zm_debug_msg0("\n\n\n\n Fail twice cold reset \n\n\n\n"); - hpPriv->coldResetNeedFreq = 0; - hpPriv->recordFreqRetryCounter = 0; - zfCoreSetFrequencyComplete(dev); - } - } - else - { - /* in sitesurvey, coldreset in next channel */ - hpPriv->coldResetNeedFreq = 1; - hpPriv->recordFreqRetryCounter = 0; - zfCoreSetFrequencyComplete(dev); - } - } - else if (rsp[1] & 0x2) - { - zm_debug_msg1("Set Frequency fail 2 : ret = ", rsp[1]); - - /* Noise Calibration un-finish */ - /* and not in sitesurvey, try more once */ - if ( hpPriv->isSiteSurvey == 2 ) - { - if ( hpPriv->recordFreqRetryCounter < 1 ) - { - /* cold reset */ - zfHpSetFrequencyEx(dev, hpPriv->latestFrequency, - hpPriv->latestBw40, - hpPriv->latestExtOffset, - 2); - hpPriv->recordFreqRetryCounter++; - zm_debug_msg1("2 Retry to issue the frequency change command(cold reset) counter = ", hpPriv->recordFreqRetryCounter); - } - else - { - /* Fail : we would not accept this result! */ - zm_debug_msg0("\n\n\n\n 2 Fail twice cold reset \n\n\n\n"); - hpPriv->coldResetNeedFreq = 0; - hpPriv->recordFreqRetryCounter = 0; - zfCoreSetFrequencyComplete(dev); - } - } - else - { - /* in sitesurvey, skip this frequency */ - hpPriv->coldResetNeedFreq = 0; - hpPriv->recordFreqRetryCounter = 0; - zfCoreSetFrequencyComplete(dev); - } - } - //else if (rsp[1] & 0x4) - //{ - // zm_debug_msg1("Set Frequency fail 3 : ret = ", rsp[1]); - // hpPriv->coldResetNeedFreq = 0; - // hpPriv->recordFreqRetryCounter = 0; - // zfCoreSetFrequencyComplete(dev); - //} - else - { - //hpPriv->freqRetryCounter = 0; - zm_debug_msg2(" return complete, ret = ", rsp[1]); - - /* set bb_heavy_clip_enable */ - if (hpPriv->enableBBHeavyClip && hpPriv->hwBBHeavyClip && - hpPriv->doBBHeavyClip) - { - u32_t setValue = 0x200; - - setValue |= hpPriv->setValueHeavyClip; - - //zm_dbg(("Do heavy clip setValue = %d\n", setValue)); - - zfDelayWriteInternalReg(dev, 0x99e0+0x1bc000, setValue); - zfFlushDelayWrite(dev); - } - - hpPriv->coldResetNeedFreq = 0; - hpPriv->recordFreqRetryCounter = 0; - zfCoreSetFrequencyComplete(dev); - } - - #if 1 - // Read the Noise Floor value ! - nf = ((rsp[2]>>19) & 0x1ff); - if ((nf & 0x100) != 0x0) - { - noisefloor[0] = 0 - ((nf ^ 0x1ff) + 1); - } - else - { - noisefloor[0] = nf; - } - - //zm_debug_msg1("Noise Floor[1] = ", noisefloor[0]); - - nf = ((rsp[3]>>19) & 0x1ff); - if ((nf & 0x100) != 0x0) - { - noisefloor[1] = 0 - ((nf ^ 0x1ff) + 1); - } - else - { - noisefloor[1] = nf; - } - - //zm_debug_msg1("Noise Floor[2] = ", noisefloor[1]); - - nf = ((rsp[5]>>23) & 0x1ff); - if ((nf & 0x100) != 0x0) - { - noisefloor[2] = 0 - ((nf ^ 0x1ff) + 1); - } - else - { - noisefloor[2] = nf; - } - - //zm_debug_msg1("Noise Floor ext[1] = ", noisefloor[2]); - - nf = ((rsp[6]>>23) & 0x1ff); - if ((nf & 0x100) != 0x0) - { - noisefloor[3] = 0 - ((nf ^ 0x1ff) + 1); - } - else - { - noisefloor[3] = nf; - } - - //zm_debug_msg1("Noise Floor ext[2] = ", noisefloor[3]); - - //zm_debug_msg1("Is Site Survey = ", hpPriv->isSiteSurvey); - #endif - } - else if (src == ZM_CMD_SET_KEY) - { - zfCoreSetKeyComplete(dev); - } - else if (src == ZM_CWM_READ) - { - zm_msg2_mm(ZM_LV_0, "CWM rsp[1]=", rsp[1]); - zm_msg2_mm(ZM_LV_0, "CWM rsp[2]=", rsp[2]); - zfCoreCwmBusy(dev, zfCwmIsExtChanBusy(rsp[1], rsp[2])); - } - else if (src == ZM_MAC_READ) - { - /* rsp[1] = ZM_SEEPROM_MAC_ADDRESS_OFFSET; */ - /* rsp[2] = ZM_SEEPROM_MAC_ADDRESS_OFFSET+4; */ - /* rsp[3] = ZM_SEEPROM_REGDOMAIN_OFFSET; */ - /* rsp[4] = ZM_SEEPROM_VERISON_OFFSET; */ - /* rsp[5] = ZM_SEEPROM_HARDWARE_TYPE_OFFSET; */ - /* rsp[6] = ZM_SEEPROM_HW_HEAVY_CLIP; */ - - u8_t addr[6], CCS, WWR; - u16_t CountryDomainCode; - - /* BB heavy clip */ - //hpPriv->eepromHeavyClipFlag = (u8_t)((rsp[6]>>24) & 0xff); // force enable 8107 - //zm_msg2_mm(ZM_LV_0, "eepromHeavyClipFlag", hpPriv->eepromHeavyClipFlag); - #if 0 - if (hpPriv->hwBBHeavyClip) - { - zm_msg0_mm(ZM_LV_0, "enable BB Heavy Clip"); - } - else - { - zm_msg0_mm(ZM_LV_0, "Not enable BB Heavy Clip"); - } - #endif - zm_msg2_mm(ZM_LV_0, "MAC rsp[1]=", rsp[1]); - zm_msg2_mm(ZM_LV_0, "MAC rsp[2]=", rsp[2]); - - addr[0] = (u8_t)(rsp[1] & 0xff); - addr[1] = (u8_t)((rsp[1]>>8) & 0xff); - addr[2] = (u8_t)((rsp[1]>>16) & 0xff); - addr[3] = (u8_t)((rsp[1]>>24) & 0xff); - addr[4] = (u8_t)(rsp[2] & 0xff); - addr[5] = (u8_t)((rsp[2]>>8) & 0xff); -/*#ifdef ZM_FB50 - addr[0] = (u8_t)(0 & 0xff); - addr[1] = (u8_t)(3 & 0xff); - addr[2] = (u8_t)(127 & 0xff); - addr[3] = (u8_t)(0 & 0xff); - addr[4] = (u8_t)(9 & 0xff); - addr[5] = (u8_t)(11 & 0xff); -#endif*/ - - zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_L, - ((((u32_t)addr[3])<<24) | (((u32_t)addr[2])<<16) | (((u32_t)addr[1])<<8) | addr[0])); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_H, - ((((u32_t)addr[5])<<8) | addr[4])); - zfFlushDelayWrite(dev); - - wd->ledStruct.ledMode[0] = (u16_t)(rsp[5]&0xffff); - wd->ledStruct.ledMode[1] = (u16_t)(rsp[5]>>16); - zm_msg2_mm(ZM_LV_0, "ledMode[0]=", wd->ledStruct.ledMode[0]); - zm_msg2_mm(ZM_LV_0, "ledMode[1]=", wd->ledStruct.ledMode[1]); - - /* Regulatory Related Setting */ - zm_msg2_mm(ZM_LV_0, "RegDomain rsp=", rsp[3]); - zm_msg2_mm(ZM_LV_0, "OpFlags+EepMisc=", rsp[4]); - hpPriv->OpFlags = (u8_t)((rsp[4]>>16) & 0xff); - if ((rsp[2] >> 24) == 0x1) //Tx mask == 0x1 - { - zm_msg0_mm(ZM_LV_0, "OTUS 1x2"); - hpPriv->halCapability |= ZM_HP_CAP_11N_ONE_TX_STREAM; - } - else - { - zm_msg0_mm(ZM_LV_0, "OTUS 2x2"); - } - if (hpPriv->OpFlags & 0x1) - { - hpPriv->halCapability |= ZM_HP_CAP_5G; - } - if (hpPriv->OpFlags & 0x2) - { - hpPriv->halCapability |= ZM_HP_CAP_2G; - } - - - CCS = (u8_t)((rsp[3] & 0x8000) >> 15); - WWR = (u8_t)((rsp[3] & 0x4000) >> 14); - CountryDomainCode = (u16_t)(rsp[3] & 0x3FFF); - - if (rsp[3] != 0xffffffff) - { - if (CCS) - { - //zm_debug_msg0("CWY - Get Regulation Table from Country Code"); - zfHpGetRegulationTablefromCountry(dev, CountryDomainCode); - } - else - { - //zm_debug_msg0("CWY - Get Regulation Table from Reg Domain"); - zfHpGetRegulationTablefromRegionCode(dev, CountryDomainCode); - } - if (WWR) - { - //zm_debug_msg0("CWY - Enable 802.11d"); - /* below line shall be unmarked after A band is ready */ - //zfiWlanSetDot11DMode(dev, 1); - } - } - else - { - zfHpGetRegulationTablefromRegionCode(dev, NO_ENUMRD); - } - - zfCoreMacAddressNotify(dev, addr); - - } - else if (src == ZM_EEPROM_READ) - { -#if 0 - u8_t addr[6], CCS, WWR; - u16_t CountryDomainCode; -#endif - for (i=0; ieepromImageIndex < 1024) - { - hpPriv->eepromImage[hpPriv->eepromImageIndex++] = rsp[i+1]; - } - } - - if (hpPriv->eepromImageIndex == (ZM_HAL_MAX_EEPROM_REQ*ZM_HAL_MAX_EEPROM_PRQ)) - { - #if 0 - for (i=0; i<1024; i++) - { - zm_msg2_mm(ZM_LV_0, "index=", i); - zm_msg2_mm(ZM_LV_0, "eepromImage=", hpPriv->eepromImage[i]); - } - #endif - zm_msg2_mm(ZM_LV_0, "MAC [1]=", hpPriv->eepromImage[0x20c/4]); - zm_msg2_mm(ZM_LV_0, "MAC [2]=", hpPriv->eepromImage[0x210/4]); -#if 0 - addr[0] = (u8_t)(hpPriv->eepromImage[0x20c/4] & 0xff); - addr[1] = (u8_t)((hpPriv->eepromImage[0x20c/4]>>8) & 0xff); - addr[2] = (u8_t)((hpPriv->eepromImage[0x20c/4]>>16) & 0xff); - addr[3] = (u8_t)((hpPriv->eepromImage[0x20c/4]>>24) & 0xff); - addr[4] = (u8_t)(hpPriv->eepromImage[0x210/4] & 0xff); - addr[5] = (u8_t)((hpPriv->eepromImage[0x210/4]>>8) & 0xff); - - zfCoreMacAddressNotify(dev, addr); - - zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_L, - ((((u32_t)addr[3])<<24) | (((u32_t)addr[2])<<16) | (((u32_t)addr[1])<<8) | addr[0])); - zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_H, - ((((u32_t)addr[5])<<8) | addr[4])); - zfFlushDelayWrite(dev); - - /* Regulatory Related Setting */ - zm_msg2_mm(ZM_LV_0, "RegDomain =", hpPriv->eepromImage[0x208/4]); - CCS = (u8_t)((hpPriv->eepromImage[0x208/4] & 0x8000) >> 15); - WWR = (u8_t)((hpPriv->eepromImage[0x208/4] & 0x4000) >> 14); - /* below line shall be unmarked after A band is ready */ - //CountryDomainCode = (u16_t)(hpPriv->eepromImage[0x208/4] & 0x3FFF); - CountryDomainCode = 8; - if (CCS) - { - //zm_debug_msg0("CWY - Get Regulation Table from Country Code"); - zfHpGetRegulationTablefromCountry(dev, CountryDomainCode); - } - else - { - //zm_debug_msg0("CWY - Get Regulation Table from Reg Domain"); - zfHpGetRegulationTablefromRegionCode(dev, CountryDomainCode); - } - if (WWR) - { - //zm_debug_msg0("CWY - Enable 802.11d"); - /* below line shall be unmarked after A band is ready */ - //zfiWlanSetDot11DMode(dev, 1); - } -#endif - zfCoreHalInitComplete(dev); - } - else - { - hpPriv->eepromImageRdReq++; - zfHpLoadEEPROMFromFW(dev); - } - } - else if (src == ZM_EEPROM_WRITE) - { - zfwDbgWriteEepromDone(dev, cmd[1], cmd[2]); - } - else if (src == ZM_ANI_READ) - { - u32_t cycleTime, ctlClear; - - zm_msg2_mm(ZM_LV_0, "ANI rsp[1]=", rsp[1]); - zm_msg2_mm(ZM_LV_0, "ANI rsp[2]=", rsp[2]); - zm_msg2_mm(ZM_LV_0, "ANI rsp[3]=", rsp[3]); - zm_msg2_mm(ZM_LV_0, "ANI rsp[4]=", rsp[4]); - - hpPriv->ctlBusy += rsp[1]; - hpPriv->extBusy += rsp[2]; - - cycleTime = 100000; //100 miniseconds - - if (cycleTime > rsp[1]) - { - ctlClear = (cycleTime - rsp[1]) / 100; - } - else - { - ctlClear = 0; - } - if (wd->aniEnable) - zfHpAniArPoll(dev, ctlClear, rsp[3], rsp[4]); - } - else if (src == ZM_CMD_ECHO) - { - if ( ((struct zsHpPriv*)wd->hpPrivate)->halReInit ) - { - zfCoreHalInitComplete(dev); - ((struct zsHpPriv*)wd->hpPrivate)->halReInit = 0; - } - else - { - zfHpLoadEEPROMFromFW(dev); - } - } - else if (src == ZM_OID_FW_DL_INIT) - { - zfwDbgDownloadFwInitDone(dev); - } - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfWriteRegInternalReg */ -/* Write on chip internal register immediately. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : register address */ -/* val : value */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.11 */ -/* */ -/************************************************************************/ -u32_t zfWriteRegInternalReg(zdev_t* dev, u32_t addr, u32_t val) -{ - u32_t cmd[3]; - u16_t ret; - - cmd[0] = 0x00000108; - cmd[1] = addr; - cmd[2] = val; - - ret = zfIssueCmd(dev, cmd, 12, ZM_OID_INTERNAL_WRITE, NULL); - return ret; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfDelayWriteInternalReg */ -/* Write on chip internal register, write operation may be */ -/* postponed to form a multiple write command. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : register address */ -/* val : value */ -/* */ -/* OUTPUTS */ -/* 0 : command been postponed */ -/* 1 : commands been executed */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.11 */ -/* */ -/************************************************************************/ -u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t i; - u16_t ret; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - zmw_declare_for_critical_section(); - - /* enter critical section */ - zmw_enter_critical_section(dev); - - /* Store command to global buffer */ - hpPriv->cmd.delayWcmdAddr[hpPriv->cmd.delayWcmdCount] = addr; - hpPriv->cmd.delayWcmdVal[hpPriv->cmd.delayWcmdCount++] = val; - - /* If pending command reach size limit */ - if ((hpPriv->cmd.delayWcmdCount) >= ((ZM_MAX_CMD_SIZE - 4) >> 3)) - { - cmd[0] = 0x00000100 + (hpPriv->cmd.delayWcmdCount<<3); - - /* copy command to cmd buffer */ - for (i=0; icmd.delayWcmdCount; i++) - { - cmd[1+(i<<1)] = hpPriv->cmd.delayWcmdAddr[i]; - cmd[2+(i<<1)] = hpPriv->cmd.delayWcmdVal[i]; - } - /* reset pending command */ - hpPriv->cmd.delayWcmdCount = 0; - - /* leave critical section */ - zmw_leave_critical_section(dev); - - /* issue write command */ - ret = zfIssueCmd(dev, cmd, 4+(i<<3), ZM_OID_INTERNAL_WRITE, NULL); - - return 1; - } - else - { - /* leave critical section */ - zmw_leave_critical_section(dev); - - return 0; - } -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfFlushDelayWrite */ -/* Flush pending write command. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* 0 : no pending command */ -/* 1 : commands been executed */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.11 */ -/* */ -/************************************************************************/ -u16_t zfFlushDelayWrite(zdev_t* dev) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t i; - u16_t ret; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - zmw_declare_for_critical_section(); - - /* enter critical section */ - zmw_enter_critical_section(dev); - - /* If there is pending command */ - if (hpPriv->cmd.delayWcmdCount > 0) - { - cmd[0] = 0x00000100 + (hpPriv->cmd.delayWcmdCount<<3); - - /* copy command to cmd buffer */ - for (i=0; icmd.delayWcmdCount; i++) - { - cmd[1+(i<<1)] = hpPriv->cmd.delayWcmdAddr[i]; - cmd[2+(i<<1)] = hpPriv->cmd.delayWcmdVal[i]; - } - /* reset pending command */ - hpPriv->cmd.delayWcmdCount = 0; - - /* leave critical section */ - zmw_leave_critical_section(dev); - - /* issue write command */ - ret = zfIssueCmd(dev, cmd, 4+(i<<3), ZM_OID_INTERNAL_WRITE, NULL); - - return 1; - } - else - { - /* leave critical section */ - zmw_leave_critical_section(dev); - - return 0; - } -} - - -u32_t zfiDbgDelayWriteReg(zdev_t* dev, u32_t addr, u32_t val) -{ - zfDelayWriteInternalReg(dev, addr, val); - return 0; -} - -u32_t zfiDbgFlushDelayWrite(zdev_t* dev) -{ - zfFlushDelayWrite(dev); - return 0; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiDbgWriteReg */ -/* Write register. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : register address */ -/* val : value */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -u32_t zfiDbgWriteReg(zdev_t* dev, u32_t addr, u32_t val) -{ - u32_t cmd[3]; - u16_t ret; - - cmd[0] = 0x00000108; - cmd[1] = addr; - cmd[2] = val; - - ret = zfIssueCmd(dev, cmd, 12, ZM_OID_WRITE, 0); - return ret; -} -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiDbgWriteFlash */ -/* Write flash. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : register address */ -/* val : value */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Yjsung ZyDAS Technology Corporation 2007.02 */ -/* */ -/************************************************************************/ -u32_t zfiDbgWriteFlash(zdev_t* dev, u32_t addr, u32_t val) -{ - u32_t cmd[3]; - u16_t ret; - - //cmd[0] = 0x0000B008; - /* len[0] : type[0xB0] : seq[?] */ - cmd[0] = 8 | (ZM_CMD_WFLASH << 8); - cmd[1] = addr; - cmd[2] = val; - - ret = zfIssueCmd(dev, cmd, 12, ZM_OID_WRITE, 0); - return ret; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiDbgWriteEeprom */ -/* Write EEPROM. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : register address */ -/* val : value */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Paul ZyDAS Technology Corporation 2007.06 */ -/* */ -/************************************************************************/ -u32_t zfiDbgWriteEeprom(zdev_t* dev, u32_t addr, u32_t val) -{ - u32_t cmd[3]; - u16_t ret; - - //cmd[0] = 0x0000B008; - /* len[0] : type[0xB0] : seq[?] */ - cmd[0] = 8 | (ZM_CMD_WREEPROM << 8); - cmd[1] = addr; - cmd[2] = val; - - ret = zfIssueCmd(dev, cmd, 12, ZM_EEPROM_WRITE, 0); - return ret; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiDbgBlockWriteEeprom */ -/* Block Write Eeprom. */ -/* */ -/* p.s: now,it will write 16 bytes register data per block (N=4) */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : register address */ -/* buf : input data buffer pointer */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Paul ZyDAS Technology Corporation 2007.06 */ -/* */ -/************************************************************************/ -//#define N buflen/4 -//#define SIZE (2*N+1) - -u32_t zfiDbgBlockWriteEeprom(zdev_t* dev, u32_t addr, u32_t* buf) -{ - u32_t cmd[9]; //2N+1 - u16_t ret,i; - - //cmd[0] = 0x0000B008; - /* len[0] : type[0xB0] : seq[?] */ - - //cmd[0] = (8*N) | (ZM_CMD_WFLASH << 8); - cmd[0] = 32 | (ZM_CMD_WREEPROM << 8); //8N - - for (i=0; i<4; i++) // i 0x2000) - { - return 1; - } - - for(i=0; ihpPrivate)->halReInit ) - { - return 1; - } - - /* len[0] : type[0x81] : seq[?] */ - cmd[0] = 0 | (ZM_CMD_TALLY << 8); - ret = zfIssueCmd(dev, cmd, 4, ZM_OID_TALLY, 0); - - /* len[0] : type[0x82] : seq[?] */ - cmd[0] = 0 | (ZM_CMD_TALLY_APD << 8); - ret = zfIssueCmd(dev, cmd, 4, ZM_OID_TALLY_APD, 0); - - return ret; -} - - -u32_t zfiDbgSetIFSynthesizer(zdev_t* dev, u32_t value) -{ - u32_t cmd[2]; - u16_t ret; - - /* len[4] : type[0x32] : seq[?] */ - cmd[0] = 0x4 | (ZM_OID_SYNTH << 8); - cmd[1] = value; - - ret = zfIssueCmd(dev, cmd, 8, ZM_OID_SYNTH, 0); - return ret; -} - -u32_t zfiDbgQueryHwTxBusy(zdev_t* dev) -{ - u32_t cmd[1]; - u16_t ret; - - /* len[4] : type[0xC0] : seq[?] */ - cmd[0] = 0 | (ZM_CMD_DKTX_STATUS << 8); - - ret = zfIssueCmd(dev, cmd, 4, ZM_OID_DKTX_STATUS, 0); - return ret; -} - -//Paul++ -#if 0 -u16_t zfHpBlockEraseFlash(zdev_t *dev, u32_t addr) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t ret; - - cmd[0] = 0x00000004 | (ZM_CMD_FLASH_ERASE << 8); - cmd[1] = addr; - - ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, NULL); - return ret; -} -#endif - -#if 0 -u16_t zfiDbgProgramFlash(zdev_t *dev, u32_t offset, u32_t len, u32_t *data) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t ret; - u16_t i; - - - cmd[0] = (ZM_CMD_FLASH_PROG << 8) | ((len+8) & 0xff); - cmd[1] = offset; - cmd[2] = len; - - for (i = 0; i < (len >> 2); i++) - { - cmd[3+i] = data[i]; - } - - ret = zfIssueCmd(dev, cmd, 12, ZM_OID_FLASH_PROGRAM, NULL); - - return ret; -} -#endif - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiDbgChipEraseFlash */ -/* Chip Erase Flash. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Paul Atheros Technology Corporation 2007.09 */ -/* */ -/************************************************************************/ -u16_t zfiDbgChipEraseFlash(zdev_t *dev) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u16_t ret; - - cmd[0] = 0x00000000 | (ZM_CMD_FLASH_ERASE << 8); - - ret = zfIssueCmd(dev, cmd, 4, ZM_OID_INTERNAL_WRITE, NULL); - return ret; -} -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiDbgGetFlashCheckSum */ -/* Get FlashCheckSum. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : Start address of getchksum */ -/* len : total lenth of calculate getchksum */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Paul Atheros Technology Corporation 2007.08 */ -/* */ -/************************************************************************/ -u32_t zfiDbgGetFlashCheckSum(zdev_t *dev, u32_t addr, u32_t len) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u32_t ret; - - cmd[0] = 0x00000008 | (ZM_CMD_FLASH_CHKSUM << 8); - cmd[1] = addr; - cmd[2] = len; - - ret = zfIssueCmd(dev, cmd, 12, ZM_OID_FLASH_CHKSUM, NULL); - - return ret; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiDbgReadFlash */ -/* Read Flash. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* addr : Start address of read flash */ -/* len : total lenth of read flash data */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Paul Atheros Technology Corporation 2007.09 */ -/* */ -/************************************************************************/ -u32_t zfiDbgReadFlash(zdev_t *dev, u32_t addr, u32_t len) -{ - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u32_t ret; - - cmd[0] = len | (ZM_CMD_FLASH_READ << 8); - cmd[1] = addr; - - ret = zfIssueCmd(dev, cmd, 8, ZM_OID_FLASH_READ, NULL); - return ret; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiDownloadFwSet */ -/* Before Download FW, */ -/* Command FW to Software reset and close watch dog control. */ -/* */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* 0 : success */ -/* other : fail */ -/* */ -/* AUTHOR */ -/* Paul Atheros Technology Corporation 2007.09 */ -/* */ -/************************************************************************/ -u32_t zfiDownloadFwSet(zdev_t *dev) -{ -//softwarereset -//close watch dog - u32_t cmd[(ZM_MAX_CMD_SIZE/4)]; - u32_t ret; - - cmd[0] = 0x00000008 | (ZM_CMD_FW_DL_INIT << 8); - - ret = zfIssueCmd(dev, cmd, 12, ZM_OID_FW_DL_INIT, NULL); - - return ret; -} -//Paul-- diff --git a/drivers/staging/otus/hal/hpusb.c b/drivers/staging/otus/hal/hpusb.c deleted file mode 100644 index ee939005be7d..000000000000 --- a/drivers/staging/otus/hal/hpusb.c +++ /dev/null @@ -1,1589 +0,0 @@ -/* - * 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.c */ -/* */ -/* Abstract */ -/* This module contains USB descriptor functions. */ -/* */ -/* NOTES */ -/* None */ -/* */ -/************************************************************************/ -#include "../80211core/cprecomp.h" -#include "hpani.h" -#include "hpusb.h" - -extern void zfwUsbCmd(zdev_t* dev, u8_t endpt, u32_t* cmd, u16_t cmdLen); - -extern void zfIdlRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen); -extern u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val); -extern u16_t zfFlushDelayWrite(zdev_t* dev); - - -#define USB_ENDPOINT_TX_INDEX 1 -#define USB_ENDPOINT_RX_INDEX 2 -#define USB_ENDPOINT_INT_INDEX 3 -#define USB_ENDPOINT_CMD_INDEX 4 - -void zfIdlCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen) -{ -#if ZM_SW_LOOP_BACK != 1 - zfwUsbCmd(dev, USB_ENDPOINT_CMD_INDEX, cmd, cmdLen); -#endif - - return; -} - - -/* zfAdjustCtrlSetting: fit OUTS format */ -/* convert MIMO2 to OUTS */ -void zfAdjustCtrlSetting(zdev_t* dev, u16_t* header, zbuf_t* buf) -{ - /* MIMO2 => OUTS FB-50 */ - /* length not change, only modify format */ - - u32_t oldMT; - u32_t oldMCS; - - u32_t phyCtrl; - u32_t oldPhyCtrl; - - u16_t tpc = 0; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - /* mm */ - if (header == NULL) - { - oldPhyCtrl = zmw_buf_readh(dev, buf, 4) | ((u32_t)zmw_buf_readh(dev, buf, 6) << 16); - } - else - { - oldPhyCtrl = header[2] | ((u32_t)header[3] <<16); - } - - phyCtrl = 0; - - - /* MT : Bit[1~0] */ - oldMT = oldPhyCtrl&0x3; - phyCtrl |= oldMT; - if ( oldMT == 0x3 ) /* DL-OFDM (Duplicate Legacy OFDM) */ - phyCtrl |= 0x1; - - - /* PT : Bit[2] HT PT: 0 Mixed mode 1 Green field */ - phyCtrl |= (oldPhyCtrl&0x4); - - /* Bandwidth control : Bit[4~3] */ - if ( oldPhyCtrl&0x800000 ) /* Bit23 : 40M */ - { - #if 0 - if (oldMT == 0x3) /* DL-OFDM */ - phyCtrl |= (0x3<<3); /* 40M duplicate */ - else - phyCtrl |= (0x2<<3); /* 40M shared */ - #else - if (oldMT == 0x2 && ((struct zsHpPriv*)wd->hpPrivate)->hwBw40) - { - phyCtrl |= (0x2<<3); /* 40M shared */ - } - #endif - } - else { - oldPhyCtrl &= ~0x80000000; - } - - /* MCS : Bit[24~18] */ - oldMCS = (oldPhyCtrl&0x7f0000)>>16; /* Bit[22~16] */ - phyCtrl |= (oldMCS<<18); - - /* Short GI : Bit[31]*/ - phyCtrl |= (oldPhyCtrl&0x80000000); - - /* AM : Antenna mask */ - //if ((oldMT == 2) && (oldMCS > 7)) - if (hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM) - { - phyCtrl |= (0x1<<15); - } - else - { - /* HT Tx 2 chain */ - /* OFDM 6M/9M/12M/18M/24M Tx 2 chain */ - /* OFDM 36M/48M/54M/ Tx 1 chain */ - /* CCK Tx 2 chain */ - if ((oldMT == 2) || (oldMT == 3)) - { - phyCtrl |= (0x5<<15); - } - else if (oldMT == 1) - { - if ((oldMCS == 0xb) || (oldMCS == 0xf) || - (oldMCS == 0xa) || (oldMCS == 0xe) || - (oldMCS == 0x9)) //6M/9M/12M/18M/24M - { - phyCtrl |= (0x5<<15); - } - else - { - phyCtrl |= (0x1<<15); - } - } - else //(oldMT==0) - { - phyCtrl |= (0x5<<15); - } - } - //else - // phyCtrl |= (0x1<<15); - - /* TPC */ - /* TODO : accelerating these code */ - if (hpPriv->hwFrequency < 3000) - { - if (oldMT == 0) - { - /* CCK */ - tpc = (hpPriv->tPow2xCck[oldMCS]&0x3f); - } - else if (oldMT == 1) - { - /* OFDM */ - if (oldMCS == 0xc) - { - tpc = (hpPriv->tPow2x2g[3]&0x3f); - } - else if (oldMCS == 0x8) - { - tpc = (hpPriv->tPow2x2g[2]&0x3f); - } - else if (oldMCS == 0xd) - { - tpc = (hpPriv->tPow2x2g[1]&0x3f); - } - else if (oldMCS == 0x9) - { - tpc = ((hpPriv->tPow2x2g[0]-hpPriv->tPow2x2g24HeavyClipOffset)&0x3f); - } - else - { - tpc = (hpPriv->tPow2x2g[0]&0x3f); - } - } - else if (oldMT == 2) - { - if ( oldPhyCtrl&0x800000 ) /* Bit23 : 40M */ - { - /* HT 40 */ - tpc = (hpPriv->tPow2x2gHt40[oldMCS&0x7]&0x3f); - } - else - { - /* HT 20 */ - tpc = (hpPriv->tPow2x2gHt20[oldMCS&0x7]&0x3f); - } - } - } - else //5GHz - { - if (oldMT == 1) - { - /* OFDM */ - if (oldMCS == 0xc) - { - tpc = (hpPriv->tPow2x5g[3]&0x3f); - } - else if (oldMCS == 0x8) - { - tpc = (hpPriv->tPow2x5g[2]&0x3f); - } - else if (oldMCS == 0xd) - { - tpc = (hpPriv->tPow2x5g[1]&0x3f); - } - else - { - tpc = (hpPriv->tPow2x5g[0]&0x3f); - } - } - else if (oldMT == 2) - { - if ( oldPhyCtrl&0x800000 ) /* Bit23 : 40M */ - { - /* HT 40 */ - tpc = (hpPriv->tPow2x5gHt40[oldMCS&0x7]&0x3f); - } - else - { - /* HT 20 */ - tpc = (hpPriv->tPow2x5gHt20[oldMCS&0x7]&0x3f); - } - } - } - - /* Tx power adjust for HT40 */ - /* HT40 +1dBm */ - if ((oldMT==2) && (oldPhyCtrl&0x800000) ) - { - tpc += 2; - } - tpc &= 0x3f; - - /* Evl force tx TPC */ - if(wd->forceTxTPC) - { - tpc = (u16_t)(wd->forceTxTPC & 0x3f); - } - - if (hpPriv->hwFrequency < 3000) { - wd->maxTxPower2 &= 0x3f; - tpc = (tpc > wd->maxTxPower2)? wd->maxTxPower2 : tpc; - } else { - wd->maxTxPower5 &= 0x3f; - tpc = (tpc > wd->maxTxPower5)? wd->maxTxPower5 : tpc; - } - - -#define ZM_MIN_TPC 5 -#define ZM_TPC_OFFSET 5 -#define ZM_SIGNAL_THRESHOLD 56 - if ((wd->sta.bScheduleScan == FALSE) && (wd->sta.bChannelScan == FALSE)) - { - if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) - && (zfStaIsConnected(dev)) - && (wd->SignalStrength > ZM_SIGNAL_THRESHOLD)) - { - if (tpc > ((ZM_MIN_TPC+ZM_TPC_OFFSET)*2)) - { - tpc -= (ZM_TPC_OFFSET*2); - } - else if (tpc > (ZM_MIN_TPC*2)) - { - tpc = (ZM_MIN_TPC*2); - } - } - } -#undef ZM_MIN_TPC -#undef ZM_TPC_OFFSET -#undef ZM_SIGNAL_THRESHOLD - - #ifndef ZM_OTUS_LINUX_PHASE_2 - phyCtrl |= (tpc & 0x3f) << 9; - #endif - - /* Set bits[8:6]BF-MCS for heavy clip */ - if ((phyCtrl&0x3) == 2) - { - phyCtrl |= ((phyCtrl >> 12) & 0x1c0); - } - - /* PHY control */ - if (header == NULL) - { - zmw_buf_writeh(dev, buf, 4, (u16_t) (phyCtrl&0xffff)); - zmw_buf_writeh(dev, buf, 6, (u16_t) (phyCtrl>>16)); - } - else - { - //PHY control L - header[2] = (u16_t) (phyCtrl&0xffff); - //PHY control H - header[3] = (u16_t) (phyCtrl>>16); - } - - zm_msg2_tx(ZM_LV_2, "old phy ctrl = ", oldPhyCtrl); - zm_msg2_tx(ZM_LV_2, "new phy ctrl = ", phyCtrl); - //DbgPrint("old phy ctrl =%08x \n", oldPhyCtrl); - //DbgPrint("new phy ctrl =%08x \n", phyCtrl); -} - - -#define EXTRA_INFO_LEN 24 //RSSI(7) + EVM(12) + PHY(1) + MACStatus(4) -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) -{ -#if ZM_SW_LOOP_BACK == 1 - zbuf_t *rxbuf; - u8_t *puRxBuf; - u8_t *pHdr; - u8_t *psnap; - u16_t plcplen = 12; - u16_t i; - u16_t swlpOffset; -#endif /* #if ZM_SW_LOOP_BACK == 1 */ - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - zm_msg1_tx(ZM_LV_1, "zfHpSend(), len = ", 12 + headerLen-8 + snapLen + zfwBufGetSize(dev, buf) + 4 + 8); - - /* Adjust ctrl setting : 6N14 yjsung */ - zfAdjustCtrlSetting(dev, header, buf); - -#if ZM_SW_LOOP_BACK != 1 - hpPriv->usbSendBytes += zfwBufGetSize(dev, buf); - hpPriv->usbAcSendBytes[ac&0x3] += zfwBufGetSize(dev, buf); - - /* Submit USB Out Urb */ - zfwUsbSend(dev, USB_ENDPOINT_TX_INDEX, (u8_t *)header, headerLen, - (u8_t *)snap, snapLen, (u8_t *)tail, tailLen, buf, offset); -#endif - -#if ZM_SW_LOOP_BACK == 1 - - rxbuf = zfwBufAllocate(dev, plcplen + headerLen-8 + snapLen + (zfwBufGetSize(dev, buf)-offset) + 4 + EXTRA_INFO_LEN); - pHdr = (u8_t *) header+8; - psnap = (u8_t *) snap; - - zmw_enter_critical_section(dev); - /* software loop back */ - /* Copy WLAN header and packet buffer */ - swlpOffset = plcplen; - - for(i = 0; i < headerLen-8; i++) - { - zmw_rx_buf_writeb(dev, rxbuf, swlpOffset+i, pHdr[i]); - } - - swlpOffset += headerLen-8; - - /* Copy SNAP header */ - for(i = 0; i < snapLen; i++) - { - zmw_rx_buf_writeb(dev, rxbuf, swlpOffset+i, psnap[i]); - } - - swlpOffset += snapLen; - - /* Copy body from tx buf to rxbuf */ - for(i = 0; i < (zfwBufGetSize(dev, buf)-offset); i++) - { - u8_t value = zmw_rx_buf_readb(dev, buf, i+offset); - zmw_rx_buf_writeb(dev, rxbuf, swlpOffset+i, value); - } - - /* total length = PLCP + MacHeader + Payload + FCS + RXstatus */ - /* 12 + headerLen-8 + snapLen + buf length + 4 + 8 */ - zfwSetBufSetSize(dev, rxbuf, swlpOffset + (zfwBufGetSize(dev, buf)-offset) + 4 + EXTRA_INFO_LEN ); - - zmw_leave_critical_section(dev); - - zfwBufFree(dev, buf, 0); - - //zfwDumpBuf(dev, rxbuf); - //------------------------------------------------- - - //zfCoreRecv(dev, rxbuf); - -#endif /* #if ZM_SW_LOOP_BACK */ - - return ZM_SUCCESS; -} - -/* Report moniter Hal rx information about rssi, evm, bandwidth, SG etc */ -void zfHpQueryMonHalRxInfo(zdev_t* dev, u8_t *monHalRxInfo) -{ - zmw_get_wlan_dev(dev); - zfMemoryCopy(monHalRxInfo, - (u8_t*)&(((struct zsHpPriv*)wd->hpPrivate)->halRxInfo), - sizeof(struct zsHalRxInfo)); -} - - -u8_t zfIsDataFrame(zdev_t* dev, zbuf_t* buf) -{ - u8_t frameType; - u8_t mpduInd; - - mpduInd = zmw_rx_buf_readb(dev, buf, zfwBufGetSize(dev, buf)-1); - - /* sinlge or First */ - if ((mpduInd & 0x30) == 0x00 || (mpduInd & 0x30) == 0x20) - { - frameType = zmw_rx_buf_readb(dev, buf, 12); - } - else - { - frameType = zmw_rx_buf_readb(dev, buf, 0); - } - - if((frameType & 0xf) == ZM_WLAN_DATA_FRAME) - return 1; - else - return 0; -} - -u32_t zfcConvertRateOFDM(zdev_t* dev, zbuf_t* buf) -{ - // What's the default value?? - u32_t MCS = 0; - - switch(zmw_rx_buf_readb(dev, buf, 0)& 0xf) - { - case 0xb: - MCS = 0x4; - break; - case 0xf: - MCS = 0x5; - break; - case 0xa: - MCS = 0x6; - break; - case 0xe: - MCS = 0x7; - break; - case 0x9: - MCS = 0x8; - break; - case 0xd: - MCS = 0x9; - break; - case 0x8: - MCS = 0xa; - break; - case 0xc: - MCS = 0xb; - break; - } - return MCS; -} - -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 - ) -{ - u8_t modulation,mpduInd; - u16_t low, high, msb; - s16_t payloadLen = 0; - - zmw_get_wlan_dev(dev); - - mpduInd = zmw_rx_buf_readb(dev, buf, len-1); - modulation = zmw_rx_buf_readb(dev, buf, (len-1)) & 0x3; - *rxMT = modulation; - - //zm_debug_msg1(" modulation= ", modulation); - switch (modulation) { - case 0: /* CCK Mode */ - low = zmw_rx_buf_readb(dev, buf, 2); - high = zmw_rx_buf_readb(dev, buf, 3); - payloadLen = (low | high << 8) - 4; - if (wd->enableHALDbgInfo) - { - *rxMCS = zmw_rx_buf_readb(dev, buf, 0); - *rxBW = 0; - *rxSG = 0; - } - break; - case 1: /* Legacy-OFDM mode */ - low = zmw_rx_buf_readb(dev, buf, 0) >> 5; - high = zmw_rx_buf_readb(dev, buf, 1); - msb = zmw_rx_buf_readb(dev, buf, 2) & 0x1; - payloadLen = (low | (high << 3) | (msb << 11)) - 4; - if (wd->enableHALDbgInfo) - { - *rxMCS = zfcConvertRateOFDM(dev, buf); - *rxBW = 0; - *rxSG = 0; - } - break; - case 2: /* HT OFDM mode */ - //zm_debug_msg1("aggregation= ", (zmw_rx_buf_readb(dev, buf, 6) >> 3) &0x1 ); - if ((mpduInd & 0x30) == 0x00 || (mpduInd & 0x30) == 0x10) //single or last mpdu - payloadLen = len - 24 - 4 - plcpHdrLen; // - rxStatus - fcs - else { - payloadLen = len - 4 - 4 - plcpHdrLen; // - rxStatus - fcs - //zm_debug_msg1("first or middle mpdu, plcpHdrLen= ", plcpHdrLen); - } - if (wd->enableHALDbgInfo) - { - *rxMCS = zmw_rx_buf_readb(dev, buf, 3) & 0x7f; - *rxBW = (zmw_rx_buf_readb(dev, buf, 3) >> 7) & 0x1; - *rxSG = (zmw_rx_buf_readb(dev, buf, 6) >> 7) & 0x1; - } - break; - default: - break; - - } - /* return the payload length - FCS */ - if (payloadLen < 0) payloadLen = 0; - return payloadLen; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfiUsbRecv */ -/* Callback function for USB IN Transfer. */ -/* */ -/* INPUTS */ -/* dev: device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Yuan-Gu Wei ZyDAS Technology Corporation 2005.10 */ -/* */ -/************************************************************************/ -#define ZM_INT_USE_EP2 1 -#define ZM_INT_USE_EP2_HEADER_SIZE 12 - -#if ZM_INT_USE_EP2 == 1 -void zfiUsbRegIn(zdev_t* dev, u32_t* rsp, u16_t rspLen); -#endif - -#ifdef ZM_OTUS_RX_STREAM_MODE -void zfiUsbRecvPerPkt(zdev_t *dev, zbuf_t *buf) -#else -void zfiUsbRecv(zdev_t *dev, zbuf_t *buf) -#endif -{ - - -#if ZM_FW_LOOP_BACK != 1 - u8_t mpduInd; - u16_t plcpHdrLen; - u16_t crcPlusRxStatusLen; - u16_t len, payloadLen=0; - u16_t i; //CWYang(+) - struct zsAdditionInfo addInfo; - u32_t rxMT; - u32_t rxMCS; - u32_t rxBW; - u32_t rxSG; - struct zsHpPriv* hpPriv; - - zmw_get_wlan_dev(dev); - hpPriv=wd->hpPrivate; - - //zm_msg0_rx(ZM_LV_0, "zfiUsbRecv()"); - -#if ZM_INT_USE_EP2 == 1 - - for (i=0; i<(ZM_INT_USE_EP2_HEADER_SIZE>>1); i++) - { - if (zmw_rx_buf_readh(dev, buf, i*2) != 0xffff) - break; - } - - if (i==(ZM_INT_USE_EP2_HEADER_SIZE>>1)) - { - u32_t rsp[ZM_USB_MAX_EPINT_BUFFER/4]; - u16_t rspLen; - u32_t rspi; - u8_t* pdst = (u8_t*)rsp; - - /* Interrupt Rsp */ - rspLen = (u16_t) zfwBufGetSize(dev, buf)-ZM_INT_USE_EP2_HEADER_SIZE; - - if (rspLen > 60) - { - zm_debug_msg1("Get error len by EP2 = \n", rspLen); - /* free USB buf */ - zfwBufFree(dev, buf, 0); - return; - } - - for (rspi=0; rspizfcbUsbRegIn) - // adapter->zfcbUsbRegIn(adapter, rsp, rspLen); - zfiUsbRegIn(dev, rsp, rspLen); - - /* free USB buf */ - zfwBufFree(dev, buf, 0); - return; - } -#endif /* end of #if ZM_INT_USE_EP2 == 1 */ - - ZM_PERFORMANCE_RX_MPDU(dev, buf); - - if (wd->swSniffer) - { - /* airopeek: Report everything up */ - if (wd->zfcbRecv80211 != NULL) - { - wd->zfcbRecv80211(dev, buf, NULL); - } - } - - /* Read the last byte */ - len = zfwBufGetSize(dev, buf); - mpduInd = zmw_rx_buf_readb(dev, buf, len-1); - - /* First MPDU */ - if((mpduInd & 0x30) == 0x20) - { - u16_t duration; - if (zmw_rx_buf_readb(dev, buf, 36) == 0) //AC = BE - { - duration = zmw_rx_buf_readh(dev, buf, 14); - if (duration > hpPriv->aggMaxDurationBE) - { - hpPriv->aggMaxDurationBE = duration; - } - else - { - if (hpPriv->aggMaxDurationBE > 10) - { - hpPriv->aggMaxDurationBE--; - } - } - //DbgPrint("aggMaxDurationBE=%d", hpPriv->aggMaxDurationBE); - } - } - -#if 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; - } - } - - /* Last MPDU or Single MPDU */ - if ((mpduInd & 0x30) == 0x00 || (mpduInd & 0x30) == 0x10) - { - crcPlusRxStatusLen = EXTRA_INFO_LEN + 4; // Extra bytes + FCS - } - else - { - crcPlusRxStatusLen = 4 + 4; // Extra 4 bytes + FCS - } -#else - plcpHdrLen = 12; - crcPlusRxStatusLen = EXTRA_INFO_LEN + 4; // Extra bytes + FCS -#endif - - if (len < (plcpHdrLen+10+crcPlusRxStatusLen)) - { - zm_msg1_rx(ZM_LV_0, "Invalid Rx length=", len); - //zfwDumpBuf(dev, buf); - - zfwBufFree(dev, buf, 0); - return; - } - - /* display RSSI combined */ - /* - * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{ - * ¢x PLCP Header ¢x MPDU ¢x RSSI ¢x EVM ¢x PHY Err ¢x MAC Status ¢x - * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t - * ¢x 12 ¢x n ¢x 7 ¢x 12 ¢x 1 ¢x 4 ¢x - * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢} - * RSSI filed (From BB and MAC just pass them to host) - * Byte1: RSSI for antenna 0. - * Byte2: RSSI for antenna 1. - * Byte3: RSSI for antenna 2. - * Byte4: RSSI for antenna 0 extension. - * Byte5: RSSI for antenna 1 extension. - * Byte6: RSSI for antenna 2 extension. - * Byte7: RSSI for antenna combined. - */ - - //zm_debug_msg1(" recv RSSI = ", zmw_rx_buf_readb(dev, buf, (len-1)-17)); - - payloadLen = zfHpGetPayloadLen(dev, buf, len, plcpHdrLen, &rxMT, &rxMCS, &rxBW, &rxSG); - - /* Hal Rx info */ - /* First MPDU or Single MPDU */ - if(((mpduInd & 0x30) == 0x00) || ((mpduInd & 0x30) == 0x20)) - { - if (wd->enableHALDbgInfo && zfIsDataFrame(dev, buf)) - { - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxDataMT = rxMT; - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxDataMCS = rxMCS; - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxDataBW = rxBW; - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxDataSG = rxSG; - } - } - - if ((plcpHdrLen + payloadLen) > len) { - zm_msg1_rx(ZM_LV_0, "Invalid payload length=", payloadLen); - zfwBufFree(dev, buf, 0); - return; - } - - //Store Rx Tail Infomation before Remove--CWYang(+) - -#if 0 - for (i = 0; i < crcPlusRxStatusLen-4; i++) - { - addInfo.Tail.Byte[i] = - zmw_rx_buf_readb(dev, buf, len - crcPlusRxStatusLen + 4 + i); - } -#else -/* -* Brief format of OUTS chip -* ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{ -* ¢x PLCP Header ¢x MPDU ¢x RSSI ¢x EVM ¢x PHY Err ¢x MAC Status ¢x -* ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t -* ¢x 12 ¢x n ¢x 7 ¢x 12 ¢x 1 ¢x 4 ¢x -* ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢} -* RSSI: -* Byte 1 antenna 0 -* Byte 2 antenna 1 -* Byte 3 antenna 2 -* Byte 4 antenna 0 extension -* Byte 5 antenna 1 extension -* Byte 6 antenna 2 extension -* Byte 7 antenna combined -* EVM: -* Byte 1 Stream 0 pilot 0 -* Byte 2 Stream 0 pilot 1 -* Byte 3 Stream 0 pilot 2 -* Byte 4 Stream 0 pilot 3 -* Byte 5 Stream 0 pilot 4 -* Byte 6 Stream 0 pilot 5 -* Byte 7 Stream 1 pilot 0 -* Byte 8 Stream 1 pilot 1 -* Byte 9 Stream 1 pilot 2 -* Byte 10 Stream 1 pilot 3 -* Byte 11 Stream 1 pilot 4 -* Byte 12 Stream 1 pilot 5 -*/ - - /* Fill the Tail information */ - /* Last MPDU or Single MPDU */ - if ((mpduInd & 0x30) == 0x00 || (mpduInd & 0x30) == 0x10) - { -#define ZM_RX_RSSI_COMPENSATION 27 - u8_t zm_rx_rssi_compensation = ZM_RX_RSSI_COMPENSATION; - - /* RSSI information */ - addInfo.Tail.Data.SignalStrength1 = zmw_rx_buf_readb(dev, buf, - (len-1) - 17) + ((hpPriv->rxStrongRSSI == 1)?zm_rx_rssi_compensation:0); -#undef ZM_RX_RSSI_COMPENSATION - - /* EVM */ - - /* TODO: for RD/BB debug message */ - /* save current rx hw infomration, report to DrvCore/Application */ - if (wd->enableHALDbgInfo && zfIsDataFrame(dev, buf)) - { - u8_t trssi; - for (i=0; i<7; i++) - { - trssi = zmw_rx_buf_readb(dev, buf, (len-1) - 23 + i); - if (trssi&0x80) - { - trssi = ((~((u8_t)trssi) & 0x7f) + 1) & 0x7f; - } - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[i] = trssi; - - } - if (rxMT==2) - { - //if (rxBW) - //{ - for (i=0; i<12; i++) - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[i] = - zmw_rx_buf_readb(dev, buf, (len-1) - 16 + i); - //} - //else - //{ - // for (i=0; i<4; i++) - // ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[i] = - // zmw_rx_buf_readb(dev, buf, (len-1) - 16 + i); - //} - } - - #if 0 - /* print */ - zm_dbg(("MT(%d) MCS(%d) BW(%d) SG(%d) RSSI:%d,%d,%d,%d,%d,%d,%d EVM:(%d,%d,%d,%d,%d,%d)(%d,%d,%d,%d,%d,%d)\n", - rxMT, - rxMCS, - rxBW, - rxSG, - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[0], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[1], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[2], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[3], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[4], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[5], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[6], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[0], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[1], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[2], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[3], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[4], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[5], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[6], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[7], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[8], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[9], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[10], - ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[11] - )); - #endif - } /* if (wd->enableHALDbgInfo && zfIsDataFrame(dev, buf)) */ - - } - else - { - /* Mid or First aggregate frame without phy rx information */ - addInfo.Tail.Data.SignalStrength1 = 0; - } - - addInfo.Tail.Data.SignalStrength2 = 0; - addInfo.Tail.Data.SignalStrength3 = 0; - addInfo.Tail.Data.SignalQuality = 0; - - addInfo.Tail.Data.SAIndex = zmw_rx_buf_readb(dev, buf, len - 4); - addInfo.Tail.Data.DAIndex = zmw_rx_buf_readb(dev, buf, len - 3); - addInfo.Tail.Data.ErrorIndication = zmw_rx_buf_readb(dev, buf, len - 2); - addInfo.Tail.Data.RxMacStatus = zmw_rx_buf_readb(dev, buf, len - 1); - -#endif - /* Remove CRC and Rx Status */ - zfwBufSetSize(dev, buf, (len-crcPlusRxStatusLen)); - //zfwBufSetSize(dev, buf, payloadLen + plcpHdrLen); /* payloadLen + PLCP 12 - FCS 4*/ - - //Store PLCP Header Infomation before Remove--CWYang(+) - if (plcpHdrLen != 0) - { - for (i = 0; i < plcpHdrLen; i++) - { - addInfo.PlcpHeader[i] = zmw_rx_buf_readb(dev, buf, i); - } - } - else - { - addInfo.PlcpHeader[0] = 0; - } - /* Remove PLCP header */ - zfwBufRemoveHead(dev, buf, plcpHdrLen); - - /* handle 802.11 frame */ - zfCoreRecv(dev, buf, &addInfo); - -#else - /* Firmware loopback: Rx frame = Tx frame */ - /* convert Rx frame to fit receive frame format */ - zbuf_t *new_buf; - u8_t ctrl_offset = 8; - u8_t PLCP_Len = 12; - u8_t data; - u8_t i; - - - /* Tx: | ctrl_setting | Mac hdr | data | */ - /* 8 24 x */ - - /* Rx: | PLCP | Mac hdr | data | FCS | Rxstatus | */ - /* 12 24 x 4 8 */ - - /* new allocate a rx format size buf */ - new_buf = zfwBufAllocate(dev, zfwBufGetSize(dev, buf)-8+12+4+EXTRA_INFO_LEN); - - for (i=0; ihpPrivate; - srcBufPtr = zmw_buf_get_buffer(dev, buf); - - bufferLength = zfwBufGetSize(dev, buf); - - /* Zero Length Transfer */ - if (!bufferLength) - { - zfwBufFree(dev, buf, 0); - return; - } - - usbRxRemainLen = halPriv->usbRxRemainLen; - usbRxPktLen = halPriv->usbRxTransferLen; - - /* Check whether there is any data in the last transfer */ - if (usbRxRemainLen != 0 ) - { - zbuf_t *remainBufPtr = halPriv->remainBuf; - u8_t* BufPtr = NULL; - - if ( remainBufPtr != NULL ) - { - BufPtr = zmw_buf_get_buffer(dev, remainBufPtr); - } - - index = usbRxRemainLen; - usbRxRemainLen -= halPriv->usbRxPadLen; - - /* Copy data */ - if ( BufPtr != NULL ) - { - zfwMemoryCopy(&(BufPtr[usbRxPktLen]), srcBufPtr, usbRxRemainLen); - } - - usbRxPktLen += usbRxRemainLen; - halPriv->usbRxRemainLen = 0; - - if ( remainBufPtr != NULL ) - { - zfwBufSetSize(dev, remainBufPtr, usbRxPktLen); - rxBufPool[rxBufPoolIndex++] = remainBufPtr; - } - halPriv->remainBuf = NULL; - } - - //zm_debug_msg1("length: %d\n", (int)pUsbRxTransfer->pRxUrb->UrbBulkOrInterruptTransfer.TransferBufferLength); - - bufferLength = zfwBufGetSize(dev, buf); -//printk("bufferLength %d\n", bufferLength); - while(index < bufferLength) - { - u16_t pktLen; - u16_t pktTag; - //u8_t *ptr = (u8_t*)((struct zsBuffer*)pUsbRxTransfer->buf)->data; - u8_t *ptr = srcBufPtr; - - /* Retrieve packet length and tag */ - pktLen = ptr[index] + (ptr[index+1] << 8); - pktTag = ptr[index+2] + (ptr[index+3] << 8); - - if (pktTag == ZM_USB_STREAM_MODE_TAG) - { - u16_t padLen; - - zm_assert(pktLen < ZM_WLAN_MAX_RX_SIZE); - - //printk("Get a packet, pktLen: 0x%04x\n", pktLen); - #if 0 - /* Dump data */ - for (ii = index; ii < pkt_len+4;) - { - DbgPrint("0x%02x ", - (zmw_rx_buf_readb(adapter, pUsbRxTransfer->buf, ii) & 0xff)); - - if ((++ii % 16) == 0) - DbgPrint("\n"); - } - - DbgPrint("\n"); - #endif - - /* Calcuate the padding length, in the current design, - the length should be padded to 4 byte boundray. */ - padLen = ZM_USB_STREAM_MODE_TAG_LEN - (pktLen & 0x3); - - if(padLen == ZM_USB_STREAM_MODE_TAG_LEN) - padLen = 0; - - chkIdx = index; - index = index + ZM_USB_STREAM_MODE_TAG_LEN + pktLen + padLen; - - if (chkIdx > ZM_MAX_USB_IN_TRANSFER_SIZE) - { - zm_debug_msg1("chkIdx is too large, chkIdx: %d\n", chkIdx); - zm_assert(0); - status = 1; - break; - } - - if (index > ZM_MAX_USB_IN_TRANSFER_SIZE) - { - //struct zsBuffer* BufPtr; - //struct zsBuffer* UsbBufPtr; - u8_t *BufPtr; - u8_t *UsbBufPtr; - - halPriv->usbRxRemainLen = index - ZM_MAX_USB_IN_TRANSFER_SIZE; // - padLen; - halPriv->usbRxTransferLen = ZM_MAX_USB_IN_TRANSFER_SIZE - - chkIdx - ZM_USB_STREAM_MODE_TAG_LEN; - halPriv->usbRxPadLen = padLen; - //check_index = index; - - if (halPriv->usbRxTransferLen > ZM_WLAN_MAX_RX_SIZE) - { - zm_debug_msg1("check_len is too large, chk_len: %d\n", - halPriv->usbRxTransferLen); - status = 1; - break; - } - - /* Allocate a skb buffer */ - newBuf = zfwBufAllocate(dev, ZM_WLAN_MAX_RX_SIZE); - - if ( newBuf != NULL ) - { - BufPtr = zmw_buf_get_buffer(dev, newBuf); - UsbBufPtr = srcBufPtr; - - /* Copy the buffer */ - zfwMemoryCopy(BufPtr, &(UsbBufPtr[chkIdx+ZM_USB_STREAM_MODE_TAG_LEN]), halPriv->usbRxTransferLen); - - /* Record the buffer pointer */ - halPriv->remainBuf = newBuf; - } - } - else - { - u8_t* BufPtr; - u8_t* UsbBufPtr; - - /* Allocate a skb buffer */ - newBuf = zfwBufAllocate(dev, ZM_WLAN_MAX_RX_SIZE); - if ( newBuf != NULL ) - { - BufPtr = zmw_buf_get_buffer(dev, newBuf); - UsbBufPtr = srcBufPtr; - - /* Copy the buffer */ - zfwMemoryCopy(BufPtr, &(UsbBufPtr[chkIdx+ZM_USB_STREAM_MODE_TAG_LEN]), pktLen); - - zfwBufSetSize(dev, newBuf, pktLen); - rxBufPool[rxBufPoolIndex++] = newBuf; - } - } - } - else - { - u16_t i; - - DbgPrint("Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n", - pktLen, pktTag); - - #if 0 - for(i = 0; i < 32; i++) - { - DbgPrint("%02x ", buf->data[index-16+i]); - - if ((i & 0xf) == 0xf) - DbgPrint("\n"); - } - #endif - - break; - } - } - - /* Free buffer */ - //zfwBufFree(adapter, pUsbRxTransfer->buf, 0); - zfwBufFree(dev, buf, 0); - - for(ii = 0; ii < rxBufPoolIndex; ii++) - { - zfiUsbRecvPerPkt(dev, rxBufPool[ii]); - } -} -#endif - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfUsbInit */ -/* Initialize USB resource. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.12 */ -/* */ -/************************************************************************/ -void zfUsbInit(zdev_t* dev) -{ - /* Initialize Rx & INT endpoint for receiving data & interrupt */ - zfwUsbEnableRxEpt(dev, USB_ENDPOINT_RX_INDEX); - zfwUsbEnableIntEpt(dev, USB_ENDPOINT_INT_INDEX); - - return; -} - - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfUsbFree */ -/* Free PCI resource. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen Chen ZyDAS Technology Corporation 2005.12 */ -/* */ -/************************************************************************/ -void zfUsbFree(zdev_t* dev) -{ - struct zsHpPriv *halPriv; - - zmw_get_wlan_dev(dev); - - halPriv = (struct zsHpPriv*)wd->hpPrivate; - -#ifdef ZM_OTUS_RX_STREAM_MODE - if ( halPriv->remainBuf != NULL ) - { - zfwBufFree(dev, halPriv->remainBuf, 0); - } -#endif - - return; -} - -void zfHpSendBeacon(zdev_t* dev, zbuf_t* buf, u16_t len) -{ - u32_t hw, lw; - u16_t i; - zmw_get_wlan_dev(dev); - - /* Write to beacon buffer (ZM_BEACON_BUFFER_ADDRESS) */ - for (i = 0; ihpPrivate)->hwFrequency < 3000) - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PLCP, ((len+4)<<(3+16))+0x0400); - } - else - { - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PLCP, ((len+4)<<(16))+0x001b); - } - - /* Beacon length (include CRC32) */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_LENGTH, len+4); - - /* Beacon Ready */ - zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_CTRL, 1); - zfFlushDelayWrite(dev); - - /* Free beacon buf */ - zfwBufFree(dev, buf, 0); - - return; -} - - -#define ZM_STATUS_TX_COMP 0x00 -#define ZM_STATUS_RETRY_COMP 0x01 -#define ZM_STATUS_TX_FAILED 0x02 -void zfiUsbRegIn(zdev_t* dev, u32_t* rsp, u16_t rspLen) -{ - //u8_t len, type, i; - u8_t type; - u8_t *u8rsp; - u16_t status; - u32_t bitmap; - zmw_get_wlan_dev(dev); - - zm_msg0_mm(ZM_LV_3, "zfiUsbRegIn()"); - - u8rsp = (u8_t *)rsp; - - //len = *u8rsp; - type = *(u8rsp+1); - u8rsp = u8rsp+4; - - - /* Interrupt event */ - if ((type & 0xC0) == 0xC0) - { - if (type == 0xC0) - { - zfCoreEvent(dev, 0, u8rsp); - - } - else if (type == 0xC1) - { -#if 0 - { - u16_t i; - DbgPrint("rspLen=%d\n", rspLen); - for (i=0; i<(rspLen/4); i++) - { - DbgPrint("rsp[%d]=0x%lx\n", i, rsp[i]); - } - } -#endif - status = (u16_t)(rsp[3] >> 16); - - ////6789 - rsp[8] = rsp[8] >> 2 | (rsp[9] & 0x1) << 6; - switch (status) - { - case ZM_STATUS_RETRY_COMP : - zfCoreEvent(dev, 1, u8rsp); - break; - case ZM_STATUS_TX_FAILED : - zfCoreEvent(dev, 2, u8rsp); - break; - case ZM_STATUS_TX_COMP : - zfCoreEvent(dev, 3, u8rsp); - break; - } - } - else if (type == 0xC2) - { - zfBeaconCfgInterrupt(dev, u8rsp); - } - else if (type == 0xC3) - { - zfEndOfAtimWindowInterrupt(dev); - } - else if (type == 0xC4) - { -#if 0 - { - u16_t i; - DbgPrint("0xC2:rspLen=%d\n", rspLen); - for (i=0; i<(rspLen/4); i++) - { - DbgPrint("0xC2:rsp[%d]=0x%lx\n", i, rsp[i]); - } - } -#endif - bitmap = (rsp[1] >> 16) + ((rsp[2] & 0xFFFF) << 16 ); - //zfBawCore(dev, (u16_t)rsp[1] & 0xFFFF, bitmap, (u16_t)(rsp[2] >> 16) & 0xFF); - } - else if (type == 0xC5) - { - u16_t i; -#if 0 - - for (i=0; i<(rspLen/4); i++) { - DbgPrint("0xC5:rsp[%d]=0x%lx\n", i, rsp[i]); - } -#endif - for (i=1; i<(rspLen/4); i++) { - u8rsp = (u8_t *)(rsp+i); - //DbgPrint("0xC5:rsp[%d]=0x%lx\n", i, ((u32_t*)u8rsp)[0]); - zfCoreEvent(dev, 4, u8rsp); - } - } - else if (type == 0xC6) - { - zm_debug_msg0("\n\n WatchDog interrupt!!! : 0xC6 \n\n"); - if (wd->zfcbHwWatchDogNotify != NULL) - { - wd->zfcbHwWatchDogNotify(dev); - } - } - else if (type == 0xC8) - { - //PZSW_ADAPTER adapter; - - // for SPI flash program chk Flag - zfwDbgProgrameFlashChkDone(dev); - } - else if (type == 0xC9) - { - struct zsHpPriv* hpPriv=wd->hpPrivate; - - zm_debug_msg0("##### Tx retransmission 5 times event #####"); - - /* correct tx retransmission issue */ - hpPriv->retransmissionEvent = 1; - } - } - else - { - zfIdlRsp(dev, rsp, rspLen); - } -} - - -#define ZM_PROGRAM_RAM_ADDR 0x200000 //0x1000 //0x700000 -#define FIRMWARE_DOWNLOAD 0x30 -#define FIRMWARE_DOWNLOAD_COMP 0x31 -#define FIRMWARE_CONFIRM 0x32 - -u16_t zfFirmwareDownload(zdev_t* dev, u32_t* fw, u32_t len, u32_t offset) -{ - u16_t ret = ZM_SUCCESS; - u32_t uCodeOfst = offset; - u8_t *image, *ptr; - u32_t result; - - image = (u8_t*) fw; - ptr = image; - - while (len > 0) - { - u32_t translen = (len > 4096) ? 4096 : len; - - result = zfwUsbSubmitControl(dev, FIRMWARE_DOWNLOAD, - (u16_t) (uCodeOfst >> 8), - 0, image, translen); - - if (result != ZM_SUCCESS) - { - zm_msg0_init(ZM_LV_0, "FIRMWARE_DOWNLOAD failed"); - ret = 1; - goto exit; - } - - len -= translen; - image += translen; - uCodeOfst += translen; // in Word (16 bit) - - result = 0; - } - - /* If download firmware success, issue a command to firmware */ - if (ret == 0) - { - result = zfwUsbSubmitControl(dev, FIRMWARE_DOWNLOAD_COMP, - 0, 0, NULL, 0); - - if (result != ZM_SUCCESS) - { - zm_msg0_init(ZM_LV_0, "FIRMWARE_DOWNLOAD_COMP failed"); - ret = 1; - goto exit; - } - } - -#if 0 - /* PCI code */ - /* Wait for firmware ready */ - result = zfwUsbSubmitControl(dev, FIRMWARE_CONFIRM, USB_DIR_IN | 0x40, - 0, 0, &ret_value, sizeof(ret_value), HZ); - - if (result != 0) - { - zm_msg0_init(ZM_LV_0, "Can't receive firmware ready: ", result); - ret = 1; - } -#endif - -exit: - - return ret; - -} - -u16_t zfFirmwareDownloadNotJump(zdev_t* dev, u32_t* fw, u32_t len, u32_t offset) -{ - u16_t ret = ZM_SUCCESS; - u32_t uCodeOfst = offset; - u8_t *image, *ptr; - u32_t result; - - image = (u8_t*) fw; - ptr = image; - - while (len > 0) - { - u32_t translen = (len > 4096) ? 4096 : len; - - result = zfwUsbSubmitControl(dev, FIRMWARE_DOWNLOAD, - (u16_t) (uCodeOfst >> 8), - 0, image, translen); - - if (result != ZM_SUCCESS) - { - zm_msg0_init(ZM_LV_0, "FIRMWARE_DOWNLOAD failed"); - ret = 1; - goto exit; - } - - len -= translen; - image += translen; - uCodeOfst += translen; // in Word (16 bit) - - result = 0; - } - -exit: - - return ret; - -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfIdlGetFreeTxdCount */ -/* Get free PCI PCI TxD count. */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* None */ -/* */ -/* AUTHOR */ -/* Stephen ZyDAS Technology Corporation 2006.6 */ -/* */ -/************************************************************************/ -u32_t zfHpGetFreeTxdCount(zdev_t* dev) -{ - return zfwUsbGetFreeTxQSize(dev); -} - -u32_t zfHpGetMaxTxdCount(zdev_t* dev) -{ - //return 8; - return zfwUsbGetMaxTxQSize(dev); -} - -void zfiUsbRegOutComplete(zdev_t* dev) -{ - return; -} - -extern void zfPushVtxq(zdev_t* dev); - -void zfiUsbOutComplete(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr) { -#ifndef ZM_ENABLE_AGGREGATION - if (buf) { - zfwBufFree(dev, buf, 0); - } -#else - #ifdef ZM_BYPASS_AGGR_SCHEDULING - //Simply free the buf since BA retransmission is done in the firmware - if (buf) - { - zfwBufFree(dev, buf, 0); - } - zfPushVtxq(dev); - #else - zmw_get_wlan_dev(dev); - - #ifdef ZM_ENABLE_FW_BA_RETRANSMISSION - //Simply free the buf since BA retransmission is done in the firmware - if (buf) - { - zfwBufFree(dev, buf, 0); - } - #else - u8_t agg; - u16_t frameType; - - if(!hdr && buf) { - zfwBufFree(dev, buf, 0); - //zm_debug_msg0("buf Free due to hdr == NULL"); - return; - } - - if(hdr && buf) { - frameType = hdr[8] & 0xf; - agg = (u8_t)(hdr[2] >> 5 ) & 0x1; - //zm_debug_msg1("AGG=", agg); - - if (!status) { - if (agg) { - //delete buf in ba fail queue?? - //not ganna happen? - } - else { - zfwBufFree(dev, buf, 0); - } - } - else { - if (agg) { - //don't do anything - //zfwBufFree(dev, buf, 0); - } - else { - zfwBufFree(dev, buf, 0); - } - } - } - #endif - - if (wd->state != ZM_WLAN_STATE_ENABLED) { - return; - } - - if( (wd->wlanMode == ZM_MODE_AP) || - (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) || - (wd->wlanMode == ZM_MODE_PSEUDO) ) { - zfAggTxScheduler(dev, 0); - } - #endif -#endif - - return; - -} - diff --git a/drivers/staging/otus/hal/hpusb.h b/drivers/staging/otus/hal/hpusb.h deleted file mode 100644 index 35a0c5668cea..000000000000 --- a/drivers/staging/otus/hal/hpusb.h +++ /dev/null @@ -1,437 +0,0 @@ -/* - * 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 */ diff --git a/drivers/staging/otus/hal/otus.ini b/drivers/staging/otus/hal/otus.ini deleted file mode 100644 index 34efeb6c285b..000000000000 --- a/drivers/staging/otus/hal/otus.ini +++ /dev/null @@ -1,414 +0,0 @@ -/* 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} -}; diff --git a/drivers/staging/otus/ioctl.c b/drivers/staging/otus/ioctl.c deleted file mode 100644 index a403d9ccd5e8..000000000000 --- a/drivers/staging/otus/ioctl.c +++ /dev/null @@ -1,2753 +0,0 @@ -/* - * 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 : ioctl.c */ -/* */ -/* Abstract */ -/* This module contains Linux wireless extension related functons. */ -/* */ -/* NOTES */ -/* Platform dependent. */ -/* */ -/************************************************************************/ -#include -#include -#include -#include - -#include "usbdrv.h" - -#define ZD_IOCTL_WPA (SIOCDEVPRIVATE + 1) -#define ZD_IOCTL_PARAM (SIOCDEVPRIVATE + 2) -#define ZD_IOCTL_GETWPAIE (SIOCDEVPRIVATE + 3) -#ifdef ZM_ENABLE_CENC -#define ZM_IOCTL_CENC (SIOCDEVPRIVATE + 4) -#endif /* ZM_ENABLE_CENC */ -#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_PARAM_WPS_FILTER 0x0007 - -#ifdef ZM_ENABLE_CENC -#define P80211_PACKET_CENCFLAG 0x0001 -#endif /* ZM_ENABLE_CENC */ -#define P80211_PACKET_SETKEY 0x0003 - -#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_CRYPT_ALG_NAME_LEN 16 -#define ZD_MAX_KEY_SIZE 32 -#define ZD_MAX_GENERIC_SIZE 64 - -#include - -extern u16_t zfLnxGetVapId(zdev_t *dev); - -static const u32_t channel_frequency_11A[] = { - /* Even element for Channel Number, Odd for Frequency */ - 36, 5180, - 40, 5200, - 44, 5220, - 48, 5240, - 52, 5260, - 56, 5280, - 60, 5300, - 64, 5320, - 100, 5500, - 104, 5520, - 108, 5540, - 112, 5560, - 116, 5580, - 120, 5600, - 124, 5620, - 128, 5640, - 132, 5660, - 136, 5680, - 140, 5700, - /**/ - 184, 4920, - 188, 4940, - 192, 4960, - 196, 4980, - 8, 5040, - 12, 5060, - 16, 5080, - 34, 5170, - 38, 5190, - 42, 5210, - 46, 5230, - /**/ - 149, 5745, - 153, 5765, - 157, 5785, - 161, 5805, - 165, 5825 - /**/ -}; - -int usbdrv_freq2chan(u32_t freq) -{ - /* 2.4G Hz */ - if (freq > 2400 && freq < 3000) { - return ((freq-2412)/5) + 1; - } else { - u16_t ii; - u16_t num_chan = sizeof(channel_frequency_11A)/sizeof(u32_t); - - for (ii = 1; ii < num_chan; ii += 2) { - if (channel_frequency_11A[ii] == freq) - return channel_frequency_11A[ii-1]; - } - } - - return 0; -} - -int usbdrv_chan2freq(int chan) -{ - int freq; - - /* If channel number is out of range */ - if (chan > 165 || chan <= 0) - return -1; - - /* 2.4G band */ - if (chan >= 1 && chan <= 13) { - freq = (2412 + (chan - 1) * 5); - return freq; - } else if (chan >= 36 && chan <= 165) { - u16_t ii; - u16_t num_chan = sizeof(channel_frequency_11A)/sizeof(u32_t); - - for (ii = 0; ii < num_chan; ii += 2) { - if (channel_frequency_11A[ii] == chan) - return channel_frequency_11A[ii+1]; - } - - /* Can't find desired frequency */ - if (ii == num_chan) - return -1; - } - - /* Can't find deisred frequency */ - return -1; -} - -int usbdrv_ioctl_setessid(struct net_device *dev, struct iw_point *erq) -{ - #ifdef ZM_HOSTAPD_SUPPORT - /* struct usbdrv_private *macp = dev->ml_priv; */ - char essidbuf[IW_ESSID_MAX_SIZE+1]; - int i; - - if (!netif_running(dev)) - return -EINVAL; - - memset(essidbuf, 0, sizeof(essidbuf)); - - printk(KERN_ERR "usbdrv_ioctl_setessid\n"); - - /* printk("ssidlen=%d\n", erq->length); //for any, it is 1. */ - if (erq->flags) { - if (erq->length > (IW_ESSID_MAX_SIZE+1)) - return -E2BIG; - - if (copy_from_user(essidbuf, erq->pointer, erq->length)) - return -EFAULT; - } - - /* zd_DisasocAll(2); */ - /* wait_ms(100); */ - - printk(KERN_ERR "essidbuf: "); - - for (i = 0; i < erq->length; i++) - printk(KERN_ERR "%02x ", essidbuf[i]); - - printk(KERN_ERR "\n"); - - essidbuf[erq->length] = '\0'; - /* memcpy(macp->wd.ws.ssid, essidbuf, erq->length); */ - /* macp->wd.ws.ssidLen = strlen(essidbuf)+2; */ - /* macp->wd.ws.ssid[1] = strlen(essidbuf); Update ssid length */ - - zfiWlanSetSSID(dev, essidbuf, erq->length); - #if 0 - printk(KERN_ERR "macp->wd.ws.ssid: "); - - for (i = 0; i < macp->wd.ws.ssidLen; i++) - printk(KERN_ERR "%02x ", macp->wd.ws.ssid[i]); - - printk(KERN_ERR "\n"); - #endif - - zfiWlanDisable(dev, 0); - zfiWlanEnable(dev); - - #endif - - return 0; -} - -int usbdrv_ioctl_getessid(struct net_device *dev, struct iw_point *erq) -{ - /* struct usbdrv_private *macp = dev->ml_priv; */ - u8_t essidbuf[IW_ESSID_MAX_SIZE+1]; - u8_t len; - u8_t i; - - - /* len = macp->wd.ws.ssidLen; */ - /* memcpy(essidbuf, macp->wd.ws.ssid, macp->wd.ws.ssidLen); */ - zfiWlanQuerySSID(dev, essidbuf, &len); - - essidbuf[len] = 0; - - printk(KERN_ERR "ESSID: "); - - for (i = 0; i < len; i++) - printk(KERN_ERR "%c", essidbuf[i]); - - printk(KERN_ERR "\n"); - - erq->flags = 1; - erq->length = strlen(essidbuf) + 1; - - if (erq->pointer) { - if (copy_to_user(erq->pointer, essidbuf, erq->length)) - return -EFAULT; - } - - return 0; -} - -int usbdrv_ioctl_setrts(struct net_device *dev, struct iw_param *rrq) -{ - return 0; -} - -/* - * Encode a WPA or RSN information element as a custom - * element using the hostap format. - */ -u32 encode_ie(void *buf, u32 bufsize, const u8 *ie, u32 ielen, - const u8 *leader, u32 leader_len) -{ - u8 *p; - u32 i; - - if (bufsize < leader_len) - return 0; - p = buf; - memcpy(p, leader, leader_len); - bufsize -= leader_len; - p += leader_len; - for (i = 0; i < ielen && bufsize > 2; i++) - p += sprintf(p, "%02x", ie[i]); - return (i == ielen ? p - (u8 *)buf:0); -} - -/* - * Translate scan data returned from the card to a card independent - * format that the Wireless Tools will understand - */ -char *usbdrv_translate_scan(struct net_device *dev, - struct iw_request_info *info, char *current_ev, - char *end_buf, struct zsBssInfo *list) -{ - struct iw_event iwe; /* Temporary buffer */ - u16_t capabilities; - char *current_val; /* For rates */ - char *last_ev; - int i; - char buf[64*2 + 30]; - - last_ev = current_ev; - - /* First entry *MUST* be the AP MAC address */ - iwe.cmd = SIOCGIWAP; - iwe.u.ap_addr.sa_family = ARPHRD_ETHER; - memcpy(iwe.u.ap_addr.sa_data, list->bssid, ETH_ALEN); - current_ev = iwe_stream_add_event(info, current_ev, - end_buf, &iwe, IW_EV_ADDR_LEN); - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - - /* Other entries will be displayed in the order we give them */ - - /* Add the ESSID */ - iwe.u.data.length = list->ssid[1]; - if (iwe.u.data.length > 32) - iwe.u.data.length = 32; - iwe.cmd = SIOCGIWESSID; - iwe.u.data.flags = 1; - current_ev = iwe_stream_add_point(info, current_ev, - end_buf, &iwe, &list->ssid[2]); - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - - /* Add mode */ - iwe.cmd = SIOCGIWMODE; - capabilities = (list->capability[1] << 8) + list->capability[0]; - if (capabilities & (0x01 | 0x02)) { - if (capabilities & 0x01) - iwe.u.mode = IW_MODE_MASTER; - else - iwe.u.mode = IW_MODE_ADHOC; - current_ev = iwe_stream_add_event(info, current_ev, - end_buf, &iwe, IW_EV_UINT_LEN); - } - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - - /* Add frequency */ - iwe.cmd = SIOCGIWFREQ; - iwe.u.freq.m = list->channel; - /* Channel frequency in KHz */ - if (iwe.u.freq.m > 14) { - if ((184 <= iwe.u.freq.m) && (iwe.u.freq.m <= 196)) - iwe.u.freq.m = 4000 + iwe.u.freq.m * 5; - else - iwe.u.freq.m = 5000 + iwe.u.freq.m * 5; - } else { - if (iwe.u.freq.m == 14) - iwe.u.freq.m = 2484; - else - iwe.u.freq.m = 2412 + (iwe.u.freq.m - 1) * 5; - } - iwe.u.freq.e = 6; - current_ev = iwe_stream_add_event(info, current_ev, - end_buf, &iwe, IW_EV_FREQ_LEN); - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - - /* Add quality statistics */ - iwe.cmd = IWEVQUAL; - iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED - | IW_QUAL_NOISE_UPDATED; - iwe.u.qual.level = list->signalStrength; - iwe.u.qual.noise = 0; - iwe.u.qual.qual = list->signalQuality; - current_ev = iwe_stream_add_event(info, current_ev, - end_buf, &iwe, IW_EV_QUAL_LEN); - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - - /* Add encryption capability */ - - iwe.cmd = SIOCGIWENCODE; - if (capabilities & 0x10) - iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; - else - iwe.u.data.flags = IW_ENCODE_DISABLED; - - iwe.u.data.length = 0; - current_ev = iwe_stream_add_point(info, current_ev, - end_buf, &iwe, list->ssid); - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - - /* Rate : stuffing multiple values in a single event require a bit - * more of magic - */ - current_val = current_ev + IW_EV_LCP_LEN; - - iwe.cmd = SIOCGIWRATE; - /* Those two flags are ignored... */ - iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; - - for (i = 0 ; i < list->supportedRates[1] ; i++) { - /* Bit rate given in 500 kb/s units (+ 0x80) */ - iwe.u.bitrate.value = ((list->supportedRates[i+2] & 0x7f) - * 500000); - /* Add new value to event */ - current_val = iwe_stream_add_value(info, current_ev, - current_val, end_buf, &iwe, IW_EV_PARAM_LEN); - - /* Ran out of buffer */ - if (last_ev == current_val) - return end_buf; - - last_ev = current_val; - } - - for (i = 0 ; i < list->extSupportedRates[1] ; i++) { - /* Bit rate given in 500 kb/s units (+ 0x80) */ - iwe.u.bitrate.value = ((list->extSupportedRates[i+2] & 0x7f) - * 500000); - /* Add new value to event */ - current_val = iwe_stream_add_value(info, current_ev, - current_val, end_buf, &iwe, IW_EV_PARAM_LEN); - - /* Ran out of buffer */ - if (last_ev == current_val) - return end_buf; - - last_ev = current_ev; - } - - /* Check if we added any event */ - if ((current_val - current_ev) > IW_EV_LCP_LEN) - current_ev = current_val; - #define IEEE80211_ELEMID_RSN 0x30 - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = IWEVCUSTOM; - snprintf(buf, sizeof(buf), "bcn_int=%d", (list->beaconInterval[1] << 8) - + list->beaconInterval[0]); - iwe.u.data.length = strlen(buf); - current_ev = iwe_stream_add_point(info, current_ev, - end_buf, &iwe, buf); - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - - if (list->wpaIe[1] != 0) { - static const char rsn_leader[] = "rsn_ie="; - static const char wpa_leader[] = "wpa_ie="; - - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = IWEVCUSTOM; - if (list->wpaIe[0] == IEEE80211_ELEMID_RSN) - iwe.u.data.length = encode_ie(buf, sizeof(buf), - list->wpaIe, list->wpaIe[1]+2, - rsn_leader, sizeof(rsn_leader)-1); - else - iwe.u.data.length = encode_ie(buf, sizeof(buf), - list->wpaIe, list->wpaIe[1]+2, - wpa_leader, sizeof(wpa_leader)-1); - - if (iwe.u.data.length != 0) - current_ev = iwe_stream_add_point(info, current_ev, - end_buf, &iwe, buf); - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - } - - if (list->rsnIe[1] != 0) { - static const char rsn_leader[] = "rsn_ie="; - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = IWEVCUSTOM; - - if (list->rsnIe[0] == IEEE80211_ELEMID_RSN) { - iwe.u.data.length = encode_ie(buf, sizeof(buf), - list->rsnIe, list->rsnIe[1]+2, - rsn_leader, sizeof(rsn_leader)-1); - if (iwe.u.data.length != 0) - current_ev = iwe_stream_add_point(info, - current_ev, end_buf, &iwe, buf); - - /* Ran out of buffer */ - if (last_ev == current_ev) - return end_buf; - - last_ev = current_ev; - } - } - /* The other data in the scan result are not really - * interesting, so for now drop it - */ - return current_ev; -} - -int usbdrvwext_giwname(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrq, char *extra) -{ - /* struct usbdrv_private *macp = dev->ml_priv; */ - - strcpy(wrq->name, "IEEE 802.11abgn"); - - return 0; -} - -int usbdrvwext_siwfreq(struct net_device *dev, - struct iw_request_info *info, - struct iw_freq *freq, char *extra) -{ - u32_t FreqKHz; - struct usbdrv_private *macp = dev->ml_priv; - - if (!netif_running(dev)) - return -EINVAL; - - if (freq->e > 1) - return -EINVAL; - - if (freq->e == 1) { - FreqKHz = (freq->m / 100000); - - if (FreqKHz > 4000000) { - if (FreqKHz > 5825000) - FreqKHz = 5825000; - else if (FreqKHz < 4920000) - FreqKHz = 4920000; - else if (FreqKHz < 5000000) - FreqKHz = (((FreqKHz - 4000000) / 5000) * 5000) - + 4000000; - else - FreqKHz = (((FreqKHz - 5000000) / 5000) * 5000) - + 5000000; - } else { - if (FreqKHz > 2484000) - FreqKHz = 2484000; - else if (FreqKHz < 2412000) - FreqKHz = 2412000; - else - FreqKHz = (((FreqKHz - 2412000) / 5000) * 5000) - + 2412000; - } - } else { - FreqKHz = usbdrv_chan2freq(freq->m); - - if (FreqKHz != -1) - FreqKHz *= 1000; - else - FreqKHz = 2412000; - } - - /* printk("freq->m: %d, freq->e: %d\n", freq->m, freq->e); */ - /* printk("FreqKHz: %d\n", FreqKHz); */ - - if (macp->DeviceOpened == 1) { - zfiWlanSetFrequency(dev, FreqKHz, 0); /* Immediate */ - /* u8_t wpaieLen,wpaie[50]; */ - /* zfiWlanQueryWpaIe(dev, wpaie, &wpaieLen); */ - zfiWlanDisable(dev, 0); - zfiWlanEnable(dev); - /* if (wpaieLen > 2) */ - /* zfiWlanSetWpaIe(dev, wpaie, wpaieLen); */ - } - - return 0; -} - -int usbdrvwext_giwfreq(struct net_device *dev, - struct iw_request_info *info, - struct iw_freq *freq, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - - if (macp->DeviceOpened != 1) - return 0; - - freq->m = zfiWlanQueryFrequency(dev); - freq->e = 3; - - return 0; -} - -int usbdrvwext_siwmode(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrq, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - u8_t WlanMode; - - if (!netif_running(dev)) - return -EINVAL; - - if (macp->DeviceOpened != 1) - return 0; - - switch (wrq->mode) { - case IW_MODE_MASTER: - WlanMode = ZM_MODE_AP; - break; - case IW_MODE_INFRA: - WlanMode = ZM_MODE_INFRASTRUCTURE; - break; - case IW_MODE_ADHOC: - WlanMode = ZM_MODE_IBSS; - break; - default: - WlanMode = ZM_MODE_IBSS; - break; - } - - zfiWlanSetWlanMode(dev, WlanMode); - zfiWlanDisable(dev, 1); - zfiWlanEnable(dev); - - return 0; -} - -int usbdrvwext_giwmode(struct net_device *dev, - struct iw_request_info *info, - __u32 *mode, char *extra) -{ - unsigned long irqFlag; - struct usbdrv_private *macp = dev->ml_priv; - - if (!netif_running(dev)) - return -EINVAL; - - if (macp->DeviceOpened != 1) - return 0; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - switch (zfiWlanQueryWlanMode(dev)) { - case ZM_MODE_AP: - *mode = IW_MODE_MASTER; - break; - case ZM_MODE_INFRASTRUCTURE: - *mode = IW_MODE_INFRA; - break; - case ZM_MODE_IBSS: - *mode = IW_MODE_ADHOC; - break; - default: - *mode = IW_MODE_ADHOC; - break; - } - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - - return 0; -} - -int usbdrvwext_siwsens(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *sens, char *extra) -{ - return 0; -} - -int usbdrvwext_giwsens(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *sens, char *extra) -{ - sens->value = 0; - sens->fixed = 1; - - return 0; -} - -int usbdrvwext_giwrange(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *data, char *extra) -{ - struct iw_range *range = (struct iw_range *) extra; - int i, val; - /* int num_band_a; */ - u16_t channels[60]; - u16_t channel_num; - - if (!netif_running(dev)) - return -EINVAL; - - range->txpower_capa = IW_TXPOW_DBM; - /* XXX what about min/max_pmp, min/max_pmt, etc. */ - - range->we_version_compiled = WIRELESS_EXT; - range->we_version_source = 13; - - range->retry_capa = IW_RETRY_LIMIT; - range->retry_flags = IW_RETRY_LIMIT; - range->min_retry = 0; - range->max_retry = 255; - - channel_num = zfiWlanQueryAllowChannels(dev, channels); - - /* Gurantee reported channel numbers is less - * or equal to IW_MAX_FREQUENCIES - */ - if (channel_num > IW_MAX_FREQUENCIES) - channel_num = IW_MAX_FREQUENCIES; - - val = 0; - - for (i = 0; i < channel_num; i++) { - range->freq[val].i = usbdrv_freq2chan(channels[i]); - range->freq[val].m = channels[i]; - range->freq[val].e = 6; - val++; - } - - range->num_channels = channel_num; - range->num_frequency = channel_num; - - #if 0 - range->num_channels = 14; /* Only 2.4G */ - - /* XXX need to filter against the regulatory domain &| active set */ - val = 0; - /* B,G Bands */ - for (i = 1; i <= 14; i++) { - range->freq[val].i = i; - if (i == 14) - range->freq[val].m = 2484000; - else - range->freq[val].m = (2412+(i-1)*5)*1000; - range->freq[val].e = 3; - val++; - } - - num_band_a = (IW_MAX_FREQUENCIES - val); - /* A Bands */ - for (i = 0; i < num_band_a; i++) { - range->freq[val].i = channel_frequency_11A[2 * i]; - range->freq[val].m = channel_frequency_11A[2 * i + 1] * 1000; - range->freq[val].e = 3; - val++; - } - /* MIMO Rate Not Defined Now - * For 802.11a, there are too more frequency. - * We can't return them all. - */ - range->num_frequency = val; - #endif - - /* Max of /proc/net/wireless */ - range->max_qual.qual = 100; /* ?? 92; */ - range->max_qual.level = 154; /* ?? */ - range->max_qual.noise = 154; /* ?? */ - range->sensitivity = 3; /* ?? */ - - /* XXX these need to be nsd-specific! */ - range->min_rts = 0; - range->max_rts = 2347; - range->min_frag = 256; - range->max_frag = 2346; - range->max_encoding_tokens = 4 /* NUM_WEPKEYS ?? */; - range->num_encoding_sizes = 2; /* ?? */ - - range->encoding_size[0] = 5; /* ?? WEP Key Encoding Size */ - range->encoding_size[1] = 13; /* ?? */ - - /* XXX what about num_bitrates/throughput? */ - range->num_bitrates = 0; /* ?? */ - - /* estimated max throughput - * XXX need to cap it if we're running at ~2Mbps.. - */ - - range->throughput = 300000000; - - return 0; -} - -int usbdrvwext_siwap(struct net_device *dev, struct iw_request_info *info, - struct sockaddr *MacAddr, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - - if (!netif_running(dev)) - return -EINVAL; - - if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) { - /* AP Mode */ - zfiWlanSetMacAddress(dev, (u16_t *)&MacAddr->sa_data[0]); - } else { - /* STA Mode */ - zfiWlanSetBssid(dev, &MacAddr->sa_data[0]); - } - - if (macp->DeviceOpened == 1) { - /* u8_t wpaieLen,wpaie[80]; */ - /* zfiWlanQueryWpaIe(dev, wpaie, &wpaieLen); */ - zfiWlanDisable(dev, 0); - zfiWlanEnable(dev); - /* if (wpaieLen > 2) */ - /* zfiWlanSetWpaIe(dev, wpaie, wpaieLen); */ - } - - return 0; -} - -int usbdrvwext_giwap(struct net_device *dev, - struct iw_request_info *info, - struct sockaddr *MacAddr, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - - if (macp->DeviceOpened != 1) - return 0; - - if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) { - /* AP Mode */ - zfiWlanQueryMacAddress(dev, &MacAddr->sa_data[0]); - } else { - /* STA Mode */ - if (macp->adapterState == ZM_STATUS_MEDIA_CONNECT) { - zfiWlanQueryBssid(dev, &MacAddr->sa_data[0]); - } else { - u8_t zero_addr[6] = { 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 }; - memcpy(&MacAddr->sa_data[0], zero_addr, - sizeof(zero_addr)); - } - } - - return 0; -} - -int usbdrvwext_iwaplist(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *data, char *extra) -{ - /* Don't know how to do yet--CWYang(+) */ - return 0; - -} - -int usbdrvwext_siwscan(struct net_device *dev, struct iw_request_info *info, - struct iw_point *data, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - - if (macp->DeviceOpened != 1) - return 0; - - printk(KERN_WARNING "CWY - usbdrvwext_siwscan\n"); - - zfiWlanScan(dev); - - return 0; -} - -int usbdrvwext_giwscan(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *data, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - /* struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev); */ - char *current_ev = extra; - char *end_buf; - int i; - struct zsBssListV1 *pBssList; - /* BssList = wd->sta.pBssList; */ - /* zmw_get_wlan_dev(dev); */ - - if (macp->DeviceOpened != 1) - return 0; - - /* struct zsBssList BssList; */ - pBssList = kmalloc(sizeof(struct zsBssListV1), GFP_KERNEL); - if (pBssList == NULL) - return -ENOMEM; - - if (data->length == 0) - end_buf = extra + IW_SCAN_MAX_DATA; - else - end_buf = extra + data->length; - - printk(KERN_WARNING "giwscan - Report Scan Results\n"); - /* printk("giwscan - BssList Sreucture Len : %d\n", sizeof(BssList)); - * printk("giwscan - BssList Count : %d\n", - * wd->sta.pBssList->bssCount); - * printk("giwscan - UpdateBssList Count : %d\n", - * wd->sta.pUpdateBssList->bssCount); - */ - zfiWlanQueryBssListV1(dev, pBssList); - /* zfiWlanQueryBssList(dev, &BssList); */ - - /* Read and parse all entries */ - printk(KERN_WARNING "giwscan - pBssList->bssCount : %d\n", - pBssList->bssCount); - /* printk("giwscan - BssList.bssCount : %d\n", BssList.bssCount); */ - - for (i = 0; i < pBssList->bssCount; i++) { - /* Translate to WE format this entry - * current_ev = usbdrv_translate_scan(dev, info, current_ev, - * extra + IW_SCAN_MAX_DATA, &pBssList->bssInfo[i]); - */ - current_ev = usbdrv_translate_scan(dev, info, current_ev, - end_buf, &pBssList->bssInfo[i]); - - if (current_ev == end_buf) { - kfree(pBssList); - data->length = current_ev - extra; - return -E2BIG; - } - } - - /* Length of data */ - data->length = (current_ev - extra); - data->flags = 0; /* todo */ - - kfree(pBssList); - - return 0; -} - -int usbdrvwext_siwessid(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *essid, char *extra) -{ - char EssidBuf[IW_ESSID_MAX_SIZE + 1]; - struct usbdrv_private *macp = dev->ml_priv; - - if (!netif_running(dev)) - return -EINVAL; - - if (essid->flags == 1) { - if (essid->length > IW_ESSID_MAX_SIZE) - return -E2BIG; - - if (copy_from_user(&EssidBuf, essid->pointer, essid->length)) - return -EFAULT; - - EssidBuf[essid->length] = '\0'; - /* printk("siwessid - Set Essid : %s\n",EssidBuf); */ - /* printk("siwessid - Essid Len : %d\n",essid->length); */ - /* printk("siwessid - Essid Flag : %x\n",essid->flags); */ - if (macp->DeviceOpened == 1) { - zfiWlanSetSSID(dev, EssidBuf, strlen(EssidBuf)); - zfiWlanSetFrequency(dev, zfiWlanQueryFrequency(dev), - FALSE); - zfiWlanSetEncryMode(dev, zfiWlanQueryEncryMode(dev)); - /* u8_t wpaieLen,wpaie[50]; */ - /* zfiWlanQueryWpaIe(dev, wpaie, &wpaieLen); */ - zfiWlanDisable(dev, 0); - zfiWlanEnable(dev); - /* if (wpaieLen > 2) */ - /* zfiWlanSetWpaIe(dev, wpaie, wpaieLen); */ - } - } - - return 0; -} - -int usbdrvwext_giwessid(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *essid, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - u8_t EssidLen; - char EssidBuf[IW_ESSID_MAX_SIZE + 1]; - int ssid_len; - - if (!netif_running(dev)) - return -EINVAL; - - if (macp->DeviceOpened != 1) - return 0; - - zfiWlanQuerySSID(dev, &EssidBuf[0], &EssidLen); - - /* Convert type from unsigned char to char */ - ssid_len = (int)EssidLen; - - /* Make sure the essid length is not greater than IW_ESSID_MAX_SIZE */ - if (ssid_len > IW_ESSID_MAX_SIZE) - ssid_len = IW_ESSID_MAX_SIZE; - - EssidBuf[ssid_len] = '\0'; - - essid->flags = 1; - essid->length = strlen(EssidBuf); - - memcpy(extra, EssidBuf, essid->length); - /* wireless.c in Kernel would handle copy_to_user -- line 679 */ - /* if (essid->pointer) { - * if (copy_to_user(essid->pointer, EssidBuf, essid->length)) { - * printk("giwessid - copy_to_user Fail\n"); - * return -EFAULT; - * } - * } - */ - - return 0; -} - -int usbdrvwext_siwnickn(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *data, char *nickname) -{ - /* Exist but junk--CWYang(+) */ - return 0; -} - -int usbdrvwext_giwnickn(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *data, char *nickname) -{ - struct usbdrv_private *macp = dev->ml_priv; - u8_t EssidLen; - char EssidBuf[IW_ESSID_MAX_SIZE + 1]; - - if (macp->DeviceOpened != 1) - return 0; - - zfiWlanQuerySSID(dev, &EssidBuf[0], &EssidLen); - EssidBuf[EssidLen] = 0; - - data->flags = 1; - data->length = strlen(EssidBuf); - - memcpy(nickname, EssidBuf, data->length); - - return 0; -} - -int usbdrvwext_siwrate(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *frq, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - /* Array to Define Rate Number that Send to Driver */ - u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, - 48000, 24000, 12000, 6000, 54000, 36000, 18000, 9000}; - u16_t zcRateToMCS[] = {0xff, 0, 1, 2, 3, 0xb, 0xf, 0xa, 0xe, 0x9, 0xd, - 0x8, 0xc}; - u8_t i, RateIndex = 4; - u16_t RateKbps; - - /* printk("frq->disabled : 0x%x\n",frq->disabled); */ - /* printk("frq->value : 0x%x\n",frq->value); */ - - RateKbps = frq->value / 1000; - /* printk("RateKbps : %d\n", RateKbps); */ - for (i = 0; i < 16; i++) { - if (RateKbps == zcIndextoRateBG[i]) - RateIndex = i; - } - - if (zcIndextoRateBG[RateIndex] == 0) - RateIndex = 0xff; - /* printk("RateIndex : %x\n", RateIndex); */ - for (i = 0; i < 13; i++) - if (RateIndex == zcRateToMCS[i]) - break; - /* printk("Index : %x\n", i); */ - if (RateKbps == 65000) { - RateIndex = 20; - printk(KERN_WARNING "RateIndex : %d\n", RateIndex); - } - - if (macp->DeviceOpened == 1) { - zfiWlanSetTxRate(dev, i); - /* zfiWlanDisable(dev); */ - /* zfiWlanEnable(dev); */ - } - - return 0; -} - -int usbdrvwext_giwrate(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *frq, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - - if (!netif_running(dev)) - return -EINVAL; - - if (macp->DeviceOpened != 1) - return 0; - - frq->fixed = 0; - frq->disabled = 0; - frq->value = zfiWlanQueryRxRate(dev) * 1000; - - return 0; -} - -int usbdrvwext_siwrts(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *rts, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - int val = rts->value; - - if (macp->DeviceOpened != 1) - return 0; - - if (rts->disabled) - val = 2347; - - if ((val < 0) || (val > 2347)) - return -EINVAL; - - zfiWlanSetRtsThreshold(dev, val); - - return 0; -} - -int usbdrvwext_giwrts(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *rts, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - - if (!netif_running(dev)) - return -EINVAL; - - if (macp->DeviceOpened != 1) - return 0; - - rts->value = zfiWlanQueryRtsThreshold(dev); - rts->disabled = (rts->value >= 2347); - rts->fixed = 1; - - return 0; -} - -int usbdrvwext_siwfrag(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *frag, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - u16_t fragThreshold; - - if (macp->DeviceOpened != 1) - return 0; - - if (frag->disabled) - fragThreshold = 0; - else - fragThreshold = frag->value; - - zfiWlanSetFragThreshold(dev, fragThreshold); - - return 0; -} - -int usbdrvwext_giwfrag(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *frag, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - u16 val; - unsigned long irqFlag; - - if (!netif_running(dev)) - return -EINVAL; - - if (macp->DeviceOpened != 1) - return 0; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - val = zfiWlanQueryFragThreshold(dev); - - frag->value = val; - - frag->disabled = (val >= 2346); - frag->fixed = 1; - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - - return 0; -} - -int usbdrvwext_siwtxpow(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *rrq, char *extra) -{ - /* Not support yet--CWYng(+) */ - return 0; -} - -int usbdrvwext_giwtxpow(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *rrq, char *extra) -{ - /* Not support yet--CWYng(+) */ - return 0; -} - -int usbdrvwext_siwretry(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *rrq, char *extra) -{ - /* Do nothing--CWYang(+) */ - return 0; -} - -int usbdrvwext_giwretry(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *rrq, char *extra) -{ - /* Do nothing--CWYang(+) */ - return 0; -} - -int usbdrvwext_siwencode(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *erq, char *key) -{ - struct zsKeyInfo keyInfo; - int i; - int WepState = ZM_ENCRYPTION_WEP_DISABLED; - struct usbdrv_private *macp = dev->ml_priv; - - if (!netif_running(dev)) - return -EINVAL; - - if ((erq->flags & IW_ENCODE_DISABLED) == 0) { - keyInfo.key = key; - keyInfo.keyLength = erq->length; - keyInfo.keyIndex = (erq->flags & IW_ENCODE_INDEX) - 1; - if (keyInfo.keyIndex >= 4) - keyInfo.keyIndex = 0; - keyInfo.flag = ZM_KEY_FLAG_DEFAULT_KEY; - - zfiWlanSetKey(dev, keyInfo); - WepState = ZM_ENCRYPTION_WEP_ENABLED; - } else { - for (i = 1; i < 4; i++) - zfiWlanRemoveKey(dev, 0, i); - WepState = ZM_ENCRYPTION_WEP_DISABLED; - /* zfiWlanSetEncryMode(dev, ZM_NO_WEP); */ - } - - if (macp->DeviceOpened == 1) { - zfiWlanSetWepStatus(dev, WepState); - zfiWlanSetFrequency(dev, zfiWlanQueryFrequency(dev), FALSE); - /* zfiWlanSetEncryMode(dev, zfiWlanQueryEncryMode(dev)); */ - /* u8_t wpaieLen,wpaie[50]; */ - /* zfiWlanQueryWpaIe(dev, wpaie, &wpaieLen); */ - zfiWlanDisable(dev, 0); - zfiWlanEnable(dev); - /* if (wpaieLen > 2) */ - /* zfiWlanSetWpaIe(dev, wpaie, wpaieLen); */ - } - - return 0; -} - -int usbdrvwext_giwencode(struct net_device *dev, - struct iw_request_info *info, - struct iw_point *erq, char *key) -{ - struct usbdrv_private *macp = dev->ml_priv; - u8_t EncryptionMode; - u8_t keyLen = 0; - - if (macp->DeviceOpened != 1) - return 0; - - EncryptionMode = zfiWlanQueryEncryMode(dev); - - if (EncryptionMode) - erq->flags = IW_ENCODE_ENABLED; - else - erq->flags = IW_ENCODE_DISABLED; - - /* We can't return the key, so set the proper flag and return zero */ - erq->flags |= IW_ENCODE_NOKEY; - memset(key, 0, 16); - - /* Copy the key to the user buffer */ - switch (EncryptionMode) { - case ZM_WEP64: - keyLen = 5; - break; - case ZM_WEP128: - keyLen = 13; - break; - case ZM_WEP256: - keyLen = 29; - break; - case ZM_AES: - keyLen = 16; - break; - case ZM_TKIP: - keyLen = 32; - break; - #ifdef ZM_ENABLE_CENC - case ZM_CENC: - /* ZM_ENABLE_CENC */ - keyLen = 32; - break; - #endif - case ZM_NO_WEP: - keyLen = 0; - break; - default: - keyLen = 0; - printk(KERN_ERR "Unknown EncryMode\n"); - break; - } - erq->length = keyLen; - - return 0; -} - -int usbdrvwext_siwpower(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *frq, char *extra) -{ - struct usbdrv_private *macp = dev->ml_priv; - u8_t PSMode; - - if (macp->DeviceOpened != 1) - return 0; - - if (frq->disabled) - PSMode = ZM_STA_PS_NONE; - else - PSMode = ZM_STA_PS_MAX; - - zfiWlanSetPowerSaveMode(dev, PSMode); - - return 0; -} - -int usbdrvwext_giwpower(struct net_device *dev, - struct iw_request_info *info, - struct iw_param *frq, char *extra) -{ - unsigned long irqFlag; - struct usbdrv_private *macp = dev->ml_priv; - - if (macp->DeviceOpened != 1) - return 0; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - if (zfiWlanQueryPowerSaveMode(dev) == ZM_STA_PS_NONE) - frq->disabled = 1; - else - frq->disabled = 0; - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - - return 0; -} - -/*int usbdrvwext_setparam(struct net_device *dev, struct iw_request_info *info, -* void *w, char *extra) -*{ -* struct ieee80211vap *vap = dev->ml_priv; -* struct ieee80211com *ic = vap->iv_ic; -* struct ieee80211_rsnparms *rsn = &vap->iv_bss->ni_rsn; -* int *i = (int *) extra; -* int param = i[0]; // parameter id is 1st -* int value = i[1]; // NB: most values are TYPE_INT -* int retv = 0; -* int j, caps; -* const struct ieee80211_authenticator *auth; -* const struct ieee80211_aclator *acl; -* -* switch (param) { -* case IEEE80211_PARAM_AUTHMODE: -* switch (value) { -* case IEEE80211_AUTH_WPA: // WPA -* case IEEE80211_AUTH_8021X: // 802.1x -* case IEEE80211_AUTH_OPEN: // open -* case IEEE80211_AUTH_SHARED: // shared-key -* case IEEE80211_AUTH_AUTO: // auto -* auth = ieee80211_authenticator_get(value); -* if (auth == NULL) -* return -EINVAL; -* break; -* default: -* return -EINVAL; -* } -* switch (value) { -* case IEEE80211_AUTH_WPA: // WPA w/ 802.1x -* vap->iv_flags |= IEEE80211_F_PRIVACY; -* value = IEEE80211_AUTH_8021X; -* break; -* case IEEE80211_AUTH_OPEN: // open -* vap->iv_flags &= ~(IEEE80211_F_WPA | IEEE80211_F_PRIVACY); -* break; -* case IEEE80211_AUTH_SHARED: // shared-key -* case IEEE80211_AUTH_AUTO: // auto -* case IEEE80211_AUTH_8021X: // 802.1x -* vap->iv_flags &= ~IEEE80211_F_WPA; -* // both require a key so mark the PRIVACY capability -* vap->iv_flags |= IEEE80211_F_PRIVACY; -* break; -* } -* // NB: authenticator attach/detach happens on state change -* vap->iv_bss->ni_authmode = value; -* // XXX mixed/mode/usage? -* vap->iv_auth = auth; -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_PROTMODE: -* if (value > IEEE80211_PROT_RTSCTS) -* return -EINVAL; -* ic->ic_protmode = value; -* // NB: if not operating in 11g this can wait -* if (ic->ic_bsschan != IEEE80211_CHAN_ANYC && -* IEEE80211_IS_CHAN_ANYG(ic->ic_bsschan)) -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_MCASTCIPHER: -* if ((vap->iv_caps & cipher2cap(value)) == 0 && -* !ieee80211_crypto_available(value)) -* return -EINVAL; -* rsn->rsn_mcastcipher = value; -* if (vap->iv_flags & IEEE80211_F_WPA) -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_MCASTKEYLEN: -* if (!(0 < value && value < IEEE80211_KEYBUF_SIZE)) -* return -EINVAL; -* // XXX no way to verify driver capability -* rsn->rsn_mcastkeylen = value; -* if (vap->iv_flags & IEEE80211_F_WPA) -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_UCASTCIPHERS: -* -* // Convert cipher set to equivalent capabilities. -* // NB: this logic intentionally ignores unknown and -* // unsupported ciphers so folks can specify 0xff or -* // similar and get all available ciphers. -* -* caps = 0; -* for (j = 1; j < 32; j++) // NB: skip WEP -* if ((value & (1<iv_caps & cipher2cap(j)) || -* ieee80211_crypto_available(j))) -* caps |= 1<rsn_ucastcipherset = caps; -* if (vap->iv_flags & IEEE80211_F_WPA) -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_UCASTCIPHER: -* if ((rsn->rsn_ucastcipherset & cipher2cap(value)) == 0) -* return -EINVAL; -* rsn->rsn_ucastcipher = value; -* break; -* case IEEE80211_PARAM_UCASTKEYLEN: -* if (!(0 < value && value < IEEE80211_KEYBUF_SIZE)) -* return -EINVAL; -* // XXX no way to verify driver capability -* rsn->rsn_ucastkeylen = value; -* break; -* case IEEE80211_PARAM_KEYMGTALGS: -* // XXX check -* rsn->rsn_keymgmtset = value; -* if (vap->iv_flags & IEEE80211_F_WPA) -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_RSNCAPS: -* // XXX check -* rsn->rsn_caps = value; -* if (vap->iv_flags & IEEE80211_F_WPA) -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_WPA: -* if (value > 3) -* return -EINVAL; -* // XXX verify ciphers available -* vap->iv_flags &= ~IEEE80211_F_WPA; -* switch (value) { -* case 1: -* vap->iv_flags |= IEEE80211_F_WPA1; -* break; -* case 2: -* vap->iv_flags |= IEEE80211_F_WPA2; -* break; -* case 3: -* vap->iv_flags |= IEEE80211_F_WPA1 | IEEE80211_F_WPA2; -* break; -* } -* retv = ENETRESET; // XXX? -* break; -* case IEEE80211_PARAM_ROAMING: -* if (!(IEEE80211_ROAMING_DEVICE <= value && -* value <= IEEE80211_ROAMING_MANUAL)) -* return -EINVAL; -* ic->ic_roaming = value; -* break; -* case IEEE80211_PARAM_PRIVACY: -* if (value) { -* // XXX check for key state? -* vap->iv_flags |= IEEE80211_F_PRIVACY; -* } else -* vap->iv_flags &= ~IEEE80211_F_PRIVACY; -* break; -* case IEEE80211_PARAM_DROPUNENCRYPTED: -* if (value) -* vap->iv_flags |= IEEE80211_F_DROPUNENC; -* else -* vap->iv_flags &= ~IEEE80211_F_DROPUNENC; -* break; -* case IEEE80211_PARAM_COUNTERMEASURES: -* if (value) { -* if ((vap->iv_flags & IEEE80211_F_WPA) == 0) -* return -EINVAL; -* vap->iv_flags |= IEEE80211_F_COUNTERM; -* } else -* vap->iv_flags &= ~IEEE80211_F_COUNTERM; -* break; -* case IEEE80211_PARAM_DRIVER_CAPS: -* vap->iv_caps = value; // NB: for testing -* break; -* case IEEE80211_PARAM_MACCMD: -* acl = vap->iv_acl; -* switch (value) { -* case IEEE80211_MACCMD_POLICY_OPEN: -* case IEEE80211_MACCMD_POLICY_ALLOW: -* case IEEE80211_MACCMD_POLICY_DENY: -* if (acl == NULL) { -* acl = ieee80211_aclator_get("mac"); -* if (acl == NULL || !acl->iac_attach(vap)) -* return -EINVAL; -* vap->iv_acl = acl; -* } -* acl->iac_setpolicy(vap, value); -* break; -* case IEEE80211_MACCMD_FLUSH: -* if (acl != NULL) -* acl->iac_flush(vap); -* // NB: silently ignore when not in use -* break; -* case IEEE80211_MACCMD_DETACH: -* if (acl != NULL) { -* vap->iv_acl = NULL; -* acl->iac_detach(vap); -* } -* break; -* } -* break; -* case IEEE80211_PARAM_WMM: -* if (ic->ic_caps & IEEE80211_C_WME){ -* if (value) { -* vap->iv_flags |= IEEE80211_F_WME; -* *//* XXX needed by ic_reset *//* -* vap->iv_ic->ic_flags |= IEEE80211_F_WME; -* } -* else { -* *//* XXX needed by ic_reset *//* -* vap->iv_flags &= ~IEEE80211_F_WME; -* vap->iv_ic->ic_flags &= ~IEEE80211_F_WME; -* } -* retv = ENETRESET; // Renegotiate for capabilities -* } -* break; -* case IEEE80211_PARAM_HIDESSID: -* if (value) -* vap->iv_flags |= IEEE80211_F_HIDESSID; -* else -* vap->iv_flags &= ~IEEE80211_F_HIDESSID; -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_APBRIDGE: -* if (value == 0) -* vap->iv_flags |= IEEE80211_F_NOBRIDGE; -* else -* vap->iv_flags &= ~IEEE80211_F_NOBRIDGE; -* break; -* case IEEE80211_PARAM_INACT: -* vap->iv_inact_run = value / IEEE80211_INACT_WAIT; -* break; -* case IEEE80211_PARAM_INACT_AUTH: -* vap->iv_inact_auth = value / IEEE80211_INACT_WAIT; -* break; -* case IEEE80211_PARAM_INACT_INIT: -* vap->iv_inact_init = value / IEEE80211_INACT_WAIT; -* break; -* case IEEE80211_PARAM_ABOLT: -* caps = 0; -* -* // Map abolt settings to capability bits; -* // this also strips unknown/unwanted bits. -* -* if (value & IEEE80211_ABOLT_TURBO_PRIME) -* caps |= IEEE80211_ATHC_TURBOP; -* if (value & IEEE80211_ABOLT_COMPRESSION) -* caps |= IEEE80211_ATHC_COMP; -* if (value & IEEE80211_ABOLT_FAST_FRAME) -* caps |= IEEE80211_ATHC_FF; -* if (value & IEEE80211_ABOLT_XR) -* caps |= IEEE80211_ATHC_XR; -* if (value & IEEE80211_ABOLT_AR) -* caps |= IEEE80211_ATHC_AR; -* if (value & IEEE80211_ABOLT_BURST) -* caps |= IEEE80211_ATHC_BURST; -* if (value & IEEE80211_ABOLT_WME_ELE) -* caps |= IEEE80211_ATHC_WME; -* // verify requested capabilities are supported -* if ((caps & ic->ic_ath_cap) != caps) -* return -EINVAL; -* if (vap->iv_ath_cap != caps) { -* if ((vap->iv_ath_cap ^ caps) & IEEE80211_ATHC_TURBOP) { -* if (ieee80211_set_turbo(dev, -* caps & IEEE80211_ATHC_TURBOP)) -* return -EINVAL; -* ieee80211_scan_flush(ic); -* } -* vap->iv_ath_cap = caps; -* ic->ic_athcapsetup(vap->iv_ic, vap->iv_ath_cap); -* retv = ENETRESET; -* } -* break; -* case IEEE80211_PARAM_DTIM_PERIOD: -* if (vap->iv_opmode != IEEE80211_M_HOSTAP && -* vap->iv_opmode != IEEE80211_M_IBSS) -* return -EINVAL; -* if (IEEE80211_DTIM_MIN <= value && -* value <= IEEE80211_DTIM_MAX) { -* vap->iv_dtim_period = value; -* retv = ENETRESET; // requires restart -* } else -* retv = EINVAL; -* break; -* case IEEE80211_PARAM_BEACON_INTERVAL: -* if (vap->iv_opmode != IEEE80211_M_HOSTAP && -* vap->iv_opmode != IEEE80211_M_IBSS) -* return -EINVAL; -* if (IEEE80211_BINTVAL_MIN <= value && -* value <= IEEE80211_BINTVAL_MAX) { -* ic->ic_lintval = value; // XXX multi-bss -* retv = ENETRESET; // requires restart -* } else -* retv = EINVAL; -* break; -* case IEEE80211_PARAM_DOTH: -* if (value) { -* ic->ic_flags |= IEEE80211_F_DOTH; -* } -* else -* ic->ic_flags &= ~IEEE80211_F_DOTH; -* retv = ENETRESET; // XXX: need something this drastic? -* break; -* case IEEE80211_PARAM_PWRTARGET: -* ic->ic_curchanmaxpwr = value; -* break; -* case IEEE80211_PARAM_GENREASSOC: -* IEEE80211_SEND_MGMT(vap->iv_bss, -* IEEE80211_FC0_SUBTYPE_REASSOC_REQ, 0); -* break; -* case IEEE80211_PARAM_COMPRESSION: -* retv = ieee80211_setathcap(vap, IEEE80211_ATHC_COMP, value); -* break; -* case IEEE80211_PARAM_WMM_AGGRMODE: -* retv = ieee80211_setathcap(vap, IEEE80211_ATHC_WME, value); -* break; -* case IEEE80211_PARAM_FF: -* retv = ieee80211_setathcap(vap, IEEE80211_ATHC_FF, value); -* break; -* case IEEE80211_PARAM_TURBO: -* retv = ieee80211_setathcap(vap, IEEE80211_ATHC_TURBOP, value); -* if (retv == ENETRESET) { -* if(ieee80211_set_turbo(dev,value)) -* return -EINVAL; -* ieee80211_scan_flush(ic); -* } -* break; -* case IEEE80211_PARAM_XR: -* retv = ieee80211_setathcap(vap, IEEE80211_ATHC_XR, value); -* break; -* case IEEE80211_PARAM_BURST: -* retv = ieee80211_setathcap(vap, IEEE80211_ATHC_BURST, value); -* break; -* case IEEE80211_PARAM_AR: -* retv = ieee80211_setathcap(vap, IEEE80211_ATHC_AR, value); -* break; -* case IEEE80211_PARAM_PUREG: -* if (value) -* vap->iv_flags |= IEEE80211_F_PUREG; -* else -* vap->iv_flags &= ~IEEE80211_F_PUREG; -* // NB: reset only if we're operating on an 11g channel -* if (ic->ic_bsschan != IEEE80211_CHAN_ANYC && -* IEEE80211_IS_CHAN_ANYG(ic->ic_bsschan)) -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_WDS: -* if (value) -* vap->iv_flags_ext |= IEEE80211_FEXT_WDS; -* else -* vap->iv_flags_ext &= ~IEEE80211_FEXT_WDS; -* break; -* case IEEE80211_PARAM_BGSCAN: -* if (value) { -* if ((vap->iv_caps & IEEE80211_C_BGSCAN) == 0) -* return -EINVAL; -* vap->iv_flags |= IEEE80211_F_BGSCAN; -* } else { -* // XXX racey? -* vap->iv_flags &= ~IEEE80211_F_BGSCAN; -* ieee80211_cancel_scan(vap); // anything current -* } -* break; -* case IEEE80211_PARAM_BGSCAN_IDLE: -* if (value >= IEEE80211_BGSCAN_IDLE_MIN) -* vap->iv_bgscanidle = value*HZ/1000; -* else -* retv = EINVAL; -* break; -* case IEEE80211_PARAM_BGSCAN_INTERVAL: -* if (value >= IEEE80211_BGSCAN_INTVAL_MIN) -* vap->iv_bgscanintvl = value*HZ; -* else -* retv = EINVAL; -* break; -* case IEEE80211_PARAM_MCAST_RATE: -* // units are in KILObits per second -* if (value >= 256 && value <= 54000) -* vap->iv_mcast_rate = value; -* else -* retv = EINVAL; -* break; -* case IEEE80211_PARAM_COVERAGE_CLASS: -* if (value >= 0 && value <= IEEE80211_COVERAGE_CLASS_MAX) { -* ic->ic_coverageclass = value; -* if (IS_UP_AUTO(vap)) -* ieee80211_new_state(vap, IEEE80211_S_SCAN, 0); -* retv = 0; -* } -* else -* retv = EINVAL; -* break; -* case IEEE80211_PARAM_COUNTRY_IE: -* if (value) -* ic->ic_flags_ext |= IEEE80211_FEXT_COUNTRYIE; -* else -* ic->ic_flags_ext &= ~IEEE80211_FEXT_COUNTRYIE; -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_REGCLASS: -* if (value) -* ic->ic_flags_ext |= IEEE80211_FEXT_REGCLASS; -* else -* ic->ic_flags_ext &= ~IEEE80211_FEXT_REGCLASS; -* retv = ENETRESET; -* break; -* case IEEE80211_PARAM_SCANVALID: -* vap->iv_scanvalid = value*HZ; -* break; -* case IEEE80211_PARAM_ROAM_RSSI_11A: -* vap->iv_roam.rssi11a = value; -* break; -* case IEEE80211_PARAM_ROAM_RSSI_11B: -* vap->iv_roam.rssi11bOnly = value; -* break; -* case IEEE80211_PARAM_ROAM_RSSI_11G: -* vap->iv_roam.rssi11b = value; -* break; -* case IEEE80211_PARAM_ROAM_RATE_11A: -* vap->iv_roam.rate11a = value; -* break; -* case IEEE80211_PARAM_ROAM_RATE_11B: -* vap->iv_roam.rate11bOnly = value; -* break; -* case IEEE80211_PARAM_ROAM_RATE_11G: -* vap->iv_roam.rate11b = value; -* break; -* case IEEE80211_PARAM_UAPSDINFO: -* if (vap->iv_opmode == IEEE80211_M_HOSTAP) { -* if (ic->ic_caps & IEEE80211_C_UAPSD) { -* if (value) -* IEEE80211_VAP_UAPSD_ENABLE(vap); -* else -* IEEE80211_VAP_UAPSD_DISABLE(vap); -* retv = ENETRESET; -* } -* } -* else if (vap->iv_opmode == IEEE80211_M_STA) { -* vap->iv_uapsdinfo = value; -* IEEE80211_VAP_UAPSD_ENABLE(vap); -* retv = ENETRESET; -* } -* break; -* case IEEE80211_PARAM_SLEEP: -* // XXX: Forced sleep for testing. Does not actually place the -* // HW in sleep mode yet. this only makes sense for STAs. -* -* if (value) { -* // goto sleep -* IEEE80211_VAP_GOTOSLEEP(vap); -* } -* else { -* // wakeup -* IEEE80211_VAP_WAKEUP(vap); -* } -* ieee80211_send_nulldata(ieee80211_ref_node(vap->iv_bss)); -* break; -* case IEEE80211_PARAM_QOSNULL: -* // Force a QoS Null for testing. -* ieee80211_send_qosnulldata(vap->iv_bss, value); -* break; -* case IEEE80211_PARAM_PSPOLL: -* // Force a PS-POLL for testing. -* ieee80211_send_pspoll(vap->iv_bss); -* break; -* case IEEE80211_PARAM_EOSPDROP: -* if (vap->iv_opmode == IEEE80211_M_HOSTAP) { -* if (value) IEEE80211_VAP_EOSPDROP_ENABLE(vap); -* else IEEE80211_VAP_EOSPDROP_DISABLE(vap); -* } -* break; -* case IEEE80211_PARAM_MARKDFS: -* if (value) -* ic->ic_flags_ext |= IEEE80211_FEXT_MARKDFS; -* else -* ic->ic_flags_ext &= ~IEEE80211_FEXT_MARKDFS; -* break; -* case IEEE80211_PARAM_CHANBW: -* switch (value) { -* case 0: -* ic->ic_chanbwflag = 0; -* break; -* case 1: -* ic->ic_chanbwflag = IEEE80211_CHAN_HALF; -* break; -* case 2: -* ic->ic_chanbwflag = IEEE80211_CHAN_QUARTER; -* break; -* default: -* retv = EINVAL; -* break; -* } -* break; -* case IEEE80211_PARAM_SHORTPREAMBLE: -* if (value) { -* ic->ic_caps |= IEEE80211_C_SHPREAMBLE; -* } else { -* ic->ic_caps &= ~IEEE80211_C_SHPREAMBLE; -* } -* retv = ENETRESET; -* break; -* default: -* retv = EOPNOTSUPP; -* break; -* } -* // XXX should any of these cause a rescan? -* if (retv == ENETRESET) -* retv = IS_UP_AUTO(vap) ? ieee80211_open(vap->iv_dev) : 0; -* return -retv; -*} -*/ - -int usbdrvwext_setmode(struct net_device *dev, struct iw_request_info *info, - void *w, char *extra) -{ - return 0; -} - -int usbdrvwext_getmode(struct net_device *dev, struct iw_request_info *info, - void *w, char *extra) -{ - /* struct usbdrv_private *macp = dev->ml_priv; */ - struct iw_point *wri = (struct iw_point *)extra; - char mode[8]; - - strcpy(mode, "11g"); - return copy_to_user(wri->pointer, mode, 6) ? -EFAULT : 0; -} - -int zfLnxPrivateIoctl(struct net_device *dev, struct zdap_ioctl* zdreq) -{ - /* void* regp = macp->regp; */ - u16_t cmd; - /* u32_t temp; */ - u32_t *p; - u32_t i; - - cmd = zdreq->cmd; - switch (cmd) { - case ZM_IOCTL_REG_READ: - zfiDbgReadReg(dev, zdreq->addr); - break; - case ZM_IOCTL_REG_WRITE: - zfiDbgWriteReg(dev, zdreq->addr, zdreq->value); - break; - case ZM_IOCTL_MEM_READ: - p = (u32_t *) bus_to_virt(zdreq->addr); - printk(KERN_WARNING - "usbdrv: read memory addr: 0x%08x value:" - " 0x%08x\n", zdreq->addr, *p); - break; - case ZM_IOCTL_MEM_WRITE: - p = (u32_t *) bus_to_virt(zdreq->addr); - *p = zdreq->value; - printk(KERN_WARNING - "usbdrv : write value : 0x%08x to memory addr :" - " 0x%08x\n", zdreq->value, zdreq->addr); - break; - case ZM_IOCTL_TALLY: - zfiWlanShowTally(dev); - if (zdreq->addr) - zfiWlanResetTally(dev); - break; - case ZM_IOCTL_TEST: - printk(KERN_WARNING - "ZM_IOCTL_TEST:len=%d\n", zdreq->addr); - /* zfiWlanReadReg(dev, 0x10f400); */ - /* zfiWlanReadReg(dev, 0x10f404); */ - printk(KERN_WARNING "IOCTL TEST\n"); - #if 1 - /* print packet */ - for (i = 0; i < zdreq->addr; i++) { - if ((i&0x7) == 0) - printk(KERN_WARNING "\n"); - printk(KERN_WARNING "%02X ", - (unsigned char)zdreq->data[i]); - } - printk(KERN_WARNING "\n"); - #endif - - /* For Test?? 1 to 0 by CWYang(-) */ - #if 0 - struct sk_buff *s; - - /* Allocate a skb */ - s = alloc_skb(2000, GFP_ATOMIC); - - /* Copy data to skb */ - for (i = 0; i < zdreq->addr; i++) - s->data[i] = zdreq->data[i]; - s->len = zdreq->addr; - - /* Call zfIdlRecv() */ - zfiRecv80211(dev, s, NULL); - #endif - break; - /************************* ZDCONFIG ***************************/ - case ZM_IOCTL_FRAG: - zfiWlanSetFragThreshold(dev, zdreq->addr); - break; - case ZM_IOCTL_RTS: - zfiWlanSetRtsThreshold(dev, zdreq->addr); - break; - case ZM_IOCTL_SCAN: - zfiWlanScan(dev); - break; - case ZM_IOCTL_KEY: { - u8_t key[29]; - struct zsKeyInfo keyInfo; - u32_t i; - - for (i = 0; i < 29; i++) - key[i] = 0; - - for (i = 0; i < zdreq->addr; i++) - key[i] = zdreq->data[i]; - - printk(KERN_WARNING - "key len=%d, key=%02x%02x%02x%02x%02x...\n", - zdreq->addr, key[0], key[1], key[2], key[3], key[4]); - - keyInfo.keyLength = zdreq->addr; - keyInfo.keyIndex = 0; - keyInfo.flag = 0; - keyInfo.key = key; - zfiWlanSetKey(dev, keyInfo); - } - break; - case ZM_IOCTL_RATE: - zfiWlanSetTxRate(dev, zdreq->addr); - break; - case ZM_IOCTL_ENCRYPTION_MODE: - zfiWlanSetEncryMode(dev, zdreq->addr); - - zfiWlanDisable(dev, 0); - zfiWlanEnable(dev); - break; - /* CWYang(+) */ - case ZM_IOCTL_SIGNAL_STRENGTH: { - u8_t buffer[2]; - zfiWlanQuerySignalInfo(dev, &buffer[0]); - printk(KERN_WARNING - "Current Signal Strength : %02d\n", buffer[0]); - } - break; - /* CWYang(+) */ - case ZM_IOCTL_SIGNAL_QUALITY: { - u8_t buffer[2]; - zfiWlanQuerySignalInfo(dev, &buffer[0]); - printk(KERN_WARNING - "Current Signal Quality : %02d\n", buffer[1]); - } - break; - case ZM_IOCTL_SET_PIBSS_MODE: - if (zdreq->addr == 1) - zfiWlanSetWlanMode(dev, ZM_MODE_PSEUDO); - else - zfiWlanSetWlanMode(dev, ZM_MODE_INFRASTRUCTURE); - - zfiWlanDisable(dev, 0); - zfiWlanEnable(dev); - break; - /********************* ZDCONFIG ***********************/ - default: - printk(KERN_ERR "usbdrv: error command = %x\n", cmd); - break; - } - - return 0; -} - -int usbdrv_wpa_ioctl(struct net_device *dev, struct athr_wlan_param *zdparm) -{ - int ret = 0; - u8_t bc_addr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - u8_t mac_addr[80]; - struct zsKeyInfo keyInfo; - struct usbdrv_private *macp = dev->ml_priv; - u16_t vapId = 0; - int ii; - - /* zmw_get_wlan_dev(dev); */ - - switch (zdparm->cmd) { - case ZD_CMD_SET_ENCRYPT_KEY: - /* Set up key information */ - keyInfo.keyLength = zdparm->u.crypt.key_len; - keyInfo.keyIndex = zdparm->u.crypt.idx; - if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) { - /* AP Mode */ - keyInfo.flag = ZM_KEY_FLAG_AUTHENTICATOR; - } else - keyInfo.flag = 0; - keyInfo.key = zdparm->u.crypt.key; - keyInfo.initIv = zdparm->u.crypt.seq; - keyInfo.macAddr = (u16_t *)zdparm->sta_addr; - - /* Identify the MAC address information */ - if (memcmp(zdparm->sta_addr, bc_addr, sizeof(bc_addr)) == 0) - keyInfo.flag |= ZM_KEY_FLAG_GK; - else - keyInfo.flag |= ZM_KEY_FLAG_PK; - - if (!strcmp(zdparm->u.crypt.alg, "NONE")) { - /* u8_t zero_mac[]={0,0,0,0,0,0}; */ - - /* Set key length to zero */ - keyInfo.keyLength = 0; - - /* del group key */ - if (zdparm->sta_addr[0] & 1) { - /* if (macp->cardSetting.WPAIeLen==0) - * { 802.1x dynamic WEP - * mDynKeyMode = 0; - * mKeyFormat[0] = 0; - * mPrivacyInvoked[0]=FALSE; - * mCap[0] &= ~CAP_PRIVACY; - * macp->cardSetting.EncryOnOff[0]=0; - * } - * mWpaBcKeyLen = mGkInstalled = 0; - */ - } else { - /* if (memcmp(zero_mac,zdparm->sta_addr, 6)==0) - * { - * mDynKeyMode=0; - * mKeyFormat[0]=0; - * pSetting->DynKeyMode=0; - * pSetting->EncryMode[0]=0; - * mDynKeyMode=0; - * } - */ - } - - printk(KERN_ERR "Set Encryption Type NONE\n"); - return ret; - } else if (!strcmp(zdparm->u.crypt.alg, "TKIP")) { - zfiWlanSetEncryMode(dev, ZM_TKIP); - /* //Linux Supplicant will inverse Tx/Rx key - * //So we inverse it back, CWYang(+) - * zfMemoryCopy(&temp[0], &keyInfo.key[16], 8); - * zfMemoryCopy(&keyInfo.key[16], keyInfo.key[24], 8); - * zfMemoryCopy(&keyInfo.key[24], &temp[0], 8); - * u8_t temp; - * int k; - * for (k = 0; k < 8; k++) - * { - * temp = keyInfo.key[16 + k]; - * keyInfo.key[16 + k] = keyInfo.key[24 + k]; - * keyInfo.key[24 + k] = temp; - * } - * CamEncryType = ZM_TKIP; - * if (idx == 0) - * { // Pairwise key - * mKeyFormat[0] = CamEncryType; - * mDynKeyMode = pSetting->DynKeyMode = DYN_KEY_TKIP; - * } - */ - } else if (!strcmp(zdparm->u.crypt.alg, "CCMP")) { - zfiWlanSetEncryMode(dev, ZM_AES); - /* CamEncryType = ZM_AES; - * if (idx == 0) - * { // Pairwise key - * mKeyFormat[0] = CamEncryType; - * mDynKeyMode = pSetting->DynKeyMode = DYN_KEY_AES; - * } - */ - } else if (!strcmp(zdparm->u.crypt.alg, "WEP")) { - if (keyInfo.keyLength == 5) { - /* WEP 64 */ - zfiWlanSetEncryMode(dev, ZM_WEP64); - /* CamEncryType = ZM_WEP64; */ - /* tmpDynKeyMode=DYN_KEY_WEP64; */ - } else if (keyInfo.keyLength == 13) { - /* keylen=13, WEP 128 */ - zfiWlanSetEncryMode(dev, ZM_WEP128); - /* CamEncryType = ZM_WEP128; */ - /* tmpDynKeyMode=DYN_KEY_WEP128; */ - } else { - zfiWlanSetEncryMode(dev, ZM_WEP256); - } - - /* For Dynamic WEP key (Non-WPA Radius), the key ID range: 0-3 - * In WPA/RSN mode, the key ID range: 1-3, usually, a broadcast key. - * For WEP key setting: we set mDynKeyMode and mKeyFormat in following - * case: - * 1. For 802.1x dynamically generated WEP key method. - * 2. For WPA/RSN mode, but key id == 0. - * (But this is an impossible case) - * So, only check case 1. - * if (macp->cardSetting.WPAIeLen==0) - * { - * mKeyFormat[0] = CamEncryType; - * mDynKeyMode = pSetting->DynKeyMode = tmpDynKeyMode; - * mPrivacyInvoked[0]=TRUE; - * mCap[0] |= CAP_PRIVACY; - * macp->cardSetting.EncryOnOff[0]=1; - * } - */ - } - - /* DUMP key context */ - /* #ifdef WPA_DEBUG */ - if (keyInfo.keyLength > 0) { - printk(KERN_WARNING - "Otus: Key Context:\n"); - for (ii = 0; ii < keyInfo.keyLength; ) { - printk(KERN_WARNING - "0x%02x ", keyInfo.key[ii]); - if ((++ii % 16) == 0) - printk(KERN_WARNING "\n"); - } - printk(KERN_WARNING "\n"); - } - /* #endif */ - - /* Set encrypt mode */ - /* zfiWlanSetEncryMode(dev, CamEncryType); */ - vapId = zfLnxGetVapId(dev); - if (vapId == 0xffff) - keyInfo.vapId = 0; - else - keyInfo.vapId = vapId + 1; - keyInfo.vapAddr[0] = keyInfo.macAddr[0]; - keyInfo.vapAddr[1] = keyInfo.macAddr[1]; - keyInfo.vapAddr[2] = keyInfo.macAddr[2]; - - zfiWlanSetKey(dev, keyInfo); - - /* zfiWlanDisable(dev); */ - /* zfiWlanEnable(dev); */ - break; - case ZD_CMD_SET_MLME: - printk(KERN_ERR "usbdrv_wpa_ioctl: ZD_CMD_SET_MLME\n"); - - /* Translate STA's address */ - sprintf(mac_addr, "%pM", zdparm->sta_addr); - - switch (zdparm->u.mlme.cmd) { - case MLME_STA_DEAUTH: - printk(KERN_WARNING - " -------Call zfiWlanDeauth, reason:%d\n", - zdparm->u.mlme.reason_code); - if (zfiWlanDeauth(dev, (u16_t *) zdparm->sta_addr, - zdparm->u.mlme.reason_code) != 0) - printk(KERN_ERR "Can't deauthencate STA: %s\n", - mac_addr); - else - printk(KERN_ERR "Deauthenticate STA: %s" - "with reason code: %d\n", - mac_addr, zdparm->u.mlme.reason_code); - break; - case MLME_STA_DISASSOC: - printk(KERN_WARNING - " -------Call zfiWlanDeauth, reason:%d\n", - zdparm->u.mlme.reason_code); - if (zfiWlanDeauth(dev, (u16_t *) zdparm->sta_addr, - zdparm->u.mlme.reason_code) != 0) - printk(KERN_ERR "Can't disassociate STA: %s\n", - mac_addr); - else - printk(KERN_ERR "Disassociate STA: %s" - "with reason code: %d\n", - mac_addr, zdparm->u.mlme.reason_code); - break; - default: - printk(KERN_ERR "MLME command: 0x%04x not support\n", - zdparm->u.mlme.cmd); - break; - } - - break; - case ZD_CMD_SCAN_REQ: - printk(KERN_ERR "usbdrv_wpa_ioctl: ZD_CMD_SCAN_REQ\n"); - break; - case ZD_CMD_SET_GENERIC_ELEMENT: { - u8_t len, *wpaie; - printk(KERN_ERR "usbdrv_wpa_ioctl:" - " ZD_CMD_SET_GENERIC_ELEMENT\n"); - - /* Copy the WPA IE - * zm_msg1_mm(ZM_LV_0, "CWY - wpaie Length : ", - * zdparm->u.generic_elem.len); - */ - printk(KERN_ERR "wpaie Length : % d\n", - zdparm->u.generic_elem.len); - if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) { - /* AP Mode */ - zfiWlanSetWpaIe(dev, zdparm->u.generic_elem.data, - zdparm->u.generic_elem.len); - } else { - macp->supLen = zdparm->u.generic_elem.len; - memcpy(macp->supIe, zdparm->u.generic_elem.data, - zdparm->u.generic_elem.len); - } - zfiWlanSetWpaSupport(dev, 1); - /* zfiWlanSetWpaIe(dev, zdparm->u.generic_elem.data, - * zdparm->u.generic_elem.len); - */ - len = zdparm->u.generic_elem.len; - wpaie = zdparm->u.generic_elem.data; - - printk(KERN_ERR "wd->ap.wpaLen : % d\n", len); - - /* DUMP WPA IE */ - for (ii = 0; ii < len;) { - printk(KERN_ERR "0x%02x ", wpaie[ii]); - - if ((++ii % 16) == 0) - printk(KERN_ERR "\n"); - } - printk(KERN_ERR "\n"); - - /* #ifdef ZM_HOSTAPD_SUPPORT - * if (wd->wlanMode == ZM_MODE_AP) - * {// Update Beacon FIFO in the next TBTT. - * memcpy(&mWPAIe, pSetting->WPAIe, pSetting->WPAIeLen); - * printk(KERN_ERR "Copy WPA IE into mWPAIe\n"); - * } - * #endif - */ - break; - } - - /* #ifdef ZM_HOSTAPD_SUPPORT */ - case ZD_CMD_GET_TSC: - printk(KERN_ERR "usbdrv_wpa_ioctl : ZD_CMD_GET_TSC\n"); - break; - /* #endif */ - - default: - printk(KERN_ERR "usbdrv_wpa_ioctl default : 0x%04x\n", - zdparm->cmd); - ret = -EINVAL; - break; - } - - return ret; -} - -#ifdef ZM_ENABLE_CENC -int usbdrv_cenc_ioctl(struct net_device *dev, struct zydas_cenc_param *zdparm) -{ - /* struct usbdrv_private *macp = dev->ml_priv; */ - struct zsKeyInfo keyInfo; - u16_t apId; - u8_t bc_addr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - int ret = 0; - int ii; - - /* Get the AP Id */ - apId = zfLnxGetVapId(dev); - - if (apId == 0xffff) - apId = 0; - else - apId = apId + 1; - - switch (zdparm->cmd) { - case ZM_CMD_CENC_SETCENC: - printk(KERN_ERR "ZM_CMD_CENC_SETCENC\n"); - printk(KERN_ERR "length : % d\n", zdparm->len); - printk(KERN_ERR "policy : % d\n", zdparm->u.info.cenc_policy); - break; - case ZM_CMD_CENC_SETKEY: - /* ret = wai_ioctl_setkey(vap, ioctl_msg); */ - printk(KERN_ERR "ZM_CMD_CENC_SETKEY\n"); - - printk(KERN_ERR "MAC address = "); - for (ii = 0; ii < 6; ii++) { - printk(KERN_ERR "0x%02x ", - zdparm->u.crypt.sta_addr[ii]); - } - printk(KERN_ERR "\n"); - - printk(KERN_ERR "Key Index : % d\n", zdparm->u.crypt.keyid); - printk(KERN_ERR "Encryption key = "); - for (ii = 0; ii < 16; ii++) - printk(KERN_ERR "0x%02x ", zdparm->u.crypt.key[ii]); - - printk(KERN_ERR "\n"); - - printk(KERN_ERR "MIC key = "); - for (ii = 16; ii < ZM_CENC_KEY_SIZE; ii++) - printk(KERN_ERR "0x%02x ", zdparm->u.crypt.key[ii]); - - printk(KERN_ERR "\n"); - - /* Set up key information */ - keyInfo.keyLength = ZM_CENC_KEY_SIZE; - keyInfo.keyIndex = zdparm->u.crypt.keyid; - keyInfo.flag = ZM_KEY_FLAG_AUTHENTICATOR | ZM_KEY_FLAG_CENC; - keyInfo.key = zdparm->u.crypt.key; - keyInfo.macAddr = (u16_t *)zdparm->u.crypt.sta_addr; - - /* Identify the MAC address information */ - if (memcmp(zdparm->u.crypt.sta_addr, bc_addr, - sizeof(bc_addr)) == 0) { - keyInfo.flag |= ZM_KEY_FLAG_GK; - keyInfo.vapId = apId; - memcpy(keyInfo.vapAddr, dev->dev_addr, ETH_ALEN); - } else { - keyInfo.flag |= ZM_KEY_FLAG_PK; - } - - zfiWlanSetKey(dev, keyInfo); - - break; - case ZM_CMD_CENC_REKEY: - /* ret = wai_ioctl_rekey(vap, ioctl_msg); */ - printk(KERN_ERR "ZM_CMD_CENC_REKEY\n"); - break; - default: - ret = -EOPNOTSUPP; - break; - } - - /* if (retv == ENETRESET) */ - /* retv = IS_UP_AUTO(vap) ? ieee80211_open(vap->iv_dev) : 0; */ - - return ret; -} -#endif /* ZM_ENABLE_CENC */ - -int usbdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - /* struct usbdrv_private *macp; */ - /* void *regp; */ - struct zdap_ioctl zdreq; - struct iwreq *wrq = (struct iwreq *)ifr; - struct athr_wlan_param zdparm; - struct usbdrv_private *macp = dev->ml_priv; - - int err = 0, val = 0; - int changed = 0; - - /* regp = macp->regp; */ - - if (!netif_running(dev)) - return -EINVAL; - - switch (cmd) { - case SIOCGIWNAME: - strcpy(wrq->u.name, "IEEE 802.11-DS"); - break; - case SIOCGIWAP: - err = usbdrvwext_giwap(dev, NULL, &wrq->u.ap_addr, NULL); - break; - case SIOCSIWAP: - err = usbdrvwext_siwap(dev, NULL, &wrq->u.ap_addr, NULL); - break; - case SIOCGIWMODE: - err = usbdrvwext_giwmode(dev, NULL, &wrq->u.mode, NULL); - break; - case SIOCSIWESSID: - printk(KERN_ERR "CWY - usbdrvwext_siwessid\n"); - /* err = usbdrv_ioctl_setessid(dev, &wrq->u.essid); */ - err = usbdrvwext_siwessid(dev, NULL, &wrq->u.essid, NULL); - - if (!err) - changed = 1; - break; - case SIOCGIWESSID: - err = usbdrvwext_giwessid(dev, NULL, &wrq->u.essid, NULL); - break; - case SIOCSIWRTS: - err = usbdrv_ioctl_setrts(dev, &wrq->u.rts); - if (!err) - changed = 1; - break; - /* set_auth */ - case SIOCIWFIRSTPRIV + 0x2: { - /* printk("CWY - SIOCIWFIRSTPRIV + 0x2(set_auth)\n"); */ - if (!capable(CAP_NET_ADMIN)) { - err = -EPERM; - break; - } - val = *((int *) wrq->u.name); - if ((val < 0) || (val > 2)) { - err = -EINVAL; - break; - } else { - zfiWlanSetAuthenticationMode(dev, val); - - if (macp->DeviceOpened == 1) { - zfiWlanDisable(dev, 0); - zfiWlanEnable(dev); - } - - err = 0; - changed = 1; - } - } - break; - /* get_auth */ - case SIOCIWFIRSTPRIV + 0x3: { - int AuthMode = ZM_AUTH_MODE_OPEN; - - /* printk("CWY - SIOCIWFIRSTPRIV + 0x3(get_auth)\n"); */ - - if (wrq->u.data.pointer) { - wrq->u.data.flags = 1; - - AuthMode = zfiWlanQueryAuthenticationMode(dev, 0); - if (AuthMode == ZM_AUTH_MODE_OPEN) { - wrq->u.data.length = 12; - - if (copy_to_user(wrq->u.data.pointer, - "open system", 12)) { - return -EFAULT; - } - } else if (AuthMode == ZM_AUTH_MODE_SHARED_KEY) { - wrq->u.data.length = 11; - - if (copy_to_user(wrq->u.data.pointer, - "shared key", 11)) { - return -EFAULT; - } - } else if (AuthMode == ZM_AUTH_MODE_AUTO) { - wrq->u.data.length = 10; - - if (copy_to_user(wrq->u.data.pointer, - "auto mode", 10)) { - return -EFAULT; - } - } else { - return -EFAULT; - } - } - } - break; - /* debug command */ - case ZDAPIOCTL: - if (copy_from_user(&zdreq, ifr->ifr_data, sizeof(zdreq))) { - printk(KERN_ERR "usbdrv : copy_from_user error\n"); - return -EFAULT; - } - - /* printk(KERN_WARNING - * "usbdrv : cmd = % 2x, reg = 0x%04lx, - *value = 0x%08lx\n", - * zdreq.cmd, zdreq.addr, zdreq.value); - */ - zfLnxPrivateIoctl(dev, &zdreq); - - err = 0; - break; - case ZD_IOCTL_WPA: - if (copy_from_user(&zdparm, ifr->ifr_data, - sizeof(struct athr_wlan_param))) { - printk(KERN_ERR "usbdrv : copy_from_user error\n"); - return -EFAULT; - } - - usbdrv_wpa_ioctl(dev, &zdparm); - err = 0; - break; - case ZD_IOCTL_PARAM: { - int *p; - int op; - int arg; - - /* Point to the name field and retrieve the - * op and arg elements. - */ - p = (int *)wrq->u.name; - op = *p++; - arg = *p; - - if (op == ZD_PARAM_ROAMING) { - printk(KERN_ERR - "*************ZD_PARAM_ROAMING : % d\n", arg); - /* macp->cardSetting.ap_scan=(U8)arg; */ - } - if (op == ZD_PARAM_PRIVACY) { - printk(KERN_ERR "ZD_IOCTL_PRIVACY : "); - - /* Turn on the privacy invoke flag */ - if (arg) { - /* mCap[0] |= CAP_PRIVACY; */ - /* macp->cardSetting.EncryOnOff[0] = 1; */ - printk(KERN_ERR "enable\n"); - - } else { - /* mCap[0] &= ~CAP_PRIVACY; */ - /* macp->cardSetting.EncryOnOff[0] = 0; */ - printk(KERN_ERR "disable\n"); - } - /* changed=1; */ - } - if (op == ZD_PARAM_WPA) { - - printk(KERN_ERR "ZD_PARAM_WPA : "); - - if (arg) { - printk(KERN_ERR "enable\n"); - - if (zfiWlanQueryWlanMode(dev) != ZM_MODE_AP) { - printk(KERN_ERR "Station Mode\n"); - /* zfiWlanQueryWpaIe(dev, (u8_t *) - &wpaIe, &wpalen); */ - /* printk("wpaIe : % 2x, % 2x, % 2x\n", - wpaIe[21], wpaIe[22], wpaIe[23]); */ - /* printk("rsnIe : % 2x, % 2x, % 2x\n", - wpaIe[17], wpaIe[18], wpaIe[19]); */ - if ((macp->supIe[21] == 0x50) && - (macp->supIe[22] == 0xf2) && - (macp->supIe[23] == 0x2)) { - printk(KERN_ERR - "wd->sta.authMode = ZM_AUTH_MODE_WPAPSK\n"); - /* wd->sta.authMode = ZM_AUTH_MODE_WPAPSK; */ - /* wd->ws.authMode = ZM_AUTH_MODE_WPAPSK; */ - zfiWlanSetAuthenticationMode(dev, - ZM_AUTH_MODE_WPAPSK); - } else if ((macp->supIe[21] == 0x50) && - (macp->supIe[22] == 0xf2) && - (macp->supIe[23] == 0x1)) { - printk(KERN_ERR - "wd->sta.authMode = ZM_AUTH_MODE_WPA\n"); - /* wd->sta.authMode = ZM_AUTH_MODE_WPA; */ - /* wd->ws.authMode = ZM_AUTH_MODE_WPA; */ - zfiWlanSetAuthenticationMode(dev, - ZM_AUTH_MODE_WPA); - } else if ((macp->supIe[17] == 0xf) && - (macp->supIe[18] == 0xac) && - (macp->supIe[19] == 0x2)) { - printk(KERN_ERR - "wd->sta.authMode = ZM_AUTH_MODE_WPA2PSK\n"); - /* wd->sta.authMode = ZM_AUTH_MODE_WPA2PSK; */ - /* wd->ws.authMode = ZM_AUTH_MODE_WPA2PSK; */ - zfiWlanSetAuthenticationMode(dev, - ZM_AUTH_MODE_WPA2PSK); - } else if ((macp->supIe[17] == 0xf) && - (macp->supIe[18] == 0xac) && - (macp->supIe[19] == 0x1)) { - printk(KERN_ERR - "wd->sta.authMode = ZM_AUTH_MODE_WPA2\n"); - /* wd->sta.authMode = ZM_AUTH_MODE_WPA2; */ - /* wd->ws.authMode = ZM_AUTH_MODE_WPA2; */ - zfiWlanSetAuthenticationMode(dev, - ZM_AUTH_MODE_WPA2); - } - /* WPA or WPAPSK */ - if ((macp->supIe[21] == 0x50) || - (macp->supIe[22] == 0xf2)) { - if (macp->supIe[11] == 0x2) { - printk(KERN_ERR - "wd->sta.wepStatus = ZM_ENCRYPTION_TKIP\n"); - /* wd->sta.wepStatus = ZM_ENCRYPTION_TKIP; */ - /* wd->ws.wepStatus = ZM_ENCRYPTION_TKIP; */ - zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_TKIP); - } else { - printk(KERN_ERR - "wd->sta.wepStatus = ZM_ENCRYPTION_AES\n"); - /* wd->sta.wepStatus = ZM_ENCRYPTION_AES; */ - /* wd->ws.wepStatus = ZM_ENCRYPTION_AES; */ - zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_AES); - } - } - /*WPA2 or WPA2PSK*/ - if ((macp->supIe[17] == 0xf) || - (macp->supIe[18] == 0xac)) { - if (macp->supIe[13] == 0x2) { - printk(KERN_ERR - "wd->sta.wepStatus = ZM_ENCRYPTION_TKIP\n"); - /* wd->sta.wepStatus = ZM_ENCRYPTION_TKIP; */ - /* wd->ws.wepStatus = ZM_ENCRYPTION_TKIP; */ - zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_TKIP); - } else { - printk(KERN_ERR - "wd->sta.wepStatus = ZM_ENCRYPTION_AES\n"); - /* wd->sta.wepStatus = ZM_ENCRYPTION_AES; */ - /* wd->ws.wepStatus = ZM_ENCRYPTION_AES; */ - zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_AES); - } - } - } - zfiWlanSetWpaSupport(dev, 1); - } else { - /* Reset the WPA related variables */ - printk(KERN_ERR "disable\n"); - - zfiWlanSetWpaSupport(dev, 0); - zfiWlanSetAuthenticationMode(dev, ZM_AUTH_MODE_OPEN); - zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_WEP_DISABLED); - - /* Now we only set the length in the WPA IE - * field to zero. - *macp->cardSetting.WPAIe[1] = 0; - */ - } - } - - if (op == ZD_PARAM_COUNTERMEASURES) { - printk(KERN_ERR - "****************ZD_PARAM_COUNTERMEASURES : "); - - if (arg) { - /* mCounterMeasureState=1; */ - printk(KERN_ERR "enable\n"); - } else { - /* mCounterMeasureState=0; */ - printk(KERN_ERR "disable\n"); - } - } - if (op == ZD_PARAM_DROPUNENCRYPTED) { - printk(KERN_ERR "ZD_PARAM_DROPUNENCRYPTED : "); - - if (arg) - printk(KERN_ERR "enable\n"); - else - printk(KERN_ERR "disable\n"); - } - if (op == ZD_PARAM_AUTH_ALGS) { - printk(KERN_ERR "ZD_PARAM_AUTH_ALGS : "); - - if (arg == 0) - printk(KERN_ERR "OPEN_SYSTEM\n"); - else - printk(KERN_ERR "SHARED_KEY\n"); - } - if (op == ZD_PARAM_WPS_FILTER) { - printk(KERN_ERR "ZD_PARAM_WPS_FILTER : "); - - if (arg) { - /* mCounterMeasureState=1; */ - macp->forwardMgmt = 1; - printk(KERN_ERR "enable\n"); - } else { - /* mCounterMeasureState=0; */ - macp->forwardMgmt = 0; - printk(KERN_ERR "disable\n"); - } - } - } - err = 0; - break; - case ZD_IOCTL_GETWPAIE: { - struct ieee80211req_wpaie req_wpaie; - u16_t apId, i, j; - - /* Get the AP Id */ - apId = zfLnxGetVapId(dev); - - if (apId == 0xffff) - apId = 0; - else - apId = apId + 1; - - if (copy_from_user(&req_wpaie, ifr->ifr_data, - sizeof(struct ieee80211req_wpaie))) { - printk(KERN_ERR "usbdrv : copy_from_user error\n"); - return -EFAULT; - } - - 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] != - req_wpaie.wpa_macaddr[j]) - break; - } - if (j == 6) - break; - } - - if (i < ZM_OAL_MAX_STA_SUPPORT) { - /* printk("ZD_IOCTL_GETWPAIE - sta index = % d\n", i); */ - memcpy(req_wpaie.wpa_ie, macp->stawpaie[i].wpa_ie, - IEEE80211_MAX_IE_SIZE); - } - - if (copy_to_user(wrq->u.data.pointer, &req_wpaie, - sizeof(struct ieee80211req_wpaie))) { - return -EFAULT; - } - } - - err = 0; - break; - #ifdef ZM_ENABLE_CENC - case ZM_IOCTL_CENC: - if (copy_from_user(&macp->zd_wpa_req, ifr->ifr_data, - sizeof(struct athr_wlan_param))) { - printk(KERN_ERR "usbdrv : copy_from_user error\n"); - return -EFAULT; - } - - usbdrv_cenc_ioctl(dev, - (struct zydas_cenc_param *)&macp->zd_wpa_req); - err = 0; - break; - #endif /* ZM_ENABLE_CENC */ - default: - err = -EOPNOTSUPP; - break; - } - - return err; -} diff --git a/drivers/staging/otus/oal_dt.h b/drivers/staging/otus/oal_dt.h deleted file mode 100644 index fb6d11a99cc5..000000000000 --- a/drivers/staging/otus/oal_dt.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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 - -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 */ diff --git a/drivers/staging/otus/oal_marc.h b/drivers/staging/otus/oal_marc.h deleted file mode 100644 index e7a9081b1a7c..000000000000 --- a/drivers/staging/otus/oal_marc.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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(KERN_DEBUG "%s:%s\n", __func__, msg); -#define zm_debug_msg1(msg, val) printk(KERN_DEBUG "%s:%s%ld\n", __func__, \ - msg, (u32_t)val); -#define zm_debug_msg2(msg, val) printk(KERN_DEBUG "%s:%s%lxh\n", __func__, \ - msg, (u32_t)val); -#define zm_debug_msg_s(msg, val) printk(KERN_DEBUG "%s:%s%s\n", __func__, \ - msg, val); -#define zm_debug_msg_p(msg, val1, val2) do { \ - printk(KERN_DEBUG "%s:%s%01ld.%02ld\n", \ - __func__, \ - msg, (val1/val2), (((val1*100)/val2)%100)); - } while (0) -#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(KERN_ERR "Atheors Assertion failed! %s, %s, %s,line=%d\n",\ - #expr, __FILE__, __func__, __LINE__); \ - } - -#define DbgPrint printk - -#endif /* #ifndef _OAL_MARC_H */ diff --git a/drivers/staging/otus/usbdrv.c b/drivers/staging/otus/usbdrv.c deleted file mode 100644 index 9a5c4152aac4..000000000000 --- a/drivers/staging/otus/usbdrv.c +++ /dev/null @@ -1,1143 +0,0 @@ -/* - * 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.c */ -/* */ -/* Abstract */ -/* This module contains network interface up/down related functions.*/ -/* */ -/* NOTES */ -/* Platform dependent. */ -/* */ -/************************************************************************/ - -/* src/usbdrv.c */ - -#define ZM_PIBSS_MODE 0 -#define ZM_AP_MODE 0 -#define ZM_CHANNEL 11 -#define ZM_WEP_MOME 0 -#define ZM_SHARE_AUTH 0 -#define ZM_DISABLE_XMIT 0 - -#include "usbdrv.h" -#include "oal_dt.h" -#include "80211core/pub_zfi.h" - -#include "linux/netlink.h" -#include "linux/rtnetlink.h" -#include "linux/slab.h" - -#include - -#ifdef ZM_HOSTAPD_SUPPORT -#include "athr_common.h" -#endif - -extern void zfDumpDescriptor(zdev_t* dev, u16_t type); -//extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr); - -// ISR handler -irqreturn_t usbdrv_intr(int, void *, struct pt_regs *); - -// Network Device interface related function -int usbdrv_open(struct net_device *); -int usbdrv_close(struct net_device *); -int usbdrv_change_mtu(struct net_device *, int); -int usbdrv_set_mac(struct net_device *, void *); -int usbdrv_xmit_frame(struct sk_buff *, struct net_device *); -void usbdrv_set_multi(struct net_device *); -struct net_device_stats *usbdrv_get_stats(struct net_device *); - -//wireless extension helper functions -int usbdrv_ioctl_setessid(struct net_device *dev, struct iw_point *erq); -int usbdrv_ioctl_getessid(struct net_device *dev, struct iw_point *erq); -int usbdrv_ioctl_setrts(struct net_device *dev, struct iw_param *rrq); -/* Wireless Extension Handler functions */ -int usbdrvwext_giwmode(struct net_device *dev, struct iw_request_info* info, - __u32 *mode, char *extra); -int zfLnxPrivateIoctl(struct usbdrv_private *macp, struct zdap_ioctl *zdreq); - -void zfLnx10msTimer(struct net_device* dev); -int zfUnregisterWdsDev(struct net_device* parentDev, u16_t wdsId); -int zfRegisterWdsDev(struct net_device* parentDev, u16_t wdsId); -int zfWdsOpen(struct net_device *dev); -int zfWdsClose(struct net_device *dev); -int zfLnxVapOpen(struct net_device *dev); -int zfLnxVapClose(struct net_device *dev); -int zfLnxVapXmitFrame(struct sk_buff *skb, struct net_device *dev); -int zfLnxRegisterVapDev(struct net_device* parentDev, u16_t vapId); -int usbdrv_wpa_ioctl(struct net_device *dev, struct athr_wlan_param *zdparm); -extern u16_t zfLnxGetVapId(zdev_t* dev); -extern u16_t zfLnxCheckTxBufferCnt(zdev_t *dev); -extern UsbTxQ_t *zfLnxGetUsbTxBuffer(zdev_t *dev); - -extern u16_t zfLnxAuthNotify(zdev_t* dev, u16_t* macAddr); -extern u16_t zfLnxAsocNotify(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port); -extern u16_t zfLnxDisAsocNotify(zdev_t* dev, u8_t* macAddr, u16_t port); -extern u16_t zfLnxApConnectNotify(zdev_t* dev, u8_t* macAddr, u16_t port); -extern void zfLnxConnectNotify(zdev_t* dev, u16_t status, u16_t* bssid); -extern void zfLnxScanNotify(zdev_t* dev, struct zsScanResult* result); -extern void zfLnxStatisticsNotify(zdev_t* dev, struct zsStastics* result); -extern void zfLnxMicFailureNotify(zdev_t* dev, u16_t* addr, u16_t status); -extern void zfLnxApMicFailureNotify(zdev_t* dev, u8_t* addr, zbuf_t* buf); -extern void zfLnxIbssPartnerNotify(zdev_t* dev, u16_t status, struct zsPartnerNotifyEvent *event); -extern void zfLnxMacAddressNotify(zdev_t* dev, u8_t* addr); -extern void zfLnxSendCompleteIndication(zdev_t* dev, zbuf_t* buf); -extern void zfLnxRecvEth(zdev_t* dev, zbuf_t* buf, u16_t port); -extern void zfLnxRestoreBufData(zdev_t* dev, zbuf_t* buf); -#ifdef ZM_ENABLE_CENC -extern u16_t zfLnxCencAsocNotify(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port); -#endif //ZM_ENABLE_CENC -extern void zfLnxWatchDogNotify(zdev_t* dev); -extern void zfLnxRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo); -extern u8_t zfLnxCreateThread(zdev_t *dev); - -/****************************************************************************** -* P U B L I C D A T A -******************************************************************************* -*/ - -/* Definition of Wireless Extension */ - -/* wireless extension helper functions */ -extern int usbdrv_ioctl_setessid(struct net_device *dev, struct iw_point *erq); -extern int usbdrv_ioctl_setrts(struct net_device *dev, struct iw_param *rrq); -/* Wireless Extension Handler functions */ -extern int usbdrvwext_giwname(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrq, char *extra); -extern int usbdrvwext_siwfreq(struct net_device *dev, struct iw_request_info *info, - struct iw_freq *freq, char *extra); -extern int usbdrvwext_giwfreq(struct net_device *dev, struct iw_request_info *info, - struct iw_freq *freq, char *extra); -extern int usbdrvwext_siwmode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrq, char *extra); -extern int usbdrvwext_giwmode(struct net_device *dev, struct iw_request_info *info, - __u32 *mode, char *extra); -extern int usbdrvwext_siwsens(struct net_device *dev, struct iw_request_info *info, - struct iw_param *sens, char *extra); -extern int usbdrvwext_giwsens(struct net_device *dev, struct iw_request_info *info, - struct iw_param *sens, char *extra); -extern int usbdrvwext_giwrange(struct net_device *dev, struct iw_request_info *info, - struct iw_point *data, char *extra); -extern int usbdrvwext_siwap(struct net_device *dev, struct iw_request_info *info, - struct sockaddr *MacAddr, char *extra); -extern int usbdrvwext_giwap(struct net_device *dev, struct iw_request_info *info, - struct sockaddr *MacAddr, char *extra); -extern int usbdrvwext_iwaplist(struct net_device *dev, struct iw_request_info *info, - struct iw_point *data, char *extra); -extern int usbdrvwext_siwscan(struct net_device *dev, struct iw_request_info *info, - struct iw_point *data, char *extra); -extern int usbdrvwext_giwscan(struct net_device *dev, struct iw_request_info *info, - struct iw_point *data, char *extra); -extern int usbdrvwext_siwessid(struct net_device *dev, struct iw_request_info *info, - struct iw_point *essid, char *extra); -extern int usbdrvwext_giwessid(struct net_device *dev, struct iw_request_info *info, - struct iw_point *essid, char *extra); -extern int usbdrvwext_siwnickn(struct net_device *dev, struct iw_request_info *info, - struct iw_point *data, char *nickname); -extern int usbdrvwext_giwnickn(struct net_device *dev, struct iw_request_info *info, - struct iw_point *data, char *nickname); -extern int usbdrvwext_siwrate(struct net_device *dev, struct iw_request_info *info, - struct iw_param *frq, char *extra); -extern int usbdrvwext_giwrate(struct net_device *dev, struct iw_request_info *info, - struct iw_param *frq, char *extra); -extern int usbdrvwext_siwrts(struct net_device *dev, struct iw_request_info *info, - struct iw_param *rts, char *extra); -extern int usbdrvwext_giwrts(struct net_device *dev, struct iw_request_info *info, - struct iw_param *rts, char *extra); -extern int usbdrvwext_siwfrag(struct net_device *dev, struct iw_request_info *info, - struct iw_param *frag, char *extra); -extern int usbdrvwext_giwfrag(struct net_device *dev, struct iw_request_info *info, - struct iw_param *frag, char *extra); -extern int usbdrvwext_siwtxpow(struct net_device *dev, struct iw_request_info *info, - struct iw_param *rrq, char *extra); -extern int usbdrvwext_giwtxpow(struct net_device *dev, struct iw_request_info *info, - struct iw_param *rrq, char *extra); -extern int usbdrvwext_siwretry(struct net_device *dev, struct iw_request_info *info, - struct iw_param *rrq, char *extra); -extern int usbdrvwext_giwretry(struct net_device *dev, struct iw_request_info *info, - struct iw_param *rrq, char *extra); -extern int usbdrvwext_siwencode(struct net_device *dev, struct iw_request_info *info, - struct iw_point *erq, char *key); -extern int usbdrvwext_giwencode(struct net_device *dev, struct iw_request_info *info, - struct iw_point *erq, char *key); -extern int usbdrvwext_siwpower(struct net_device *dev, struct iw_request_info *info, - struct iw_param *frq, char *extra); -extern int usbdrvwext_giwpower(struct net_device *dev, struct iw_request_info *info, - struct iw_param *frq, char *extra); -extern int usbdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); -/* - * Structures to export the Wireless Handlers - */ - -struct iw_priv_args usbdrv_private_args[] = { -// { SIOCIWFIRSTPRIV + 0x0, 0, 0, "list_bss" }, -// { SIOCIWFIRSTPRIV + 0x1, 0, 0, "card_reset" }, - { SIOCIWFIRSTPRIV + 0x2, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_auth" }, /* 0 - open, 1 - shared key */ - { SIOCIWFIRSTPRIV + 0x3, 0, IW_PRIV_TYPE_CHAR | 12, "get_auth" }, -// { SIOCIWFIRSTPRIV + 0x4, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble" }, /* 0 - long, 1 - short */ -// { SIOCIWFIRSTPRIV + 0x5, 0, IW_PRIV_TYPE_CHAR | 6, "get_preamble" }, -// { SIOCIWFIRSTPRIV + 0x6, 0, 0, "cnt" }, -// { SIOCIWFIRSTPRIV + 0x7, 0, 0, "regs" }, -// { SIOCIWFIRSTPRIV + 0x8, 0, 0, "probe" }, -// { SIOCIWFIRSTPRIV + 0x9, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "dbg_flag" }, -// { SIOCIWFIRSTPRIV + 0xA, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "connect" }, -// { SIOCIWFIRSTPRIV + 0xB, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_mac_mode" }, -// { SIOCIWFIRSTPRIV + 0xC, 0, IW_PRIV_TYPE_CHAR | 12, "get_mac_mode" }, -}; - -static iw_handler usbdrvwext_handler[] = { - (iw_handler) NULL, /* SIOCSIWCOMMIT */ - (iw_handler) usbdrvwext_giwname, /* SIOCGIWNAME */ - (iw_handler) NULL, /* SIOCSIWNWID */ - (iw_handler) NULL, /* SIOCGIWNWID */ - (iw_handler) usbdrvwext_siwfreq, /* SIOCSIWFREQ */ - (iw_handler) usbdrvwext_giwfreq, /* SIOCGIWFREQ */ - (iw_handler) usbdrvwext_siwmode, /* SIOCSIWMODE */ - (iw_handler) usbdrvwext_giwmode, /* SIOCGIWMODE */ - (iw_handler) usbdrvwext_siwsens, /* SIOCSIWSENS */ - (iw_handler) usbdrvwext_giwsens, /* SIOCGIWSENS */ - (iw_handler) NULL, /* not used */ /* SIOCSIWRANGE */ - (iw_handler) usbdrvwext_giwrange, /* SIOCGIWRANGE */ - (iw_handler) NULL, /* not used */ /* SIOCSIWPRIV */ - (iw_handler) NULL, /* kernel code */ /* SIOCGIWPRIV */ - (iw_handler) NULL, /* not used */ /* SIOCSIWSTATS */ - (iw_handler) NULL, /* kernel code */ /* SIOCGIWSTATS */ - (iw_handler) NULL, /* SIOCSIWSPY */ - (iw_handler) NULL, /* SIOCGIWSPY */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) usbdrvwext_siwap, /* SIOCSIWAP */ - (iw_handler) usbdrvwext_giwap, /* SIOCGIWAP */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) usbdrvwext_iwaplist, /* SIOCGIWAPLIST */ - (iw_handler) usbdrvwext_siwscan, /* SIOCSIWSCAN */ - (iw_handler) usbdrvwext_giwscan, /* SIOCGIWSCAN */ - (iw_handler) usbdrvwext_siwessid, /* SIOCSIWESSID */ - (iw_handler) usbdrvwext_giwessid, /* SIOCGIWESSID */ - - (iw_handler) usbdrvwext_siwnickn, /* SIOCSIWNICKN */ - (iw_handler) usbdrvwext_giwnickn, /* SIOCGIWNICKN */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) NULL, /* -- hole -- */ - (iw_handler) usbdrvwext_siwrate, /* SIOCSIWRATE */ - (iw_handler) usbdrvwext_giwrate, /* SIOCGIWRATE */ - (iw_handler) usbdrvwext_siwrts, /* SIOCSIWRTS */ - (iw_handler) usbdrvwext_giwrts, /* SIOCGIWRTS */ - (iw_handler) usbdrvwext_siwfrag, /* SIOCSIWFRAG */ - (iw_handler) usbdrvwext_giwfrag, /* SIOCGIWFRAG */ - (iw_handler) usbdrvwext_siwtxpow, /* SIOCSIWTXPOW */ - (iw_handler) usbdrvwext_giwtxpow, /* SIOCGIWTXPOW */ - (iw_handler) usbdrvwext_siwretry, /* SIOCSIWRETRY */ - (iw_handler) usbdrvwext_giwretry, /* SIOCGIWRETRY */ - (iw_handler) usbdrvwext_siwencode, /* SIOCSIWENCODE */ - (iw_handler) usbdrvwext_giwencode, /* SIOCGIWENCODE */ - (iw_handler) usbdrvwext_siwpower, /* SIOCSIWPOWER */ - (iw_handler) usbdrvwext_giwpower, /* SIOCGIWPOWER */ -}; - -static const iw_handler usbdrv_private_handler[] = -{ - //(iw_handler) usbdrvwext_setparam, /* SIOCWFIRSTPRIV+0 */ - //(iw_handler) usbdrvwext_getparam, /* SIOCWFIRSTPRIV+1 */ - //(iw_handler) usbdrvwext_setkey, /* SIOCWFIRSTPRIV+2 */ - //(iw_handler) usbdrvwext_setwmmparams, /* SIOCWFIRSTPRIV+3 */ - //(iw_handler) usbdrvwext_delkey, /* SIOCWFIRSTPRIV+4 */ - //(iw_handler) usbdrvwext_getwmmparams, /* SIOCWFIRSTPRIV+5 */ - //(iw_handler) usbdrvwext_setmlme, /* SIOCWFIRSTPRIV+6 */ - //(iw_handler) usbdrvwext_getchaninfo, /* SIOCWFIRSTPRIV+7 */ - //(iw_handler) usbdrvwext_setoptie, /* SIOCWFIRSTPRIV+8 */ - //(iw_handler) usbdrvwext_getoptie, /* SIOCWFIRSTPRIV+9 */ - //(iw_handler) usbdrvwext_addmac, /* SIOCWFIRSTPRIV+10 */ - //(iw_handler) usbdrvwext_getscanresults, /* SIOCWFIRSTPRIV+11 */ - //(iw_handler) usbdrvwext_delmac, /* SIOCWFIRSTPRIV+12 */ - //(iw_handler) usbdrvwext_getchanlist, /* SIOCWFIRSTPRIV+13 */ - //(iw_handler) usbdrvwext_setchanlist, /* SIOCWFIRSTPRIV+14 */ - //(iw_handler) NULL, /* SIOCWFIRSTPRIV+15 */ - //(iw_handler) usbdrvwext_chanswitch, /* SIOCWFIRSTPRIV+16 */ - //(iw_handler) usbdrvwext_setmode, /* SIOCWFIRSTPRIV+17 */ - //(iw_handler) usbdrvwext_getmode, /* SIOCWFIRSTPRIV+18 */ - NULL, /* SIOCIWFIRSTPRIV */ -}; - -static struct iw_handler_def p80211wext_handler_def = { - .num_standard = sizeof(usbdrvwext_handler) / sizeof(iw_handler), - .num_private = sizeof(usbdrv_private_handler)/sizeof(iw_handler), - .num_private_args = sizeof(usbdrv_private_args)/sizeof(struct iw_priv_args), - .standard = usbdrvwext_handler, - .private = (iw_handler *) usbdrv_private_handler, - .private_args = (struct iw_priv_args *) usbdrv_private_args -}; - -/* WDS */ -/* struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER]; */ -/* void zfInitWdsStruct(void); */ - -/* VAP */ -struct zsVapStruct vap[ZM_VAP_PORT_NUMBER]; -void zfLnxInitVapStruct(void); - - -/** - * usbdrv_intr - interrupt handler - * @irq: the IRQ number - * @dev_inst: the net_device struct - * @regs: registers (unused) - * - * This routine is the ISR for the usbdrv board. It services - * the RX & TX queues & starts the RU if it has stopped due - * to no resources. - */ -irqreturn_t usbdrv_intr(int irq, void *dev_inst, struct pt_regs *regs) -{ - struct net_device *dev; - struct usbdrv_private *macp; - - dev = dev_inst; - macp = dev->ml_priv; - - - /* Read register error, card may be unpluged */ - if (0)//(intr_status == -1) - return IRQ_NONE; - - /* the device is closed, don't continue or else bad things may happen. */ - if (!netif_running(dev)) - return IRQ_NONE; - - if (macp->driver_isolated) - return IRQ_NONE; - -#if (WLAN_HOSTIF == WLAN_PCI) - //zfiIsrPci(dev); -#endif - - return IRQ_HANDLED; -} - -int usbdrv_open(struct net_device *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - int rc = 0; - u16_t size; - void* mem; - //unsigned char addr[6]; - struct zsCbFuncTbl cbFuncTbl; - - printk("Enter open()\n"); - -/* - * #ifndef CONFIG_SMP - * read_lock(&(macp->isolate_lock)); - * #endif - */ - if (macp->driver_isolated) { - rc = -EBUSY; - goto exit; - } - - size = zfiGlobalDataSize(dev); - mem = kmalloc(size, GFP_KERNEL); - if (mem == NULL) - { - rc = -EBUSY; - goto exit; - } - macp->wd = mem; - - memset(&cbFuncTbl, 0, sizeof(struct zsCbFuncTbl)); - cbFuncTbl.zfcbAuthNotify = zfLnxAuthNotify; - cbFuncTbl.zfcbAuthNotify = zfLnxAuthNotify; - cbFuncTbl.zfcbAsocNotify = zfLnxAsocNotify; - cbFuncTbl.zfcbDisAsocNotify = zfLnxDisAsocNotify; - cbFuncTbl.zfcbApConnectNotify = zfLnxApConnectNotify; - cbFuncTbl.zfcbConnectNotify = zfLnxConnectNotify; - cbFuncTbl.zfcbScanNotify = zfLnxScanNotify; - cbFuncTbl.zfcbMicFailureNotify = zfLnxMicFailureNotify; - cbFuncTbl.zfcbApMicFailureNotify = zfLnxApMicFailureNotify; - cbFuncTbl.zfcbIbssPartnerNotify = zfLnxIbssPartnerNotify; - cbFuncTbl.zfcbMacAddressNotify = zfLnxMacAddressNotify; - cbFuncTbl.zfcbSendCompleteIndication = zfLnxSendCompleteIndication; - cbFuncTbl.zfcbRecvEth = zfLnxRecvEth; - cbFuncTbl.zfcbRecv80211 = zfLnxRecv80211; - cbFuncTbl.zfcbRestoreBufData = zfLnxRestoreBufData; -#ifdef ZM_ENABLE_CENC - cbFuncTbl.zfcbCencAsocNotify = zfLnxCencAsocNotify; -#endif //ZM_ENABLE_CENC - cbFuncTbl.zfcbHwWatchDogNotify = zfLnxWatchDogNotify; - zfiWlanOpen(dev, &cbFuncTbl); - -#if 0 - { - //u16_t mac[3] = {0x1300, 0xb6d4, 0x5aaf}; - u16_t mac[3] = {0x8000, 0x00ab, 0x0000}; - //zfiWlanSetMacAddress(dev, mac); - } - /* MAC address */ - zfiWlanQueryMacAddress(dev, 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]; -#endif - /* zfwMacAddressNotify() will be called to setup dev->dev_addr[] */ - - zfLnxCreateThread(dev); - - mod_timer(&(macp->hbTimer10ms), jiffies + (1*HZ)/100); /* 10 ms */ - - netif_carrier_on(dev); - - netif_start_queue(dev); - -#if ZM_AP_MODE == 1 - zfiWlanSetWlanMode(dev, ZM_MODE_AP); - zfiWlanSetBasicRate(dev, 0xf, 0, 0); - zfiWlanSetSSID(dev, "OTUS_CWY", 8); - zfiWlanSetDtimCount(dev, 3); - - #if ZM_WEP_MOME == 1 - { - u8_t key[16] = {0x12, 0x34, 0x56, 0x78, 0x90}; - struct zsKeyInfo keyInfo; - - keyInfo.keyLength = 5; - keyInfo.keyIndex = 0; - keyInfo.flag = 0; - keyInfo.key = key; - zfiWlanSetKey(dev, keyInfo); - - zfiWlanSetEncryMode(dev, ZM_WEP64); - } - - #if ZM_SHARE_AUTH == 1 - zfiWlanSetAuthenticationMode(dev, 1); - #endif /* #if ZM_SHARE_AUTH == 1 */ - #endif /* #if ZM_WEP_MOME == 1 */ - -#elif ZM_PIBSS_MODE == 1 - zfiWlanSetWlanMode(dev, ZM_MODE_PSEUDO); -#else - zfiWlanSetWlanMode(dev, ZM_MODE_INFRASTRUCTURE); -#endif - /* zfiWlanSetChannel(dev, ZM_CHANNEL, FALSE); */ - zfiWlanSetFrequency(dev, 2462000, FALSE); - zfiWlanSetRtsThreshold(dev, 32767); - zfiWlanSetFragThreshold(dev, 0); - - zfiWlanEnable(dev); - -#ifdef ZM_ENABLE_CENC - macp->netlink_sk = netlink_kernel_create(NETLINK_USERSOCK, 1, NULL, THIS_MODULE); - - if (macp->netlink_sk == NULL) - { - printk(KERN_ERR "Can't create NETLINK socket\n"); - } -#endif - - macp->DeviceOpened = 1; -exit: -//#ifndef CONFIG_SMP -// read_unlock(&(macp->isolate_lock)); -//#endif - //zfRegisterWdsDev(dev, 0); - //zfLnxRegisterVapDev(dev, 0); - - return rc; -} - - - - -/** - * usbdrv_get_stats - get driver statistics - * @dev: adapter's net_device struct - * - * This routine is called when the OS wants the adapter's stats returned. - * It returns the address of the net_device_stats stucture for the device. - * If the statistics are currently being updated, then they might be incorrect - * for a short while. However, since this cannot actually cause damage, no - * locking is used. - */ - -struct net_device_stats * usbdrv_get_stats(struct net_device *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - - macp->drv_stats.net_stats.tx_errors = - macp->drv_stats.net_stats.tx_carrier_errors + - macp->drv_stats.net_stats.tx_aborted_errors; - - macp->drv_stats.net_stats.rx_errors = - macp->drv_stats.net_stats.rx_crc_errors + - macp->drv_stats.net_stats.rx_frame_errors + - macp->drv_stats.net_stats.rx_length_errors; - - - return &(macp->drv_stats.net_stats); -} - - -/** - * usbdrv_set_mac - set the MAC address - * @dev: adapter's net_device struct - * @addr: the new address - * - * This routine sets the ethernet address of the board - * Returns: - * 0 - if successful - * -1 - otherwise - */ - -int usbdrv_set_mac(struct net_device *dev, void *addr) -{ - struct usbdrv_private *macp; - int rc = -1; - - macp = dev->ml_priv; - read_lock(&(macp->isolate_lock)); - - if (macp->driver_isolated) { - goto exit; - } - - rc = 0; - - -exit: - read_unlock(&(macp->isolate_lock)); - return rc; -} - - - -void -usbdrv_isolate_driver(struct usbdrv_private *macp) -{ -#ifndef CONFIG_SMP - write_lock_irq(&(macp->isolate_lock)); -#endif - macp->driver_isolated = TRUE; -#ifndef CONFIG_SMP - write_unlock_irq(&(macp->isolate_lock)); -#endif - - if (netif_running(macp->device)) - { - netif_carrier_off(macp->device); - netif_stop_queue(macp->device); - } -} - -#define VLAN_SIZE 4 -int usbdrv_change_mtu(struct net_device *dev, int new_mtu) -{ - if ((new_mtu < 68) || (new_mtu > (ETH_DATA_LEN + VLAN_SIZE))) - return -EINVAL; - - dev->mtu = new_mtu; - return 0; -} - -void zfLnxUnlinkAllUrbs(struct usbdrv_private *macp); - -int usbdrv_close(struct net_device *dev) -{ -extern void zfHpLedCtrl(struct net_device *dev, u16_t ledId, u8_t mode); - - struct usbdrv_private *macp = dev->ml_priv; - - printk(KERN_DEBUG "usbdrv_close\n"); - - netif_carrier_off(macp->device); - - del_timer_sync(&macp->hbTimer10ms); - - printk(KERN_DEBUG "usbdrv_netif_carrier_off\n"); - - usbdrv_isolate_driver(macp); - - printk(KERN_DEBUG "usbdrv_isolate_driver\n"); - - netif_carrier_off(macp->device); -#ifdef ZM_ENABLE_CENC - /* CENC */ - if (macp->netlink_sk != NULL) - { - // sock_release(macp->netlink_sk); - printk(KERN_ERR "usbdrv close netlink socket\n"); - } -#endif //ZM_ENABLE_CENC -#if (WLAN_HOSTIF == WLAN_PCI) - //free_irq(dev->irq, dev); -#endif - - /* Turn off LED */ - zfHpLedCtrl(dev, 0, 0); - zfHpLedCtrl(dev, 1, 0); - - /* Delay for a while */ - mdelay(10); - - /* clear WPA/RSN IE */ - macp->supIe[1] = 0; - - /* set the isolate flag to false, so usbdrv_open can be called */ - macp->driver_isolated = FALSE; - - zfiWlanClose(dev); - kfree(macp->wd); - - zfLnxUnlinkAllUrbs(macp); - - return 0; -} - - - - -int usbdrv_xmit_frame(struct sk_buff *skb, struct net_device *dev) -{ - int notify_stop = FALSE; - struct usbdrv_private *macp = dev->ml_priv; - -#if 0 - /* Test code */ - { - struct sk_buff* s; - - s = skb_copy_expand(skb, 8, 0, GFP_ATOMIC); - skb_push(s, 8); - s->data[0] = 'z'; - s->data[1] = 'y'; - s->data[2] = 'd'; - s->data[3] = 'a'; - s->data[4] = 's'; - printk("len1=%d, len2=%d", skb->len, s->len); - netlink_broadcast(rtnl, s, 0, RTMGRP_LINK, GFP_ATOMIC); - } -#endif - -#if ZM_DISABLE_XMIT - dev_kfree_skb_irq(skb); -#else - zfiTxSendEth(dev, skb, 0); -#endif - macp->drv_stats.net_stats.tx_bytes += skb->len; - macp->drv_stats.net_stats.tx_packets++; - - //dev_kfree_skb_irq(skb); - - if (notify_stop) { - netif_carrier_off(dev); - netif_stop_queue(dev); - } - - return NETDEV_TX_OK; -} - - - - -void usbdrv_set_multi(struct net_device *dev) -{ - - - if (!(dev->flags & IFF_UP)) - return; - - return; - -} - - - -/** - * usbdrv_clear_structs - free resources - - * @dev: adapter's net_device struct - * - * Free all device specific structs, unmap i/o address, etc. - */ -void usbdrv_clear_structs(struct net_device *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - - -#if (WLAN_HOSTIF == WLAN_PCI) - iounmap(macp->regp); - - pci_release_regions(macp->pdev); - pci_disable_device(macp->pdev); - pci_set_drvdata(macp->pdev, NULL); -#endif - - kfree(macp); - - free_netdev(dev); - -} - -void usbdrv_remove1(struct pci_dev *pcid) -{ - struct net_device *dev; - struct usbdrv_private *macp; - - dev = (struct net_device *)pci_get_drvdata(pcid); - if (!dev) - return; - - macp = dev->ml_priv; - unregister_netdev(dev); - - usbdrv_clear_structs(dev); -} - - -void zfLnx10msTimer(struct net_device* dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - - mod_timer(&(macp->hbTimer10ms), jiffies + (1*HZ)/100); //10 ms - zfiHeartBeat(dev); - return; -} - -void zfLnxInitVapStruct(void) -{ - u16_t i; - - for (i = 0; i < ZM_VAP_PORT_NUMBER; i++) - { - vap[i].dev = NULL; - vap[i].openFlag = 0; - } -} - -int zfLnxVapOpen(struct net_device *dev) -{ - u16_t vapId; - - vapId = zfLnxGetVapId(dev); - - if (vap[vapId].openFlag == 0) - { - vap[vapId].openFlag = 1; - printk("zfLnxVapOpen : device name=%s, vap ID=%d\n", dev->name, vapId); - zfiWlanSetSSID(dev, "vap1", 4); - zfiWlanEnable(dev); - netif_start_queue(dev); - } - else - { - printk("VAP opened error : vap ID=%d\n", vapId); - } - return 0; -} - -int zfLnxVapClose(struct net_device *dev) -{ - u16_t vapId; - - vapId = zfLnxGetVapId(dev); - - if (vapId != 0xffff) - { - if (vap[vapId].openFlag == 1) - { - printk("zfLnxVapClose: device name=%s, vap ID=%d\n", dev->name, vapId); - - netif_stop_queue(dev); - vap[vapId].openFlag = 0; - } - else - { - printk("VAP port was not opened : vap ID=%d\n", vapId); - } - } - return 0; -} - -int zfLnxVapXmitFrame(struct sk_buff *skb, struct net_device *dev) -{ - int notify_stop = FALSE; - struct usbdrv_private *macp = dev->ml_priv; - u16_t vapId; - - vapId = zfLnxGetVapId(dev); - //printk("zfLnxVapXmitFrame: vap ID=%d\n", vapId); - //printk("zfLnxVapXmitFrame(), skb=%lxh\n", (u32_t)skb); - - if (vapId >= ZM_VAP_PORT_NUMBER) - { - dev_kfree_skb_irq(skb); - return NETDEV_TX_OK; - } -#if 1 - if (vap[vapId].openFlag == 0) - { - dev_kfree_skb_irq(skb); - return NETDEV_TX_OK; - } -#endif - - - zfiTxSendEth(dev, skb, 0x1); - - macp->drv_stats.net_stats.tx_bytes += skb->len; - macp->drv_stats.net_stats.tx_packets++; - - //dev_kfree_skb_irq(skb); - - if (notify_stop) { - netif_carrier_off(dev); - netif_stop_queue(dev); - } - - return NETDEV_TX_OK; -} - -static const struct net_device_ops vap_netdev_ops = { - .ndo_open = zfLnxVapOpen, - .ndo_stop = zfLnxVapClose, - .ndo_start_xmit = zfLnxVapXmitFrame, - .ndo_get_stats = usbdrv_get_stats, - .ndo_change_mtu = usbdrv_change_mtu, - .ndo_validate_addr = eth_validate_addr, - .ndo_set_mac_address = eth_mac_addr, -#ifdef ZM_HOSTAPD_SUPPORT - .ndo_do_ioctl = usbdrv_ioctl, -#else - .ndo_do_ioctl = NULL, -#endif -}; - -int zfLnxRegisterVapDev(struct net_device* parentDev, u16_t vapId) -{ - /* Allocate net device structure */ - vap[vapId].dev = alloc_etherdev(0); - printk("Register vap dev=%p\n", vap[vapId].dev); - - if(vap[vapId].dev == NULL) { - printk("alloc_etherdev fail\n"); - return -ENOMEM; - } - - /* Setup the default settings */ - ether_setup(vap[vapId].dev); - - /* MAC address */ - memcpy(vap[vapId].dev->dev_addr, parentDev->dev_addr, ETH_ALEN); - - vap[vapId].dev->irq = parentDev->irq; - vap[vapId].dev->base_addr = parentDev->base_addr; - vap[vapId].dev->mem_start = parentDev->mem_start; - vap[vapId].dev->mem_end = parentDev->mem_end; - vap[vapId].dev->ml_priv = parentDev->ml_priv; - - //dev->hard_start_xmit = &zd1212_wds_xmit_frame; - vap[vapId].dev->netdev_ops = &vap_netdev_ops; - vap[vapId].dev->destructor = free_netdev; - - vap[vapId].dev->tx_queue_len = 0; - - vap[vapId].dev->dev_addr[0] = parentDev->dev_addr[0]; - vap[vapId].dev->dev_addr[1] = parentDev->dev_addr[1]; - vap[vapId].dev->dev_addr[2] = parentDev->dev_addr[2]; - vap[vapId].dev->dev_addr[3] = parentDev->dev_addr[3]; - vap[vapId].dev->dev_addr[4] = parentDev->dev_addr[4]; - vap[vapId].dev->dev_addr[5] = parentDev->dev_addr[5] + (vapId+1); - - /* Stop the network queue first */ - netif_stop_queue(vap[vapId].dev); - - sprintf(vap[vapId].dev->name, "vap%d", vapId); - printk("Register VAP dev success : %s\n", vap[vapId].dev->name); - - if(register_netdevice(vap[vapId].dev) != 0) { - printk("register VAP device fail\n"); - vap[vapId].dev = NULL; - return -EINVAL; - } - - return 0; -} - -int zfLnxUnregisterVapDev(struct net_device* parentDev, u16_t vapId) -{ - int ret = 0; - - printk("Unregister VAP dev : %s\n", vap[vapId].dev->name); - - if(vap[vapId].dev != NULL) { - printk("Unregister vap dev=%p\n", vap[vapId].dev); - // - //unregister_netdevice(wds[wdsId].dev); - unregister_netdev(vap[vapId].dev); - - printk("VAP unregister_netdevice\n"); - vap[vapId].dev = NULL; - } - else { - printk("unregister VAP device: %d fail\n", vapId); - ret = -EINVAL; - } - - return ret; -} - - - -# define SUBMIT_URB(u,f) usb_submit_urb(u,f) -# define USB_ALLOC_URB(u,f) usb_alloc_urb(u,f) - -//extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr); - -extern int usbdrv_open(struct net_device *dev); -extern int usbdrv_close(struct net_device *dev); -extern int usbdrv_xmit_frame(struct sk_buff *skb, struct net_device *dev); -extern int usbdrv_xmit_frame(struct sk_buff *skb, struct net_device *dev); -extern int usbdrv_change_mtu(struct net_device *dev, int new_mtu); -extern void usbdrv_set_multi(struct net_device *dev); -extern int usbdrv_set_mac(struct net_device *dev, void *addr); -extern struct net_device_stats * usbdrv_get_stats(struct net_device *dev); -extern int usbdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); -extern UsbTxQ_t *zfLnxGetUsbTxBuffer(struct net_device *dev); - -int zfLnxAllocAllUrbs(struct usbdrv_private *macp) -{ - struct usb_interface *interface = macp->interface; - struct usb_host_interface *iface_desc = &interface->altsetting[0]; - - struct usb_endpoint_descriptor *endpoint; - int i; - - /* descriptor matches, let's find the endpoints needed */ - /* check out the endpoints */ - for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) - { - endpoint = &iface_desc->endpoint[i].desc; - if (usb_endpoint_is_bulk_in(endpoint)) - { - /* we found a bulk in endpoint */ - printk(KERN_ERR "bulk in: wMaxPacketSize = %x\n", le16_to_cpu(endpoint->wMaxPacketSize)); - } - - if (usb_endpoint_is_bulk_out(endpoint)) - { - /* we found a bulk out endpoint */ - printk(KERN_ERR "bulk out: wMaxPacketSize = %x\n", le16_to_cpu(endpoint->wMaxPacketSize)); - } - - if (usb_endpoint_is_int_in(endpoint)) - { - /* we found a interrupt in endpoint */ - printk(KERN_ERR "interrupt in: wMaxPacketSize = %x\n", le16_to_cpu(endpoint->wMaxPacketSize)); - printk(KERN_ERR "interrupt in: int_interval = %d\n", endpoint->bInterval); - } - - if (usb_endpoint_is_int_out(endpoint)) - { - /* we found a interrupt out endpoint */ - printk(KERN_ERR "interrupt out: wMaxPacketSize = %x\n", le16_to_cpu(endpoint->wMaxPacketSize)); - printk(KERN_ERR "interrupt out: int_interval = %d\n", endpoint->bInterval); - } - } - - /* Allocate all Tx URBs */ - for (i = 0; i < ZM_MAX_TX_URB_NUM; i++) - { - macp->WlanTxDataUrb[i] = USB_ALLOC_URB(0, GFP_KERNEL); - - if (macp->WlanTxDataUrb[i] == 0) - { - int j; - - /* Free all urbs */ - for (j = 0; j < i; j++) - { - usb_free_urb(macp->WlanTxDataUrb[j]); - } - - return 0; - } - } - - /* Allocate all Rx URBs */ - for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) - { - macp->WlanRxDataUrb[i] = USB_ALLOC_URB(0, GFP_KERNEL); - - if (macp->WlanRxDataUrb[i] == 0) - { - int j; - - /* Free all urbs */ - for (j = 0; j < i; j++) - { - usb_free_urb(macp->WlanRxDataUrb[j]); - } - - for (j = 0; j < ZM_MAX_TX_URB_NUM; j++) - { - usb_free_urb(macp->WlanTxDataUrb[j]); - } - - return 0; - } - } - - /* Allocate Register Read/Write USB */ - macp->RegOutUrb = USB_ALLOC_URB(0, GFP_KERNEL); - macp->RegInUrb = USB_ALLOC_URB(0, GFP_KERNEL); - - return 1; -} - -void zfLnxFreeAllUrbs(struct usbdrv_private *macp) -{ - int i; - - /* Free all Tx URBs */ - for (i = 0; i < ZM_MAX_TX_URB_NUM; i++) - { - if (macp->WlanTxDataUrb[i] != NULL) - { - usb_free_urb(macp->WlanTxDataUrb[i]); - } - } - - /* Free all Rx URBs */ - for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) - { - if (macp->WlanRxDataUrb[i] != NULL) - { - usb_free_urb(macp->WlanRxDataUrb[i]); - } - } - - /* Free USB Register Read/Write URB */ - usb_free_urb(macp->RegOutUrb); - usb_free_urb(macp->RegInUrb); -} - -void zfLnxUnlinkAllUrbs(struct usbdrv_private *macp) -{ - int i; - - /* Unlink all Tx URBs */ - for (i = 0; i < ZM_MAX_TX_URB_NUM; i++) - { - if (macp->WlanTxDataUrb[i] != NULL) - { - usb_unlink_urb(macp->WlanTxDataUrb[i]); - } - } - - /* Unlink all Rx URBs */ - for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) - { - if (macp->WlanRxDataUrb[i] != NULL) - { - usb_unlink_urb(macp->WlanRxDataUrb[i]); - } - } - - /* Unlink USB Register Read/Write URB */ - usb_unlink_urb(macp->RegOutUrb); - - usb_unlink_urb(macp->RegInUrb); -} - -static const struct net_device_ops otus_netdev_ops = { - .ndo_open = usbdrv_open, - .ndo_stop = usbdrv_close, - .ndo_start_xmit = usbdrv_xmit_frame, - .ndo_change_mtu = usbdrv_change_mtu, - .ndo_get_stats = usbdrv_get_stats, - .ndo_set_multicast_list = usbdrv_set_multi, - .ndo_set_mac_address = usbdrv_set_mac, - .ndo_do_ioctl = usbdrv_ioctl, - .ndo_validate_addr = eth_validate_addr, -}; - -u8_t zfLnxInitSetup(struct net_device *dev, struct usbdrv_private *macp) -{ - //unsigned char addr[6]; - - //init_MUTEX(&macp->ps_sem); - //init_MUTEX(&macp->reg_sem); - //init_MUTEX(&macp->bcn_sem); - //init_MUTEX(&macp->config_sem); - - spin_lock_init(&(macp->cs_lock)); -#if 0 - /* MAC address */ - zfiWlanQueryMacAddress(dev, 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]; -#endif - dev->wireless_handlers = (struct iw_handler_def *)&p80211wext_handler_def; - - dev->netdev_ops = &otus_netdev_ops; - - dev->flags |= IFF_MULTICAST; - - dev->dev_addr[0] = 0x00; - dev->dev_addr[1] = 0x03; - dev->dev_addr[2] = 0x7f; - dev->dev_addr[3] = 0x11; - dev->dev_addr[4] = 0x22; - dev->dev_addr[5] = 0x33; - - /* Initialize Heart Beat timer */ - init_timer(&macp->hbTimer10ms); - macp->hbTimer10ms.data = (unsigned long)dev; - macp->hbTimer10ms.function = (void *)&zfLnx10msTimer; - - /* Initialize WDS and VAP data structure */ - //zfInitWdsStruct(); - zfLnxInitVapStruct(); - - return 1; -} - -u8_t zfLnxClearStructs(struct net_device *dev) -{ - u16_t ii; - u16_t TxQCnt; - - TxQCnt = zfLnxCheckTxBufferCnt(dev); - - printk(KERN_ERR "TxQCnt: %d\n", TxQCnt); - - for (ii = 0; ii < TxQCnt; ii++) { - UsbTxQ_t *TxQ = zfLnxGetUsbTxBuffer(dev); - - printk(KERN_ERR "dev_kfree_skb_any\n"); - /* Free buffer */ - dev_kfree_skb_any(TxQ->buf); - } - - return 0; -} diff --git a/drivers/staging/otus/usbdrv.h b/drivers/staging/otus/usbdrv.h deleted file mode 100644 index 7e66c2d72a69..000000000000 --- a/drivers/staging/otus/usbdrv.h +++ /dev/null @@ -1,245 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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 -/* 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 - -#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 */ - diff --git a/drivers/staging/otus/wrap_buf.c b/drivers/staging/otus/wrap_buf.c deleted file mode 100644 index d7ee0b454e91..000000000000 --- a/drivers/staging/otus/wrap_buf.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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 - -#include - - -/* 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) -{ -} diff --git a/drivers/staging/otus/wrap_dbg.c b/drivers/staging/otus/wrap_dbg.c deleted file mode 100644 index ee0ee1532601..000000000000 --- a/drivers/staging/otus/wrap_dbg.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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 -#include - -void zfwDumpBuf(zdev_t *dev, zbuf_t *buf) -{ - u16_t i; - - for (i = 0; i < buf->len; i++) { - printk(KERN_DEBUG "%02x ", *(((u8_t *)buf->data)+i)); - if ((i & 0xf) == 0xf) - printk(KERN_DEBUG "\n"); - } - printk(KERN_DEBUG "\n"); -} - - -void zfwDbgReadRegDone(zdev_t *dev, u32_t addr, u32_t val) -{ - printk(KERN_DEBUG "Read addr:%x = %x\n", addr, val); -} - -void zfwDbgWriteRegDone(zdev_t *dev, u32_t addr, u32_t val) -{ - printk(KERN_DEBUG "Write addr:%x = %x\n", addr, val); -} - -void zfwDbgReadTallyDone(zdev_t *dev) -{ - /* printk(KERN_DEBUG "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(KERN_DEBUG "Read Flash addr:%x length:%x\n", addr, datalen); -} - -void zfwDbgProgrameFlashDone(zdev_t *dev) -{ - printk(KERN_DEBUG "Program Flash Done\n"); -} - -void zfwDbgProgrameFlashChkDone(zdev_t *dev) -{ - printk(KERN_DEBUG "Program Flash Done\n"); -} - -void zfwDbgGetFlashChkSumDone(zdev_t *dev, u32_t *rspdata) -{ - printk(KERN_DEBUG "Get Flash ChkSum Done\n"); -} - -void zfwDbgDownloadFwInitDone(zdev_t *dev) -{ - printk(KERN_DEBUG "Download FW Init Done\n"); -} -/* For Evl -- */ - -/* Leave an empty line below to remove warning message on some compiler */ diff --git a/drivers/staging/otus/wrap_ev.c b/drivers/staging/otus/wrap_ev.c deleted file mode 100644 index 1c312ad6162e..000000000000 --- a/drivers/staging/otus/wrap_ev.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - * 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 -#include - - -/***** 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 = dev->ml_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: %pM\n", addr); - - 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); - * } - * 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 */ - - 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: %pM\n", addr); - - 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: %pM\n", addr); - - 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->ml_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); - } 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); - * } - * } - */ - } - } - /* 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: %pM\n", addr); - - 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 */ diff --git a/drivers/staging/otus/wrap_mem.c b/drivers/staging/otus/wrap_mem.c deleted file mode 100644 index b0037568e870..000000000000 --- a/drivers/staging/otus/wrap_mem.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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 -#include -#include - -/* 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 -#include - -/* 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) -{ - struct usbdrv_private *macp = dev->ml_priv; - return macp->wd; -} - -asmlinkage void zfwEnterCriticalSection(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - spin_lock_irqsave(&macp->cs_lock, macp->hal_irqFlag); -} - -asmlinkage void zfwLeaveCriticalSection(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - spin_unlock_irqrestore(&macp->cs_lock, macp->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 */ diff --git a/drivers/staging/otus/wrap_pkt.c b/drivers/staging/otus/wrap_pkt.c deleted file mode 100644 index 5ecf38e355a8..000000000000 --- a/drivers/staging/otus/wrap_pkt.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * 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 -#include -#include - - -/* 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->ml_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; - skb_reset_mac_header(skb1); - skb1->ip_summed = CHECKSUM_NONE; - skb1->pkt_type = PACKET_OTHERHOST; - /* ETH_P_80211_RAW */ - skb1->protocol = __constant_htons(0x0019); - 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) -{ - struct usbdrv_private *macp = dev->ml_priv; -#ifdef ZM_AVOID_UDP_LARGE_PACKET_FAIL - zbuf_t *new_buf; - - /* new_buf = dev_alloc_skb(2048); */ - new_buf = dev_alloc_skb(buf->len); - - skb_reset_tail_pointer(new_buf); - - 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_DROP: - break; - default: - macp->drv_stats.net_stats.rx_packets++; - macp->drv_stats.net_stats.rx_bytes += buf->len; - break; - } - - return; -} - -/* Leave an empty line below to remove warning message on some compiler */ diff --git a/drivers/staging/otus/wrap_sec.c b/drivers/staging/otus/wrap_sec.c deleted file mode 100644 index 1fba7a98d52b..000000000000 --- a/drivers/staging/otus/wrap_sec.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * 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 -#include - -#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 = 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->ml_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 */ diff --git a/drivers/staging/otus/wrap_usb.c b/drivers/staging/otus/wrap_usb.c deleted file mode 100644 index 9f04047bf5a6..000000000000 --- a/drivers/staging/otus/wrap_usb.c +++ /dev/null @@ -1,187 +0,0 @@ -/* - * 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 -#include -#include - -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 = dev->ml_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 = dev->ml_priv; - u32_t freeTxQSize; - unsigned long irqFlag; - /* zmw_declare_for_critical_section(); */ - - /* zmw_enter_critical_section(dev); */ - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - freeTxQSize = ZM_MAX_TX_BUF_NUM - macp->TxBufCnt; - - /* zmw_leave_critical_section(dev); */ - spin_unlock_irqrestore(&macp->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 = dev->ml_priv; - u8_t *buf; - - if (size > 0) { - buf = kmalloc(size, GFP_KERNEL); - if (buf == NULL) { - pr_err("zfwUsbSubmitControl() failed, " - "kmalloc() returned NULL\n"); - return 1; - } - 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(KERN_ERR "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 = dev->ml_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); - macp->RegOutUrb = usb_alloc_urb(0, GFP_ATOMIC); - 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 */ diff --git a/drivers/staging/otus/wwrap.c b/drivers/staging/otus/wwrap.c deleted file mode 100644 index c4bbd6b2a5fa..000000000000 --- a/drivers/staging/otus/wwrap.c +++ /dev/null @@ -1,1048 +0,0 @@ -/* - * 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 : wwrap.c */ -/* Abstract */ -/* This module contains wrapper functions. */ -/* */ -/* NOTES */ -/* Platform dependent. */ -/* */ - -/* Please include your header files here */ -#include "oal_dt.h" -#include "usbdrv.h" - -#include -#include -#include - -extern void zfiRecv80211(zdev_t *dev, zbuf_t *buf, struct zsAdditionInfo *addInfo); -extern void zfCoreRecv(zdev_t *dev, zbuf_t *buf, struct zsAdditionInfo *addInfo); -extern void zfIdlChkRsp(zdev_t *dev, u32_t *rsp, u16_t rspLen); -extern void zfIdlRsp(zdev_t *dev, u32_t *rsp, u16_t rspLen); - - - -/*extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];*/ -extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER]; - -u32_t zfLnxUsbSubmitTxData(zdev_t *dev); -u32_t zfLnxUsbIn(zdev_t *dev, urb_t *urb, zbuf_t *buf); -u32_t zfLnxSubmitRegInUrb(zdev_t *dev); -u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, - void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context); -u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, - void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context, - u32_t interval); - -u16_t zfLnxGetFreeTxUrb(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - u16_t idx; - unsigned long irqFlag; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - /*idx = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));*/ - - /*if (idx != macp->TxUrbHead)*/ - if (macp->TxUrbCnt != 0) { - idx = macp->TxUrbTail; - macp->TxUrbTail = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1)); - macp->TxUrbCnt--; - } else { - /*printk(KERN_ERR "macp->TxUrbCnt: %d\n", macp->TxUrbCnt);*/ - idx = 0xffff; - } - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return idx; -} - -void zfLnxPutTxUrb(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - u16_t idx; - unsigned long irqFlag; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - idx = ((macp->TxUrbHead + 1) & (ZM_MAX_TX_URB_NUM - 1)); - - /*if (idx != macp->TxUrbTail)*/ - if (macp->TxUrbCnt < ZM_MAX_TX_URB_NUM) { - macp->TxUrbHead = idx; - macp->TxUrbCnt++; - } else { - printk("UsbTxUrbQ inconsistent: TxUrbHead: %d, TxUrbTail: %d\n", - macp->TxUrbHead, macp->TxUrbTail); - } - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); -} - -u16_t zfLnxCheckTxBufferCnt(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - u16_t TxBufCnt; - unsigned long irqFlag; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - TxBufCnt = macp->TxBufCnt; - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return TxBufCnt; -} - -UsbTxQ_t *zfLnxGetUsbTxBuffer(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - u16_t idx; - UsbTxQ_t *TxQ; - unsigned long irqFlag; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - idx = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1)); - - /*if (idx != macp->TxBufTail)*/ - if (macp->TxBufCnt > 0) { - /*printk("CWY - zfwGetUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);*/ - TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufHead]); - macp->TxBufHead = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1)); - macp->TxBufCnt--; - } else { - if (macp->TxBufHead != macp->TxBufTail) { - printk(KERN_ERR "zfwGetUsbTxBuf UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d\n", - macp->TxBufHead, macp->TxBufTail); - } - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return NULL; - } - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return TxQ; -} - -u16_t zfLnxPutUsbTxBuffer(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) -{ - struct usbdrv_private *macp = dev->ml_priv; - u16_t idx; - UsbTxQ_t *TxQ; - unsigned long irqFlag; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - idx = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1)); - - /* For Tx debug */ - /*zm_assert(macp->TxBufCnt >= 0); // deleted because of always true*/ - - /*if (idx != macp->TxBufHead)*/ - if (macp->TxBufCnt < ZM_MAX_TX_BUF_NUM) { - /*printk("CWY - zfwPutUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);*/ - TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufTail]); - memcpy(TxQ->hdr, hdr, hdrlen); - TxQ->hdrlen = hdrlen; - memcpy(TxQ->snap, snap, snapLen); - TxQ->snapLen = snapLen; - memcpy(TxQ->tail, tail, tailLen); - TxQ->tailLen = tailLen; - TxQ->buf = buf; - TxQ->offset = offset; - - macp->TxBufTail = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1)); - macp->TxBufCnt++; - } else { - printk(KERN_ERR "zfLnxPutUsbTxBuffer UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d, TxBufCnt: %d\n", - macp->TxBufHead, macp->TxBufTail, macp->TxBufCnt); - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return 0xffff; - } - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return 0; -} - -zbuf_t *zfLnxGetUsbRxBuffer(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - /*u16_t idx;*/ - zbuf_t *buf; - unsigned long irqFlag; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - /*idx = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));*/ - - /*if (idx != macp->RxBufTail)*/ - if (macp->RxBufCnt != 0) { - buf = macp->UsbRxBufQ[macp->RxBufHead]; - macp->RxBufHead = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1)); - macp->RxBufCnt--; - } else { - printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n", - macp->RxBufHead, macp->RxBufTail); - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return NULL; - } - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return buf; -} - -u32_t zfLnxPutUsbRxBuffer(zdev_t *dev, zbuf_t *buf) -{ - struct usbdrv_private *macp = dev->ml_priv; - u16_t idx; - unsigned long irqFlag; - - spin_lock_irqsave(&macp->cs_lock, irqFlag); - - idx = ((macp->RxBufTail+1) & (ZM_MAX_RX_URB_NUM - 1)); - - /*if (idx != macp->RxBufHead)*/ - if (macp->RxBufCnt != ZM_MAX_RX_URB_NUM) { - macp->UsbRxBufQ[macp->RxBufTail] = buf; - macp->RxBufTail = idx; - macp->RxBufCnt++; - } else { - printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n", - macp->RxBufHead, macp->RxBufTail); - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return 0xffff; - } - - spin_unlock_irqrestore(&macp->cs_lock, irqFlag); - return 0; -} - -void zfLnxUsbDataOut_callback(urb_t *urb) -{ - zdev_t *dev = urb->context; - /*UsbTxQ_t *TxData;*/ - - /* Give the urb back */ - zfLnxPutTxUrb(dev); - - /* Check whether there is any pending buffer needed */ - /* to be sent */ - if (zfLnxCheckTxBufferCnt(dev) != 0) { - /*TxData = zfwGetUsbTxBuffer(dev); - //if (TxData == NULL) - //{ - // printk("Get a NULL buffer from zfwGetUsbTxBuffer\n"); - // return; - //} - //else - //{ - zfLnxUsbSubmitTxData(dev); - //}*/ - } -} - -void zfLnxUsbDataIn_callback(urb_t *urb) -{ - zdev_t *dev = urb->context; - struct usbdrv_private *macp = dev->ml_priv; - zbuf_t *buf; - zbuf_t *new_buf; - int status; - -#if ZM_USB_STREAM_MODE == 1 - static int remain_len, check_pad, check_len; - int index = 0; - int chk_idx; - u16_t pkt_len; - u16_t pkt_tag; - u16_t ii; - zbuf_t *rxBufPool[8]; - u16_t rxBufPoolIndex = 0; -#endif - - /* Check status for URB */ - if (urb->status != 0) { - printk("zfLnxUsbDataIn_callback() : status=0x%x\n", urb->status); - if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET) - && (urb->status != -ESHUTDOWN)) { - if (urb->status == -EPIPE) { - /*printk(KERN_ERR "nonzero read bulk status received: -EPIPE");*/ - status = -1; - } - - if (urb->status == -EPROTO) { - /*printk(KERN_ERR "nonzero read bulk status received: -EPROTO");*/ - status = -1; - } - } - - /*printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);*/ - - /* Dequeue skb buffer */ - buf = zfLnxGetUsbRxBuffer(dev); - dev_kfree_skb_any(buf); - #if 0 - /* Enqueue skb buffer */ - zfLnxPutUsbRxBuffer(dev, buf); - - /* Submit a Rx urb */ - zfLnxUsbIn(dev, urb, buf); - #endif - return; - } - - if (urb->actual_length == 0) { - printk(KERN_ERR "Get an URB whose length is zero"); - status = -1; - } - - /* Dequeue skb buffer */ - buf = zfLnxGetUsbRxBuffer(dev); - - /*zfwBufSetSize(dev, buf, urb->actual_length);*/ -#ifdef NET_SKBUFF_DATA_USES_OFFSET - buf->tail = 0; - buf->len = 0; -#else - buf->tail = buf->data; - buf->len = 0; -#endif - - BUG_ON((buf->tail + urb->actual_length) > buf->end); - - skb_put(buf, urb->actual_length); - -#if ZM_USB_STREAM_MODE == 1 - if (remain_len != 0) { - zbuf_t *remain_buf = macp->reamin_buf; - - index = remain_len; - remain_len -= check_pad; - - /* Copy data */ - memcpy(&(remain_buf->data[check_len]), buf->data, remain_len); - check_len += remain_len; - remain_len = 0; - - rxBufPool[rxBufPoolIndex++] = remain_buf; - } - - while (index < urb->actual_length) { - pkt_len = buf->data[index] + (buf->data[index+1] << 8); - pkt_tag = buf->data[index+2] + (buf->data[index+3] << 8); - - if (pkt_tag == 0x4e00) { - int pad_len; - - /*printk("Get a packet, index: %d, pkt_len: 0x%04x\n", index, pkt_len);*/ - #if 0 - /* Dump data */ - for (ii = index; ii < pkt_len+4;) { - printk("%02x ", (buf->data[ii] & 0xff)); - - if ((++ii % 16) == 0) - printk("\n"); - } - - printk("\n"); - #endif - - pad_len = 4 - (pkt_len & 0x3); - - if (pad_len == 4) - pad_len = 0; - - chk_idx = index; - index = index + 4 + pkt_len + pad_len; - - if (index > ZM_MAX_RX_BUFFER_SIZE) { - remain_len = index - ZM_MAX_RX_BUFFER_SIZE; /* - pad_len;*/ - check_len = ZM_MAX_RX_BUFFER_SIZE - chk_idx - 4; - check_pad = pad_len; - - /* Allocate a skb buffer */ - /*new_buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);*/ - new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); - - /* Set skb buffer length */ - #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, pkt_len); - - /* Copy the buffer */ - memcpy(new_buf->data, &(buf->data[chk_idx+4]), check_len); - - /* Record the buffer pointer */ - macp->reamin_buf = new_buf; - } else { - #ifdef ZM_DONT_COPY_RX_BUFFER - if (rxBufPoolIndex == 0) { - new_buf = skb_clone(buf, GFP_ATOMIC); - - new_buf->data = &(buf->data[chk_idx+4]); - new_buf->len = pkt_len; - } else { - #endif - /* Allocate a skb buffer */ - new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); - - /* Set skb buffer length */ - #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, pkt_len); - - /* Copy the buffer */ - memcpy(new_buf->data, &(buf->data[chk_idx+4]), pkt_len); - - #ifdef ZM_DONT_COPY_RX_BUFFER - } - #endif - rxBufPool[rxBufPoolIndex++] = new_buf; - } - } else { - printk(KERN_ERR "Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n", pkt_len, pkt_tag); - - /* Free buffer */ - dev_kfree_skb_any(buf); - - /* Allocate a skb buffer */ - new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); - - /* Enqueue skb buffer */ - zfLnxPutUsbRxBuffer(dev, new_buf); - - /* Submit a Rx urb */ - zfLnxUsbIn(dev, urb, new_buf); - - return; - } - } - - /* Free buffer */ - dev_kfree_skb_any(buf); -#endif - - /* Allocate a skb buffer */ - new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); - - /* Enqueue skb buffer */ - zfLnxPutUsbRxBuffer(dev, new_buf); - - /* Submit a Rx urb */ - zfLnxUsbIn(dev, urb, new_buf); - -#if ZM_USB_STREAM_MODE == 1 - for (ii = 0; ii < rxBufPoolIndex; ii++) { - macp->usbCbFunctions.zfcbUsbRecv(dev, rxBufPool[ii]); - } -#else - /* pass data to upper layer */ - macp->usbCbFunctions.zfcbUsbRecv(dev, buf); -#endif -} - -void zfLnxUsbRegOut_callback(urb_t *urb) -{ - /*dev_t* dev = urb->context;*/ - - /*printk(KERN_ERR "zfwUsbRegOut_callback\n");*/ -} - -void zfLnxUsbRegIn_callback(urb_t *urb) -{ - zdev_t *dev = urb->context; - u32_t rsp[64/4]; - int status; - struct usbdrv_private *macp = dev->ml_priv; - - /* Check status for URB */ - if (urb->status != 0) { - printk("zfLnxUsbRegIn_callback() : status=0x%x\n", urb->status); - if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET) && (urb->status != -ESHUTDOWN)) { - if (urb->status == -EPIPE) { - /*printk(KERN_ERR "nonzero read bulk status received: -EPIPE");*/ - status = -1; - } - - if (urb->status == -EPROTO) { - /*printk(KERN_ERR "nonzero read bulk status received: -EPROTO");*/ - status = -1; - } - } - - /*printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);*/ - return; - } - - if (urb->actual_length == 0) { - printk(KERN_ERR "Get an URB whose length is zero"); - status = -1; - } - - /* Copy data into respone buffer */ - memcpy(rsp, macp->regUsbReadBuf, urb->actual_length); - - /* Notify to upper layer */ - /*zfIdlChkRsp(dev, rsp, (u16_t)urb->actual_length);*/ - /*zfiUsbRegIn(dev, rsp, (u16_t)urb->actual_length);*/ - macp->usbCbFunctions.zfcbUsbRegIn(dev, rsp, (u16_t)urb->actual_length); - - /* Issue another USB IN URB */ - zfLnxSubmitRegInUrb(dev); -} - -u32_t zfLnxSubmitRegInUrb(zdev_t *dev) -{ - u32_t ret; - struct usbdrv_private *macp = dev->ml_priv; - - /* Submit a rx urb - //ret = zfLnxUsbSubmitBulkUrb(macp->RegInUrb, macp->udev, - // USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf, - // ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev); - //CWYang(-) - //if (ret != 0) - // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/ - - ret = zfLnxUsbSubmitIntUrb(macp->RegInUrb, macp->udev, - USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf, - ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev, 1); - - return ret; -} - -u32_t zfLnxUsbSubmitTxData(zdev_t *dev) -{ - u32_t i; - u32_t ret; - u16_t freeTxUrb; - u8_t *puTxBuf = NULL; - UsbTxQ_t *TxData; - int len = 0; - struct usbdrv_private *macp = dev->ml_priv; -#if ZM_USB_TX_STREAM_MODE == 1 - u8_t ii; - u16_t offset = 0; - u16_t usbTxAggCnt; - u16_t *pUsbTxHdr; - UsbTxQ_t *TxQPool[ZM_MAX_TX_AGGREGATE_NUM]; -#endif - - /* First check whether there is a free URB */ - freeTxUrb = zfLnxGetFreeTxUrb(dev); - - /* If there is no any free Tx Urb */ - if (freeTxUrb == 0xffff) { - /*printk(KERN_ERR "Can't get free Tx Urb\n"); - //printk("CWY - Can't get free Tx Urb\n");*/ - return 0xffff; - } - -#if ZM_USB_TX_STREAM_MODE == 1 - usbTxAggCnt = zfLnxCheckTxBufferCnt(dev); - - if (usbTxAggCnt >= ZM_MAX_TX_AGGREGATE_NUM) { - usbTxAggCnt = ZM_MAX_TX_AGGREGATE_NUM; - } else { - usbTxAggCnt = 1; - } - - /*printk("usbTxAggCnt: %d\n", usbTxAggCnt);*/ -#endif - -#if ZM_USB_TX_STREAM_MODE == 1 - for (ii = 0; ii < usbTxAggCnt; ii++) { -#endif - /* Dequeue the packet from UsbTxBufQ */ - TxData = zfLnxGetUsbTxBuffer(dev); - if (TxData == NULL) { - /* Give the urb back */ - zfLnxPutTxUrb(dev); - return 0xffff; - } - - /* Point to the freeTxUrb buffer */ - puTxBuf = macp->txUsbBuf[freeTxUrb]; - -#if ZM_USB_TX_STREAM_MODE == 1 - puTxBuf += offset; - pUsbTxHdr = (u16_t *)puTxBuf; - - /* Add the packet length and tag information */ - *pUsbTxHdr++ = TxData->hdrlen + TxData->snapLen + - (TxData->buf->len - TxData->offset) + TxData->tailLen; - - *pUsbTxHdr++ = 0x697e; - - puTxBuf += 4; -#endif /* #ifdef ZM_USB_TX_STREAM_MODE*/ - - /* Copy WLAN header and packet buffer into USB buffer */ - for (i = 0; i < TxData->hdrlen; i++) { - *puTxBuf++ = TxData->hdr[i]; - } - - /* Copy SNAP header */ - for (i = 0; i < TxData->snapLen; i++) { - *puTxBuf++ = TxData->snap[i]; - } - - /* Copy packet buffer */ - for (i = 0; i < TxData->buf->len - TxData->offset; i++) { - /*puTxBuf++ = zmw_rx_buf_readb(dev, TxData->buf, i);*/ - *puTxBuf++ = *(u8_t *)((u8_t *)TxData->buf->data+i+TxData->offset); - } - - /* Copy tail */ - for (i = 0; i < TxData->tailLen; i++) { - *puTxBuf++ = TxData->tail[i]; - } - - len = TxData->hdrlen+TxData->snapLen+TxData->buf->len+TxData->tailLen-TxData->offset; - - #if 0 - if (TxData->hdrlen != 0) { - puTxBuf = macp->txUsbBuf[freeTxUrb]; - for (i = 0; i < len; i++) { - printk("%02x ", puTxBuf[i]); - if (i % 16 == 15) - printk("\n"); - } - printk("\n"); - } - #endif - #if 0 - /* For debug purpose */ - if (TxData->hdr[9] & 0x40) { - int i; - u16_t ctrlLen = TxData->hdr[0] + (TxData->hdr[1] << 8); - - if (ctrlLen != len + 4) { - /* Dump control setting */ - for (i = 0; i < 8; i++) { - printk(KERN_ERR "0x%02x ", TxData->hdr[i]); - } - printk(KERN_ERR "\n"); - - printk(KERN_ERR "ctrLen: %d, hdrLen: %d, snapLen: %d\n", ctrlLen, TxData->hdrlen, TxData->snapLen); - printk(KERN_ERR "bufLen: %d, tailLen: %d, len: %d\n", TxData->buf->len, TxData->tailLen, len); - } - } - #endif - -#if ZM_USB_TX_STREAM_MODE == 1 - /* Add the Length and Tag*/ - len += 4; - - /*printk("%d packet, length: %d\n", ii+1, len);*/ - - if (ii < (ZM_MAX_TX_AGGREGATE_NUM-1)) { - /* Pad the buffer to firmware descriptor boundary */ - offset += (((len-1) / 4) + 1) * 4; - } - - if (ii == (ZM_MAX_TX_AGGREGATE_NUM-1)) { - len += offset; - } - - TxQPool[ii] = TxData; - - /*DbgPrint("%d packet, offset: %d\n", ii+1, pUsbTxTransfer->offset);*/ - - /* free packet */ - /*zfBufFree(dev, txData->buf);*/ - } -#endif - /*printk("CWY - call zfwUsbSubmitBulkUrb(), len = 0x%d\n", len);*/ - /* Submit a tx urb */ - ret = zfLnxUsbSubmitBulkUrb(macp->WlanTxDataUrb[freeTxUrb], macp->udev, - USB_WLAN_TX_PIPE, USB_DIR_OUT, macp->txUsbBuf[freeTxUrb], - len, zfLnxUsbDataOut_callback, dev); - /*CWYang(-) - //if (ret != 0) - // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/ - - /* free packet */ - /*dev_kfree_skb_any(TxData->buf);*/ -#if ZM_USB_TX_STREAM_MODE == 1 - for (ii = 0; ii < usbTxAggCnt; ii++) - macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxQPool[ii]->buf, 1, TxQPool[ii]->hdr); -#else - macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxData->buf, 1, TxData->hdr); -#endif - - return ret; -} - - - -u32_t zfLnxUsbIn(zdev_t *dev, urb_t *urb, zbuf_t *buf) -{ - u32_t ret; - struct usbdrv_private *macp = dev->ml_priv; - - /* Submit a rx urb */ - ret = zfLnxUsbSubmitBulkUrb(urb, macp->udev, USB_WLAN_RX_PIPE, - USB_DIR_IN, buf->data, ZM_MAX_RX_BUFFER_SIZE, - zfLnxUsbDataIn_callback, dev); - /*CWYang(-) - //if (ret != 0) - // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/ - - return ret; -} - -u32_t zfLnxUsbWriteReg(zdev_t *dev, u32_t *cmd, u16_t cmdLen) -{ - struct usbdrv_private *macp = dev->ml_priv; - u32_t ret; - -#ifdef ZM_CONFIG_BIG_ENDIAN - int ii = 0; - - for (ii = 0; ii < (cmdLen>>2); ii++) - cmd[ii] = cpu_to_le32(cmd[ii]); -#endif - - memcpy(macp->regUsbWriteBuf, cmd, cmdLen); - - /* Issue an USB Out transfer */ - /* Submit a tx urb */ - ret = zfLnxUsbSubmitIntUrb(macp->RegOutUrb, macp->udev, - USB_REG_OUT_PIPE, USB_DIR_OUT, macp->regUsbWriteBuf, - cmdLen, zfLnxUsbRegOut_callback, dev, 1); - - return ret; -} - - -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 ret; - struct usbdrv_private *macp = dev->ml_priv; - - /* Check length of tail buffer */ - /*zm_assert((tailLen <= 16));*/ - - /* Enqueue the packet into UsbTxBufQ */ - if (zfLnxPutUsbTxBuffer(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset) == 0xffff) { - /* free packet */ - /*printk("CWY - zfwPutUsbTxBuffer Error, free packet\n"); - //dev_kfree_skb_any(buf);*/ - macp->usbCbFunctions.zfcbUsbOutComplete(dev, buf, 0, hdr); - return 0xffff; - } - - /*return 0; - //printk("CWY - call zfwUsbSubmitTxData()\n");*/ - ret = zfLnxUsbSubmitTxData(dev); - return ret; -} - -void zfLnxInitUsbTxQ(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - - printk(KERN_ERR "zfwInitUsbTxQ\n"); - - /* Zero memory for UsbTxBufQ */ - memset(macp->UsbTxBufQ, 0, sizeof(UsbTxQ_t) * ZM_MAX_TX_URB_NUM); - - macp->TxBufHead = 0; - macp->TxBufTail = 0; - macp->TxUrbHead = 0; - macp->TxUrbTail = 0; - macp->TxUrbCnt = ZM_MAX_TX_URB_NUM; -} - -void zfLnxInitUsbRxQ(zdev_t *dev) -{ - u16_t i; - zbuf_t *buf; - struct usbdrv_private *macp = dev->ml_priv; - - /* Zero memory for UsbRxBufQ */ - memset(macp->UsbRxBufQ, 0, sizeof(zbuf_t *) * ZM_MAX_RX_URB_NUM); - - macp->RxBufHead = 0; - - for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) { - /*buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);*/ - buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); - macp->UsbRxBufQ[i] = buf; - } - - /*macp->RxBufTail = ZM_MAX_RX_URB_NUM - 1;*/ - macp->RxBufTail = 0; - - /* Submit all Rx urbs */ - for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) { - zfLnxPutUsbRxBuffer(dev, macp->UsbRxBufQ[i]); - zfLnxUsbIn(dev, macp->WlanRxDataUrb[i], macp->UsbRxBufQ[i]); - } -} - - - -u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, - void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context) -{ - u32_t ret; - - if (direction == USB_DIR_OUT) { - usb_fill_bulk_urb(urb, usb, usb_sndbulkpipe(usb, epnum), - transfer_buffer, buffer_length, complete, context); - - urb->transfer_flags |= URB_ZERO_PACKET; - } else { - usb_fill_bulk_urb(urb, usb, usb_rcvbulkpipe(usb, epnum), - transfer_buffer, buffer_length, complete, context); - } - - if (epnum == 4) { - if (urb->hcpriv) { - /*printk("CWY - urb->hcpriv set by unknown reason, reset it\n"); - //urb->hcpriv = 0;*/ - } - } - - ret = usb_submit_urb(urb, GFP_ATOMIC); - if ((epnum == 4) & (ret != 0)) { - /*printk("CWY - ret = %x\n", ret);*/ - } - return ret; -} - -u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, - void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context, - u32_t interval) -{ - u32_t ret; - - if (direction == USB_DIR_OUT) { - usb_fill_int_urb(urb, usb, usb_sndbulkpipe(usb, epnum), - transfer_buffer, buffer_length, complete, context, interval); - } else { - usb_fill_int_urb(urb, usb, usb_rcvbulkpipe(usb, epnum), - transfer_buffer, buffer_length, complete, context, interval); - } - - ret = usb_submit_urb(urb, GFP_ATOMIC); - - return ret; -} - -#ifdef ZM_ENABLE_CENC -int zfLnxCencSendMsg(struct sock *netlink_sk, u_int8_t *msg, int len) -{ -#define COMMTYPE_GROUP 8 -#define WAI_K_MSG 0x11 - - int ret = -1; - int size; - unsigned char *old_tail; - struct sk_buff *skb; - struct nlmsghdr *nlh; - char *pos = NULL; - - size = NLMSG_SPACE(len); - skb = alloc_skb(size, GFP_ATOMIC); - - if (skb == NULL) { - printk("dev_alloc_skb failure \n"); - goto out; - } - old_tail = skb->tail; - - /* */ - nlh = NLMSG_PUT(skb, 0, 0, WAI_K_MSG, size-sizeof(*nlh)); - pos = NLMSG_DATA(nlh); - - /* */ - memcpy(pos, msg, len); - /* */ - nlh->nlmsg_len = skb->tail - old_tail; - NETLINK_CB(skb).dst_group = COMMTYPE_GROUP; - netlink_broadcast(netlink_sk, skb, 0, COMMTYPE_GROUP, GFP_ATOMIC); - ret = 0; -out: - return ret; -nlmsg_failure: /* */ - kfree_skb(skb); - goto out; - -#undef COMMTYPE_GROUP -#undef WAI_K_MSG -} -#endif /*ZM_ENABLE_CENC*/ - -/* Simply return 0xffff if VAP function is not supported */ -u16_t zfLnxGetVapId(zdev_t *dev) -{ - u16_t i; - - for (i = 0; i < ZM_VAP_PORT_NUMBER; i++) { - if (vap[i].dev == dev) { - return i; - } - } - return 0xffff; -} - -u32_t zfwReadReg(zdev_t *dev, u32_t offset) -{ - return 0; -} - -#ifndef INIT_WORK -#define work_struct tq_struct - -#define schedule_work(a) schedule_task(a) - -#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 - -#define KEVENT_WATCHDOG 0x00000001 - -u32_t smp_kevent_Lock; - -void kevent(struct work_struct *work) -{ - struct usbdrv_private *macp = - container_of(work, struct usbdrv_private, kevent); - zdev_t *dev = macp->device; - - if (test_and_set_bit(0, (void *)&smp_kevent_Lock)) { - /*schedule_work(&macp->kevent);*/ - return; - } - - down(&macp->ioctl_sem); - - if (test_and_clear_bit(KEVENT_WATCHDOG, &macp->kevent_flags)) { - extern u16_t zfHpStartRecv(zdev_t *dev); - /*zfiHwWatchDogReinit(dev);*/ - printk(("\n ************ Hw watchDog occur!! ************** \n")); - zfiWlanSuspend(dev); - zfiWlanResume(dev , 0); - zfHpStartRecv(dev); - } - - clear_bit(0, (void *)&smp_kevent_Lock); - up(&macp->ioctl_sem); -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfLnxCreateThread */ -/* Create a Thread */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* */ -/* OUTPUTS */ -/* always 0 */ -/* */ -/* AUTHOR */ -/* Yuan-Gu Wei Atheros Communications, INC. 2007.3 */ -/* */ -/************************************************************************/ -u8_t zfLnxCreateThread(zdev_t *dev) -{ - struct usbdrv_private *macp = dev->ml_priv; - - /* Create Mutex and keventd */ - INIT_WORK(&macp->kevent, kevent); - sema_init(&macp->ioctl_sem, 1); - - return 0; -} - -/************************************************************************/ -/* */ -/* FUNCTION DESCRIPTION zfLnxSignalThread */ -/* Signal Thread with Flag */ -/* */ -/* INPUTS */ -/* dev : device pointer */ -/* flag : signal thread flag */ -/* */ -/* OUTPUTS */ -/* none */ -/* */ -/* AUTHOR */ -/* Yuan-Gu Wei Atheros Communications, INC. 2007.3 */ -/* */ -/************************************************************************/ -void zfLnxSignalThread(zdev_t *dev, int flag) -{ - struct usbdrv_private *macp = dev->ml_priv; - - if (macp == NULL) { - printk("macp is NULL\n"); - return; - } - - if (0 && macp->kevent_ready != 1) { - printk("Kevent not ready\n"); - return; - } - - set_bit(flag, &macp->kevent_flags); - - if (!schedule_work(&macp->kevent)) { - /*Fails is Normal - //printk(KERN_ERR "schedule_task failed, flag = %x\n", flag);*/ - } -} - -/* Notify wrapper todo redownload firmware and reinit procedure when */ -/* hardware watchdog occur : zfiHwWatchDogReinit() */ -void zfLnxWatchDogNotify(zdev_t *dev) -{ - zfLnxSignalThread(dev, KEVENT_WATCHDOG); -} - -/* Query Durantion of Active Scan */ -void zfwGetActiveScanDur(zdev_t *dev, u8_t *Dur) -{ - *Dur = 30; /* default 30 ms*/ -} - -void zfwGetShowZeroLengthSSID(zdev_t *dev, u8_t *Dur) -{ - *Dur = 0; -} - diff --git a/drivers/staging/otus/zdcompat.h b/drivers/staging/otus/zdcompat.h deleted file mode 100644 index cdcaef54afcd..000000000000 --- a/drivers/staging/otus/zdcompat.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 definition for compatibility. */ -/* */ -/* NOTES */ -/* Platform dependent. */ -/* */ -/************************************************************************/ - -#ifndef _ZDCOMPAT_H -#define _ZDCOMPAT_H - - -#ifndef DECLARE_TASKLET -#define tasklet_schedule(a) schedule_task(a) -#endif - -#undef netdevice_t -typedef struct net_device netdevice_t; - -#ifndef in_atomic -#define in_atomic() 0 -#endif - -#define USB_QUEUE_BULK 0 - - -#endif diff --git a/drivers/staging/otus/zdusb.c b/drivers/staging/otus/zdusb.c deleted file mode 100644 index 4014b7472454..000000000000 --- a/drivers/staging/otus/zdusb.c +++ /dev/null @@ -1,226 +0,0 @@ -/* - * 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. */ -/* */ -/************************************************************************/ - -#ifdef MODVERSIONS -#include -#endif - -#include -#include -#include - -#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 const struct usb_device_id zd1221_ids[] = { - { USB_DEVICE(VENDOR_ATHR, PRODUCT_AR9170) }, - { USB_DEVICE(VENDOR_DLINK, PRODUCT_DWA160A) }, - { USB_DEVICE(VENDOR_NETGEAR, PRODUCT_WNDA3100) }, - { USB_DEVICE(VENDOR_NETGEAR, PRODUCT_WN111v2) }, - { } /* 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]; - -static int zfLnxProbe(struct usb_interface *interface, - const struct usb_device_id *id) -{ - struct usb_device *dev = interface_to_usbdev(interface); - - struct net_device *net = NULL; - struct usbdrv_private *macp = NULL; - int vendor_id, product_id; - int result = 0; - - usb_get_dev(dev); - - 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 - - macp = kzalloc(sizeof(struct usbdrv_private), GFP_KERNEL); - if (!macp) { - printk(KERN_ERR "out of memory allocating device structure\n"); - result = -ENOMEM; - goto fail; - } - - 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"); - - net->ml_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 { - usb_set_intfdata(interface, macp); - SET_NETDEV_DEV(net, &interface->dev); - - if (register_netdev(net) != 0) { - usb_set_intfdata(interface, NULL); - goto fail3; - } - } - - netif_carrier_off(net); - goto done; -fail3: - zfLnxFreeAllUrbs(macp); -fail2: - free_netdev(net); /* kernel 2.6 */ -fail1: - kfree(macp); -fail: - usb_put_dev(dev); - macp = NULL; -done: - return result; -} - -static void zfLnxDisconnect(struct usb_interface *interface) -{ - struct usbdrv_private *macp = (struct usbdrv_private *) usb_get_intfdata(interface); - - 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); - - usb_put_dev(interface_to_usbdev(interface)); - - /* printk(KERN_ERR "3. zfLnxUnlinkAllUrbs\n"); */ - /* zfLnxUnlinkAllUrbs(macp); */ - - /* Free network interface */ - free_netdev(macp->device); - - zfLnxFreeAllUrbs(macp); - /* zfLnxClearStructs(macp->device); */ - kfree(macp); - macp = NULL; - - usb_set_intfdata(interface, NULL); -} - -static struct usb_driver zd1221_driver = { - .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); diff --git a/drivers/staging/otus/zdusb.h b/drivers/staging/otus/zdusb.h deleted file mode 100644 index 97e4ef09567a..000000000000 --- a/drivers/staging/otus/zdusb.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 - -#define VENDOR_NETGEAR 0x0846 /* NetGear */ -#define PRODUCT_WNDA3100 0x9010 -#define PRODUCT_WN111v2 0x9001 - -#endif