/*
 * 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
		*/

		/*
		if ((id = zfApFindSta(dev, macAddr)) != 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, "enalbe 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;
}
