blob: 4fd07c9a9f50d23d0e1e12e6812ddc98826d5de4 [file] [log] [blame]
/******************************************************************************
*
* This file is provided under a dual license. When you use or
* distribute this software, you may choose to be licensed under
* version 2 of the GNU General Public License ("GPLv2 License")
* or BSD License.
*
* GPLv2 License
*
* Copyright(C) 2016 MediaTek Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See http://www.gnu.org/licenses/gpl-2.0.html for more details.
*
* BSD LICENSE
*
* Copyright(C) 2016 MediaTek Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
/*
** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/nic/nic_cmd_event.c#3
*/
/*! \file nic_cmd_event.c
* \brief Callback functions for Command packets.
*
* Various Event packet handlers which will be setup in the callback function of
* a command packet.
*/
/*******************************************************************************
* C O M P I L E R F L A G S
********************************************************************************
*/
/*******************************************************************************
* E X T E R N A L R E F E R E N C E S
********************************************************************************
*/
#include "precomp.h"
#include "gl_ate_agent.h"
/*******************************************************************************
* C O N S T A N T S
********************************************************************************
*/
const NIC_CAPABILITY_V2_REF_TABLE_T gNicCapabilityV2InfoTable[] = {
{TAG_CAP_TX_RESOURCE, nicCmdEventQueryNicTxResource},
{TAG_CAP_TX_EFUSEADDRESS, nicCmdEventQueryNicEfuseAddr},
{TAG_CAP_COEX_FEATURE, nicCmdEventQueryNicCoexFeature},
{TAG_CAP_SINGLE_SKU, rlmDomainExtractSingleSkuInfoFromFirmware},
#if CFG_TCP_IP_CHKSUM_OFFLOAD
{TAG_CAP_CSUM_OFFLOAD, nicCmdEventQueryNicCsumOffload},
#endif
{TAG_CAP_MAC_EFUSE_OFFSET, nicCmdEventQueryEfuseOffset},
{TAG_CAP_R_MODE_CAP, nicCmdEventQueryRModeCapability}
};
/*******************************************************************************
* D A T A T Y P E S
********************************************************************************
*/
/*******************************************************************************
* P U B L I C D A T A
********************************************************************************
*/
/*******************************************************************************
* F U N C T I O N D A T A
********************************************************************************
*/
VOID nicCmdEventQueryMcrRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_PARAM_CUSTOM_MCR_RW_STRUCT_T prMcrRdInfo;
P_GLUE_INFO_T prGlueInfo;
P_CMD_ACCESS_REG prCmdAccessReg;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prCmdAccessReg = (P_CMD_ACCESS_REG) (pucEventBuf);
u4QueryInfoLen = sizeof(PARAM_CUSTOM_MCR_RW_STRUCT_T);
prMcrRdInfo = (P_PARAM_CUSTOM_MCR_RW_STRUCT_T) prCmdInfo->pvInformationBuffer;
prMcrRdInfo->u4McrOffset = prCmdAccessReg->u4Address;
prMcrRdInfo->u4McrData = prCmdAccessReg->u4Data;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
return;
}
VOID nicCmdEventQueryCoexGetInfo(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
struct CMD_COEX_CTRL *prCmdCoexCtrl;
struct CMD_COEX_GET_INFO *prCmdCoexGetInfo;
struct PARAM_COEX_CTRL *prCoexCtrl;
struct PARAM_COEX_GET_INFO *prCoexGetInfo;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prCmdCoexCtrl = (struct CMD_COEX_CTRL *) (pucEventBuf);
u4QueryInfoLen = sizeof(struct PARAM_COEX_CTRL);
prCmdCoexGetInfo = (struct CMD_COEX_GET_INFO *) &prCmdCoexCtrl->aucBuffer[0];
prCoexCtrl = (struct PARAM_COEX_CTRL *) prCmdInfo->pvInformationBuffer;
prCoexGetInfo = (struct PARAM_COEX_GET_INFO *) &prCoexCtrl->aucBuffer[0];
kalMemCopy(prCoexGetInfo->u4CoexInfo, prCmdCoexGetInfo->u4CoexInfo,
sizeof(prCmdCoexGetInfo->u4CoexInfo));
DBGLOG(REQ, INFO, "nicCmdEventQueryCoexGetInfo!!\n");
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryCoexIso(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
struct CMD_COEX_CTRL *prCmdCoexCtrl;
struct CMD_COEX_ISO_DETECT *prCmdCoexIsoDetect;
struct PARAM_COEX_CTRL *prCoexCtrl;
struct PARAM_COEX_ISO_DETECT *prCoexIsoDetect;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prCmdCoexCtrl = (struct CMD_COEX_CTRL *) (pucEventBuf);
u4QueryInfoLen = sizeof(struct PARAM_COEX_CTRL);
prCmdCoexIsoDetect = (struct CMD_COEX_ISO_DETECT *) &prCmdCoexCtrl->aucBuffer[0];
prCoexCtrl = (struct PARAM_COEX_CTRL *) prCmdInfo->pvInformationBuffer;
prCoexIsoDetect = (struct PARAM_COEX_ISO_DETECT *) &prCoexCtrl->aucBuffer[0];
prCoexIsoDetect->u4IsoPath = prCmdCoexIsoDetect->u4IsoPath;
prCoexIsoDetect->u4Channel = prCmdCoexIsoDetect->u4Channel;
/*prCoexIsoDetect->u4Band = prCmdCoexIsoDetect->u4Band;*/
prCoexIsoDetect->u4Isolation = prCmdCoexIsoDetect->u4Isolation;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#if CFG_SUPPORT_QA_TOOL
VOID nicCmdEventQueryRxStatistics(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_PARAM_CUSTOM_ACCESS_RX_STAT prRxStatistics;
P_EVENT_ACCESS_RX_STAT prEventAccessRxStat;
UINT_32 u4QueryInfoLen, i;
P_GLUE_INFO_T prGlueInfo;
PUINT_32 prElement;
UINT_32 u4Temp;
/* P_CMD_ACCESS_RX_STAT prCmdRxStat, prRxStat; */
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prEventAccessRxStat = (P_EVENT_ACCESS_RX_STAT) (pucEventBuf);
prRxStatistics = (P_PARAM_CUSTOM_ACCESS_RX_STAT) prCmdInfo->pvInformationBuffer;
prRxStatistics->u4SeqNum = prEventAccessRxStat->u4SeqNum;
prRxStatistics->u4TotalNum = prEventAccessRxStat->u4TotalNum;
u4QueryInfoLen = sizeof(CMD_ACCESS_RX_STAT);
if (prRxStatistics->u4SeqNum == u4RxStatSeqNum) {
prElement = &g_HqaRxStat.MAC_FCS_Err;
for (i = 0; i < HQA_RX_STATISTIC_NUM; i++) {
u4Temp = ntohl(prEventAccessRxStat->au4Buffer[i]);
kalMemCopy(prElement, &u4Temp, 4);
if (i < (HQA_RX_STATISTIC_NUM - 1))
prElement++;
}
g_HqaRxStat.AllMacMdrdy0 = ntohl(prEventAccessRxStat->au4Buffer[i]);
i++;
g_HqaRxStat.AllMacMdrdy1 = ntohl(prEventAccessRxStat->au4Buffer[i]);
/* i++; */
/* g_HqaRxStat.AllFCSErr0 = ntohl(prEventAccessRxStat->au4Buffer[i]); */
/* i++; */
/* g_HqaRxStat.AllFCSErr1 = ntohl(prEventAccessRxStat->au4Buffer[i]); */
}
DBGLOG(INIT, ERROR,
"MT6632 : RX Statistics Test SeqNum = %d, TotalNum = %d\n",
(unsigned int)prEventAccessRxStat->u4SeqNum, (unsigned int)prEventAccessRxStat->u4TotalNum);
DBGLOG(INIT, ERROR, "MAC_FCS_ERR = %d, MAC_MDRDY = %d, MU_RX_CNT = %d, RX_FIFO_FULL = %d\n",
(unsigned int)prEventAccessRxStat->au4Buffer[0],
(unsigned int)prEventAccessRxStat->au4Buffer[1],
(unsigned int)prEventAccessRxStat->au4Buffer[65],
(unsigned int)prEventAccessRxStat->au4Buffer[22]);
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#if CFG_SUPPORT_TX_BF
VOID nicCmdEventPfmuDataRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
P_PFMU_DATA prEventPfmuDataRead = NULL;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prEventPfmuDataRead = (P_PFMU_DATA) (pucEventBuf);
u4QueryInfoLen = sizeof(PFMU_DATA);
g_rPfmuData = *prEventPfmuDataRead;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
DBGLOG(INIT, INFO, "=========== Before ===========\n");
if (prEventPfmuDataRead != NULL) {
DBGLOG(INIT, INFO, "u2Phi11 = 0x%x\n", prEventPfmuDataRead->rField.u2Phi11);
DBGLOG(INIT, INFO, "ucPsi21 = 0x%x\n", prEventPfmuDataRead->rField.ucPsi21);
DBGLOG(INIT, INFO, "u2Phi21 = 0x%x\n", prEventPfmuDataRead->rField.u2Phi21);
DBGLOG(INIT, INFO, "ucPsi31 = 0x%x\n", prEventPfmuDataRead->rField.ucPsi31);
DBGLOG(INIT, INFO, "u2Phi31 = 0x%x\n", prEventPfmuDataRead->rField.u2Phi31);
DBGLOG(INIT, INFO, "ucPsi41 = 0x%x\n", prEventPfmuDataRead->rField.ucPsi41);
DBGLOG(INIT, INFO, "u2Phi22 = 0x%x\n", prEventPfmuDataRead->rField.u2Phi22);
DBGLOG(INIT, INFO, "ucPsi32 = 0x%x\n", prEventPfmuDataRead->rField.ucPsi32);
DBGLOG(INIT, INFO, "u2Phi32 = 0x%x\n", prEventPfmuDataRead->rField.u2Phi32);
DBGLOG(INIT, INFO, "ucPsi42 = 0x%x\n", prEventPfmuDataRead->rField.ucPsi42);
DBGLOG(INIT, INFO, "u2Phi33 = 0x%x\n", prEventPfmuDataRead->rField.u2Phi33);
DBGLOG(INIT, INFO, "ucPsi43 = 0x%x\n", prEventPfmuDataRead->rField.ucPsi43);
DBGLOG(INIT, INFO, "u2dSNR00 = 0x%x\n", prEventPfmuDataRead->rField.u2dSNR00);
DBGLOG(INIT, INFO, "u2dSNR01 = 0x%x\n", prEventPfmuDataRead->rField.u2dSNR01);
DBGLOG(INIT, INFO, "u2dSNR02 = 0x%x\n", prEventPfmuDataRead->rField.u2dSNR02);
DBGLOG(INIT, INFO, "u2dSNR03 = 0x%x\n", prEventPfmuDataRead->rField.u2dSNR03);
}
}
VOID nicCmdEventPfmuTagRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
P_EVENT_PFMU_TAG_READ_T prEventPfmuTagRead = NULL;
P_PARAM_CUSTOM_PFMU_TAG_READ_STRUCT_T prPfumTagRead = NULL;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
if (!pucEventBuf) {
DBGLOG(INIT, ERROR, "pucEventBuf is NULL.\n");
return;
}
if (!prCmdInfo->pvInformationBuffer) {
DBGLOG(INIT, ERROR, "prCmdInfo->pvInformationBuffer is NULL.\n");
return;
}
/* 4 <2> Update information of OID */
if (!prCmdInfo->fgIsOid) {
DBGLOG(INIT, ERROR, "cmd %u seq #%u not oid!",
prCmdInfo->ucCID, prCmdInfo->ucCmdSeqNum);
return;
}
prGlueInfo = prAdapter->prGlueInfo;
prEventPfmuTagRead = (P_EVENT_PFMU_TAG_READ_T) (pucEventBuf);
prPfumTagRead = (P_PARAM_CUSTOM_PFMU_TAG_READ_STRUCT_T) prCmdInfo->pvInformationBuffer;
kalMemCopy(prPfumTagRead, prEventPfmuTagRead, sizeof(EVENT_PFMU_TAG_READ_T));
u4QueryInfoLen = sizeof(CMD_TXBF_ACTION_T);
g_rPfmuTag1 = prPfumTagRead->ru4TxBfPFMUTag1;
g_rPfmuTag2 = prPfumTagRead->ru4TxBfPFMUTag2;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
DBGLOG(INIT, INFO, "========================== (R)Tag1 info ==========================\n");
DBGLOG(INIT, INFO, " Row data0 : %x, Row data1 : %x, Row data2 : %x, Row data3 : %x\n",
prEventPfmuTagRead->ru4TxBfPFMUTag1.au4RawData[0],
prEventPfmuTagRead->ru4TxBfPFMUTag1.au4RawData[1],
prEventPfmuTagRead->ru4TxBfPFMUTag1.au4RawData[2], prEventPfmuTagRead->ru4TxBfPFMUTag1.au4RawData[3]);
DBGLOG(INIT, INFO, "ProfileID = %d Invalid status = %d\n",
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucProfileID,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucInvalidProf);
DBGLOG(INIT, INFO, "0:iBF / 1:eBF = %d\n", prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucTxBf);
DBGLOG(INIT, INFO, "0:SU / 1:MU = %d\n", prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucSU_MU);
DBGLOG(INIT, INFO, "DBW(0/1/2/3 BW20/40/80/160NC) = %d\n", prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucDBW);
DBGLOG(INIT, INFO, "RMSD = %d\n", prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucRMSD);
DBGLOG(INIT, INFO, "Nrow = %d, Ncol = %d, Ng = %d, LM = %d\n",
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucNrow,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucNcol,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucNgroup, prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucLM);
DBGLOG(INIT, INFO, "Mem1(%d, %d), Mem2(%d, %d), Mem3(%d, %d), Mem4(%d, %d)\n",
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucMemAddr1ColIdx,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucMemAddr1RowIdx,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucMemAddr2ColIdx,
(prEventPfmuTagRead->ru4TxBfPFMUTag1.
rField.ucMemAddr2RowIdx | (prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucMemAddr2RowIdxMsb << 5)),
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucMemAddr3ColIdx,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucMemAddr3RowIdx,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucMemAddr4ColIdx,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucMemAddr4RowIdx);
DBGLOG(INIT, INFO, "SNR STS0=0x%x, SNR STS1=0x%x, SNR STS2=0x%x, SNR STS3=0x%x\n",
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucSNR_STS0,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucSNR_STS1,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucSNR_STS2,
prEventPfmuTagRead->ru4TxBfPFMUTag1.rField.ucSNR_STS3);
DBGLOG(INIT, INFO, "===============================================================\n");
DBGLOG(INIT, INFO, "========================== (R)Tag2 info ==========================\n");
DBGLOG(INIT, INFO, " Row data0 : %x, Row data1 : %x, Row data2 : %x\n",
prEventPfmuTagRead->ru4TxBfPFMUTag2.au4RawData[0],
prEventPfmuTagRead->ru4TxBfPFMUTag2.au4RawData[1], prEventPfmuTagRead->ru4TxBfPFMUTag2.au4RawData[2]);
DBGLOG(INIT, INFO, "Smart Ant Cfg = %d\n", prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.u2SmartAnt);
DBGLOG(INIT, INFO, "SE index = %d\n", prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.ucSEIdx);
DBGLOG(INIT, INFO, "RMSD Threshold = %d\n", prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.ucRMSDThd);
DBGLOG(INIT, INFO, "MCS TH L1SS = %d, S1SS = %d, L2SS = %d, S2SS = %d\n"
"L3SS = %d, S3SS = %d\n",
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.ucMCSThL1SS,
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.ucMCSThS1SS,
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.ucMCSThL2SS,
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.ucMCSThS2SS,
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.ucMCSThL3SS,
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.ucMCSThS3SS);
DBGLOG(INIT, INFO, "iBF lifetime limit(unit:4ms) = 0x%x\n",
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.uciBfTimeOut);
DBGLOG(INIT, INFO, "iBF desired DBW = %d\n 0/1/2/3 : BW20/40/80/160NC\n",
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.uciBfDBW);
DBGLOG(INIT, INFO, "iBF desired Ncol = %d\n 0/1/2 : Ncol = 1 ~ 3\n",
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.uciBfNcol);
DBGLOG(INIT, INFO, "iBF desired Nrow = %d\n 0/1/2/3 : Nrow = 1 ~ 4\n",
prEventPfmuTagRead->ru4TxBfPFMUTag2.rField.uciBfNrow);
DBGLOG(INIT, INFO, "===============================================================\n");
}
#endif /* CFG_SUPPORT_TX_BF */
#if CFG_SUPPORT_MU_MIMO
VOID nicCmdEventGetQd(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
P_EVENT_HQA_GET_QD prEventHqaGetQd;
UINT_32 i;
P_PARAM_CUSTOM_GET_QD_STRUCT_T prGetQd = NULL;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
if (!pucEventBuf) {
DBGLOG(INIT, ERROR, "pucEventBuf is NULL.\n");
return;
}
if (!prCmdInfo->pvInformationBuffer) {
DBGLOG(INIT, ERROR, "prCmdInfo->pvInformationBuffer is NULL.\n");
return;
}
/* 4 <2> Update information of OID */
if (!prCmdInfo->fgIsOid) {
DBGLOG(INIT, ERROR, "cmd %u seq #%u not oid!\n",
prCmdInfo->ucCID, prCmdInfo->ucCmdSeqNum);
return;
}
prGlueInfo = prAdapter->prGlueInfo;
prEventHqaGetQd = (P_EVENT_HQA_GET_QD) (pucEventBuf);
prGetQd = (P_PARAM_CUSTOM_GET_QD_STRUCT_T) prCmdInfo->pvInformationBuffer;
kalMemCopy(prGetQd, prEventHqaGetQd, sizeof(EVENT_HQA_GET_QD));
u4QueryInfoLen = sizeof(CMD_MUMIMO_ACTION_T);
/* g_rPfmuTag1 = prPfumTagRead->ru4TxBfPFMUTag1; */
/* g_rPfmuTag2 = prPfumTagRead->ru4TxBfPFMUTag2; */
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
DBGLOG(INIT, INFO, " event id : %x\n", prGetQd->u4EventId);
for (i = 0; i < 14; i++)
DBGLOG(INIT, INFO, "au4RawData[%d]: %x\n", i, prGetQd->au4RawData[i]);
}
VOID nicCmdEventGetCalcLq(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
P_EVENT_HQA_GET_MU_CALC_LQ prEventHqaGetMuCalcLq;
UINT_32 i, j;
P_PARAM_CUSTOM_GET_MU_CALC_LQ_STRUCT_T prGetMuCalcLq = NULL;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
if (!pucEventBuf) {
DBGLOG(INIT, ERROR, "pucEventBuf is NULL.\n");
return;
}
if (!prCmdInfo->pvInformationBuffer) {
DBGLOG(INIT, ERROR, "prCmdInfo->pvInformationBuffer is NULL.\n");
return;
}
/* 4 <2> Update information of OID */
if (!prCmdInfo->fgIsOid) {
DBGLOG(INIT, ERROR, "cmd %u seq #%u not oid!\n",
prCmdInfo->ucCID, prCmdInfo->ucCmdSeqNum);
return;
}
prGlueInfo = prAdapter->prGlueInfo;
prEventHqaGetMuCalcLq = (P_EVENT_HQA_GET_MU_CALC_LQ) (pucEventBuf);
prGetMuCalcLq = (P_PARAM_CUSTOM_GET_MU_CALC_LQ_STRUCT_T) prCmdInfo->pvInformationBuffer;
kalMemCopy(prGetMuCalcLq, prEventHqaGetMuCalcLq, sizeof(EVENT_HQA_GET_MU_CALC_LQ));
u4QueryInfoLen = sizeof(CMD_MUMIMO_ACTION_T);
/* g_rPfmuTag1 = prPfumTagRead->ru4TxBfPFMUTag1; */
/* g_rPfmuTag2 = prPfumTagRead->ru4TxBfPFMUTag2; */
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
DBGLOG(INIT, INFO, " event id : %x\n", prGetMuCalcLq->u4EventId);
for (i = 0; i < NUM_OF_USER; i++)
for (j = 0; j < NUM_OF_MODUL; j++)
DBGLOG(INIT, INFO, " lq_report[%d][%d]: %x\n", i, j, prGetMuCalcLq->rEntry.lq_report[i][j]);
}
VOID nicCmdEventGetCalcInitMcs(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
P_EVENT_SHOW_GROUP_TBL_ENTRY prEventShowGroupTblEntry = NULL;
P_PARAM_CUSTOM_SHOW_GROUP_TBL_ENTRY_STRUCT_T prShowGroupTbl;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
if (!pucEventBuf) {
DBGLOG(INIT, ERROR, "pucEventBuf is NULL.\n");
return;
}
if (!prCmdInfo->pvInformationBuffer) {
DBGLOG(INIT, ERROR, "prCmdInfo->pvInformationBuffer is NULL.\n");
return;
}
/* 4 <2> Update information of OID */
if (!prCmdInfo->fgIsOid) {
DBGLOG(INIT, ERROR, "cmd %u seq #%u not oid!\n",
prCmdInfo->ucCID, prCmdInfo->ucCmdSeqNum);
return;
}
prGlueInfo = prAdapter->prGlueInfo;
prEventShowGroupTblEntry = (P_EVENT_SHOW_GROUP_TBL_ENTRY) (pucEventBuf);
prShowGroupTbl = (P_PARAM_CUSTOM_SHOW_GROUP_TBL_ENTRY_STRUCT_T) prCmdInfo->pvInformationBuffer;
kalMemCopy(prShowGroupTbl, prEventShowGroupTblEntry, sizeof(EVENT_SHOW_GROUP_TBL_ENTRY));
u4QueryInfoLen = sizeof(CMD_MUMIMO_ACTION_T);
/* g_rPfmuTag1 = prPfumTagRead->ru4TxBfPFMUTag1; */
/* g_rPfmuTag2 = prPfumTagRead->ru4TxBfPFMUTag2; */
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
DBGLOG(INIT, INFO, "========================== (R)Group table info ==========================\n");
DBGLOG(INIT, INFO, " event id : %x\n", prEventShowGroupTblEntry->u4EventId);
DBGLOG(INIT, INFO, "index = %x numUser = %x\n", prEventShowGroupTblEntry->index,
prEventShowGroupTblEntry->numUser);
DBGLOG(INIT, INFO, "BW = %x NS0/1/ = %x/%x\n", prEventShowGroupTblEntry->BW, prEventShowGroupTblEntry->NS0,
prEventShowGroupTblEntry->NS1);
DBGLOG(INIT, INFO, "PFIDUser0/1 = %x/%x\n", prEventShowGroupTblEntry->PFIDUser0,
prEventShowGroupTblEntry->PFIDUser1);
DBGLOG(INIT, INFO, "fgIsShortGI = %x, fgIsUsed = %x, fgIsDisable = %x\n", prEventShowGroupTblEntry->fgIsShortGI,
prEventShowGroupTblEntry->fgIsUsed, prEventShowGroupTblEntry->fgIsDisable);
DBGLOG(INIT, INFO, "initMcsUser0/1 = %x/%x\n", prEventShowGroupTblEntry->initMcsUser0,
prEventShowGroupTblEntry->initMcsUser1);
DBGLOG(INIT, INFO, "dMcsUser0: 0/1/ = %x/%x\n", prEventShowGroupTblEntry->dMcsUser0,
prEventShowGroupTblEntry->dMcsUser1);
}
#endif /* CFG_SUPPORT_MU_MIMO */
#endif /* CFG_SUPPORT_QA_TOOL */
VOID nicCmdEventQuerySwCtrlRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_PARAM_CUSTOM_SW_CTRL_STRUCT_T prSwCtrlInfo;
P_GLUE_INFO_T prGlueInfo;
P_CMD_SW_DBG_CTRL_T prCmdSwCtrl;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prCmdSwCtrl = (P_CMD_SW_DBG_CTRL_T) (pucEventBuf);
u4QueryInfoLen = sizeof(PARAM_CUSTOM_SW_CTRL_STRUCT_T);
prSwCtrlInfo = (P_PARAM_CUSTOM_SW_CTRL_STRUCT_T) prCmdInfo->pvInformationBuffer;
prSwCtrlInfo->u4Id = prCmdSwCtrl->u4Id;
prSwCtrlInfo->u4Data = prCmdSwCtrl->u4Data;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryChipConfig(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T prChipConfigInfo;
P_GLUE_INFO_T prGlueInfo;
P_CMD_CHIP_CONFIG_T prCmdChipConfig;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prCmdChipConfig = (P_CMD_CHIP_CONFIG_T) (pucEventBuf);
u4QueryInfoLen = sizeof(PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T);
if (prCmdInfo->u4InformationBufferLength < sizeof(PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T)) {
DBGLOG(REQ, INFO,
"Chip config u4InformationBufferLength %u is not valid (event)\n",
prCmdInfo->u4InformationBufferLength);
}
prChipConfigInfo = (P_PARAM_CUSTOM_CHIP_CONFIG_STRUCT_T) prCmdInfo->pvInformationBuffer;
prChipConfigInfo->ucRespType = prCmdChipConfig->ucRespType;
prChipConfigInfo->u2MsgSize = prCmdChipConfig->u2MsgSize;
DBGLOG(REQ, INFO, "%s: RespTyep %u\n", __func__, prChipConfigInfo->ucRespType);
DBGLOG(REQ, INFO, "%s: u2MsgSize %u\n", __func__, prChipConfigInfo->u2MsgSize);
#if 0
if (prChipConfigInfo->u2MsgSize > CHIP_CONFIG_RESP_SIZE) {
DBGLOG(REQ, INFO,
"Chip config Msg Size %u is not valid (event)\n", prChipConfigInfo->u2MsgSize);
prChipConfigInfo->u2MsgSize = CHIP_CONFIG_RESP_SIZE;
}
#endif
kalMemCopy(prChipConfigInfo->aucCmd, prCmdChipConfig->aucCmd, prChipConfigInfo->u2MsgSize);
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventSetCommon(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
ASSERT(prAdapter);
ASSERT(prCmdInfo);
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery,
prCmdInfo->u4InformationBufferLength, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventSetDisassociate(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
ASSERT(prAdapter);
ASSERT(prCmdInfo);
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
}
kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
#if !defined(LINUX)
prAdapter->fgIsRadioOff = TRUE;
#endif
}
VOID nicCmdEventSetIpAddress(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4Count;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
u4Count = (prCmdInfo->u4SetInfoLen - OFFSET_OF(CMD_SET_NETWORK_ADDRESS_LIST, arNetAddress))
/ sizeof(IPV4_NETWORK_ADDRESS);
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery,
OFFSET_OF(PARAM_NETWORK_ADDRESS_LIST, arAddress) + u4Count *
(OFFSET_OF(PARAM_NETWORK_ADDRESS, aucAddress) +
sizeof(PARAM_NETWORK_ADDRESS_IP)), WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryRfTestATInfo(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_TEST_STATUS prTestStatus, prQueryBuffer;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prTestStatus = (P_EVENT_TEST_STATUS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prQueryBuffer = (P_EVENT_TEST_STATUS) prCmdInfo->pvInformationBuffer;
kalMemCopy(prQueryBuffer, prTestStatus, sizeof(EVENT_TEST_STATUS));
u4QueryInfoLen = sizeof(EVENT_TEST_STATUS);
/* Update Query Information Length */
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryLinkQuality(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
PARAM_RSSI rRssi, *prRssi;
P_EVENT_LINK_QUALITY prLinkQuality;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prLinkQuality = (P_EVENT_LINK_QUALITY) pucEventBuf;
rRssi = (PARAM_RSSI) prLinkQuality->cRssi; /* ranged from (-128 ~ 30) in unit of dBm */
if (prAdapter->prAisBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
if (rRssi > PARAM_WHQL_RSSI_MAX_DBM)
rRssi = PARAM_WHQL_RSSI_MAX_DBM;
else if (rRssi < PARAM_WHQL_RSSI_MIN_DBM)
rRssi = PARAM_WHQL_RSSI_MIN_DBM;
} else {
rRssi = PARAM_WHQL_RSSI_MIN_DBM;
}
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prRssi = (PARAM_RSSI *) prCmdInfo->pvInformationBuffer;
kalMemCopy(prRssi, &rRssi, sizeof(PARAM_RSSI));
u4QueryInfoLen = sizeof(PARAM_RSSI);
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
/*----------------------------------------------------------------------------*/
/*!
* @brief This routine is in response of OID_GEN_LINK_SPEED query request
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the pending command info
* @param pucEventBuf
*
* @retval none
*/
/*----------------------------------------------------------------------------*/
VOID nicCmdEventQueryLinkSpeed(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_LINK_QUALITY prLinkQuality;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4LinkSpeed;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prLinkQuality = (P_EVENT_LINK_QUALITY) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
pu4LinkSpeed = (PUINT_32) (prCmdInfo->pvInformationBuffer);
*pu4LinkSpeed = prLinkQuality->u2LinkSpeed * 5000;
u4QueryInfoLen = sizeof(UINT_32);
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryStatistics(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_PARAM_802_11_STATISTICS_STRUCT_T prStatistics;
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
u4QueryInfoLen = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
prStatistics = (P_PARAM_802_11_STATISTICS_STRUCT_T) prCmdInfo->pvInformationBuffer;
prStatistics->u4Length = sizeof(PARAM_802_11_STATISTICS_STRUCT_T);
prStatistics->rTransmittedFragmentCount = prEventStatistics->rTransmittedFragmentCount;
prStatistics->rMulticastTransmittedFrameCount = prEventStatistics->rMulticastTransmittedFrameCount;
prStatistics->rFailedCount = prEventStatistics->rFailedCount;
prStatistics->rRetryCount = prEventStatistics->rRetryCount;
prStatistics->rMultipleRetryCount = prEventStatistics->rMultipleRetryCount;
prStatistics->rRTSSuccessCount = prEventStatistics->rRTSSuccessCount;
prStatistics->rRTSFailureCount = prEventStatistics->rRTSFailureCount;
prStatistics->rACKFailureCount = prEventStatistics->rACKFailureCount;
prStatistics->rFrameDuplicateCount = prEventStatistics->rFrameDuplicateCount;
prStatistics->rReceivedFragmentCount = prEventStatistics->rReceivedFragmentCount;
prStatistics->rMulticastReceivedFrameCount = prEventStatistics->rMulticastReceivedFrameCount;
prStatistics->rFCSErrorCount = prEventStatistics->rFCSErrorCount;
prStatistics->rTKIPLocalMICFailures.QuadPart = 0;
prStatistics->rTKIPICVErrors.QuadPart = 0;
prStatistics->rTKIPCounterMeasuresInvoked.QuadPart = 0;
prStatistics->rTKIPReplays.QuadPart = 0;
prStatistics->rCCMPFormatErrors.QuadPart = 0;
prStatistics->rCCMPReplays.QuadPart = 0;
prStatistics->rCCMPDecryptErrors.QuadPart = 0;
prStatistics->rFourWayHandshakeFailures.QuadPart = 0;
prStatistics->rWEPUndecryptableCount.QuadPart = 0;
prStatistics->rWEPICVErrorCount.QuadPart = 0;
prStatistics->rDecryptSuccessCount.QuadPart = 0;
prStatistics->rDecryptFailureCount.QuadPart = 0;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventEnterRfTest(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
ASSERT(prAdapter);
ASSERT(prCmdInfo);
/* [driver-land] */
/* prAdapter->fgTestMode = TRUE; */
if (prAdapter->fgTestMode)
prAdapter->fgTestMode = FALSE;
else
prAdapter->fgTestMode = TRUE;
/* 0. always indicate disconnection */
if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_DISCONNECTED)
kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
/* 1. Remove pending TX */
nicTxRelease(prAdapter, TRUE);
/* 1.1 clear pending Security / Management Frames */
kalClearSecurityFrames(prAdapter->prGlueInfo);
kalClearMgmtFrames(prAdapter->prGlueInfo);
/* 1.2 clear pending TX packet queued in glue layer */
kalFlushPendingTxPackets(prAdapter->prGlueInfo);
/* 2. Reset driver-domain FSMs */
nicUninitMGMT(prAdapter);
nicResetSystemService(prAdapter);
nicInitMGMT(prAdapter, NULL);
#if defined(_HIF_SDIO) && 0
/* 3. Disable Interrupt */
HAL_INTR_DISABLE(prAdapter);
/* 4. Block til firmware completed entering into RF test mode */
kalMsleep(500);
while (1) {
UINT_32 u4Value;
HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
if (u4Value & WCIR_WLAN_READY) {
break;
} else if (kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE || fgIsBusAccessFailed == TRUE) {
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery,
prCmdInfo->u4SetInfoLen, WLAN_STATUS_NOT_SUPPORTED);
}
return;
}
kalMsleep(10);
}
/* 5. Clear Interrupt Status */
{
UINT_32 u4WHISR = 0;
UINT_16 au2TxCount[16];
HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8)&u4WHISR);
if (HAL_IS_TX_DONE_INTR(u4WHISR))
HAL_READ_TX_RELEASED_COUNT(prAdapter, au2TxCount);
}
/* 6. Reset TX Counter */
nicTxResetResource(prAdapter);
/* 7. Re-enable Interrupt */
HAL_INTR_ENABLE(prAdapter);
#endif
/* 8. completion indication */
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery, prCmdInfo->u4SetInfoLen, WLAN_STATUS_SUCCESS);
}
#if CFG_SUPPORT_NVRAM
/* 9. load manufacture data */
if (kalIsConfigurationExist(prAdapter->prGlueInfo) == TRUE)
wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
else
DBGLOG(REQ, WARN, "%s: load manufacture data fail\n", __func__);
#endif
}
VOID nicCmdEventLeaveRfTest(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
#if defined(_HIF_SDIO) && 0
UINT_32 u4WHISR = 0;
UINT_16 au2TxCount[16];
UINT_32 u4Value;
/* 1. Disable Interrupt */
HAL_INTR_DISABLE(prAdapter);
/* 2. Block until firmware completed leaving from RF test mode */
kalMsleep(500);
while (1) {
HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);
if (u4Value & WCIR_WLAN_READY) {
break;
} else if (kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE || fgIsBusAccessFailed == TRUE) {
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery,
prCmdInfo->u4SetInfoLen, WLAN_STATUS_NOT_SUPPORTED);
}
return;
}
kalMsleep(10);
}
/* 3. Clear Interrupt Status */
HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8)&u4WHISR);
if (HAL_IS_TX_DONE_INTR(u4WHISR))
HAL_READ_TX_RELEASED_COUNT(prAdapter, au2TxCount);
/* 4. Reset TX Counter */
nicTxResetResource(prAdapter);
/* 5. Re-enable Interrupt */
HAL_INTR_ENABLE(prAdapter);
#endif
/* 6. set driver-land variable */
prAdapter->fgTestMode = FALSE;
prAdapter->fgIcapMode = FALSE;
/* 7. completion indication */
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery, prCmdInfo->u4SetInfoLen, WLAN_STATUS_SUCCESS);
}
/* 8. Indicate as disconnected */
if (kalGetMediaStateIndicated(prAdapter->prGlueInfo) != PARAM_MEDIA_STATE_DISCONNECTED) {
kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_DISCONNECT, NULL, 0);
prAdapter->rWlanInfo.u4SysTime = kalGetTimeTick();
}
#if CFG_SUPPORT_NVRAM
/* 9. load manufacture data */
if (kalIsConfigurationExist(prAdapter->prGlueInfo) == TRUE)
wlanLoadManufactureData(prAdapter, kalGetConfiguration(prAdapter->prGlueInfo));
else
DBGLOG(REQ, WARN, "%s: load manufacture data fail\n", __func__);
#endif
/* 10. Override network address */
wlanUpdateNetworkAddress(prAdapter);
}
VOID nicCmdEventQueryMcastAddr(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
P_EVENT_MAC_MCAST_ADDR prEventMacMcastAddr;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prEventMacMcastAddr = (P_EVENT_MAC_MCAST_ADDR) (pucEventBuf);
u4QueryInfoLen = prEventMacMcastAddr->u4NumOfGroupAddr * MAC_ADDR_LEN;
/* buffer length check */
if (prCmdInfo->u4InformationBufferLength < u4QueryInfoLen) {
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_BUFFER_TOO_SHORT);
} else {
kalMemCopy(prCmdInfo->pvInformationBuffer,
prEventMacMcastAddr->arAddress,
prEventMacMcastAddr->u4NumOfGroupAddr * MAC_ADDR_LEN);
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
}
VOID nicCmdEventQueryEepromRead(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T prEepromRdInfo;
P_GLUE_INFO_T prGlueInfo;
P_EVENT_ACCESS_EEPROM prEventAccessEeprom;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prEventAccessEeprom = (P_EVENT_ACCESS_EEPROM) (pucEventBuf);
u4QueryInfoLen = sizeof(PARAM_CUSTOM_EEPROM_RW_STRUCT_T);
prEepromRdInfo = (P_PARAM_CUSTOM_EEPROM_RW_STRUCT_T) prCmdInfo->pvInformationBuffer;
prEepromRdInfo->ucEepromIndex = (UINT_8) (prEventAccessEeprom->u2Offset);
prEepromRdInfo->u2EepromData = prEventAccessEeprom->u2Data;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventSetMediaStreamMode(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
PARAM_MEDIA_STREAMING_INDICATION rParamMediaStreamIndication;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery, prCmdInfo->u4SetInfoLen, WLAN_STATUS_SUCCESS);
}
rParamMediaStreamIndication.rStatus.eStatusType = ENUM_STATUS_TYPE_MEDIA_STREAM_MODE;
rParamMediaStreamIndication.eMediaStreamMode =
prAdapter->rWlanInfo.eLinkAttr.ucMediaStreamMode == 0 ? ENUM_MEDIA_STREAM_OFF : ENUM_MEDIA_STREAM_ON;
kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
(PVOID)&rParamMediaStreamIndication, sizeof(PARAM_MEDIA_STREAMING_INDICATION));
}
VOID nicCmdEventSetStopSchedScan(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
/*
* DBGLOG(SCN, INFO, "--->nicCmdEventSetStopSchedScan\n" ));
*/
ASSERT(prAdapter);
ASSERT(prCmdInfo);
/*
* DBGLOG(SCN, INFO, "<--kalSchedScanStopped\n" );
*/
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery, prCmdInfo->u4InformationBufferLength, WLAN_STATUS_SUCCESS);
}
DBGLOG(SCN, INFO, "nicCmdEventSetStopSchedScan OID done, release lock and send event to uplayer\n");
/*Due to dead lock issue, need to release the IO control before calling kernel APIs */
kalSchedScanStopped(prAdapter->prGlueInfo);
}
/* Statistics responder */
VOID nicCmdEventQueryXmitOk(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = (UINT_32) prEventStatistics->rTransmittedFragmentCount.QuadPart;
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = prEventStatistics->rTransmittedFragmentCount.QuadPart;
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryRecvOk(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = (UINT_32) prEventStatistics->rReceivedFragmentCount.QuadPart;
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = prEventStatistics->rReceivedFragmentCount.QuadPart;
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryXmitError(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = (UINT_32) prEventStatistics->rFailedCount.QuadPart;
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = (UINT_64) prEventStatistics->rFailedCount.QuadPart;
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryRecvError(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = (UINT_32) prEventStatistics->rFCSErrorCount.QuadPart;
/* @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated */
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = prEventStatistics->rFCSErrorCount.QuadPart;
/* @FIXME, RX_ERROR_DROP_COUNT/RX_FIFO_FULL_DROP_COUNT is not calculated */
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryRecvNoBuffer(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = 0; /* @FIXME? */
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = 0; /* @FIXME? */
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryRecvCrcError(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = (UINT_32) prEventStatistics->rFCSErrorCount.QuadPart;
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = prEventStatistics->rFCSErrorCount.QuadPart;
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryRecvErrorAlignment(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = (UINT_32) 0; /* @FIXME */
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = 0; /* @FIXME */
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryXmitOneCollision(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data =
(UINT_32) (prEventStatistics->rMultipleRetryCount.QuadPart -
prEventStatistics->rRetryCount.QuadPart);
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data =
(UINT_64) (prEventStatistics->rMultipleRetryCount.QuadPart -
prEventStatistics->rRetryCount.QuadPart);
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryXmitMoreCollisions(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = (UINT_32) prEventStatistics->rMultipleRetryCount.QuadPart;
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = (UINT_64) prEventStatistics->rMultipleRetryCount.QuadPart;
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryXmitMaxCollisions(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_EVENT_STATISTICS prEventStatistics;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
PUINT_32 pu4Data;
PUINT_64 pu8Data;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventStatistics = (P_EVENT_STATISTICS) pucEventBuf;
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
if (prCmdInfo->u4InformationBufferLength == sizeof(UINT_32)) {
u4QueryInfoLen = sizeof(UINT_32);
pu4Data = (PUINT_32) prCmdInfo->pvInformationBuffer;
*pu4Data = (UINT_32) prEventStatistics->rFailedCount.QuadPart;
} else {
u4QueryInfoLen = sizeof(UINT_64);
pu8Data = (PUINT_64) prCmdInfo->pvInformationBuffer;
*pu8Data = (UINT_64) prEventStatistics->rFailedCount.QuadPart;
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when command by OID/ioctl has been timeout
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the command information
*
* @return TRUE
* FALSE
*/
/*----------------------------------------------------------------------------*/
VOID nicOidCmdTimeoutCommon(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo)
{
ASSERT(prAdapter);
if (prCmdInfo->fgIsOid)
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_FAILURE);
}
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is a generic command timeout handler
*
* @param pfnOidHandler Pointer to the OID handler
*
* @return none
*/
/*----------------------------------------------------------------------------*/
VOID nicCmdTimeoutCommon(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo)
{
ASSERT(prAdapter);
}
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when command for entering RF test has
* failed sending due to timeout (highly possibly by firmware crash)
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the command information
*
* @return none
*
*/
/*----------------------------------------------------------------------------*/
VOID nicOidCmdEnterRFTestTimeout(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo)
{
ASSERT(prAdapter);
/* 1. Remove pending TX frames */
nicTxRelease(prAdapter, TRUE);
/* 1.1 clear pending Security / Management Frames */
kalClearSecurityFrames(prAdapter->prGlueInfo);
kalClearMgmtFrames(prAdapter->prGlueInfo);
/* 1.2 clear pending TX packet queued in glue layer */
kalFlushPendingTxPackets(prAdapter->prGlueInfo);
/* 2. indicate for OID failure */
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_FAILURE);
}
#if CFG_SUPPORT_QA_TOOL
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when received dump memory event packet.
* transfer the memory data to the IQ format data and write into file
*
* @param prIQAry Pointer to the array store I or Q data.
* prDataLen The return data length - bytes
* u4IQ 0: get I data
* 1 : get Q data
*
* @return -1: open file error
*
*/
/*----------------------------------------------------------------------------*/
INT_32 GetIQData(INT_32 **prIQAry, UINT_32 *prDataLen, UINT_32 u4IQ, UINT_32 u4GetWf1)
{
UINT_8 aucPath[50]; /* the path for iq data dump out */
UINT_8 aucData[50]; /* iq data in string format */
UINT_32 i = 0, j = 0, count = 0;
INT_32 ret = -1;
INT_32 rv;
struct file *file = NULL;
*prIQAry = g_au4IQData;
/* sprintf(aucPath, "/pattern.txt"); // CSD's Pattern */
snprintf(aucPath, sizeof(aucPath), "/tmp/dump_out_%05ld_WF%d.txt", (g_u2DumpIndex - 1), u4GetWf1);
if (kalCheckPath(aucPath) == -1)
snprintf(aucPath, sizeof(aucPath), "/data/dump_out_%05ld_WF%d.txt", (g_u2DumpIndex - 1), u4GetWf1);
DBGLOG(INIT, INFO, "iCap Read Dump File dump_out_%05ld_WF%d.txt\n", (g_u2DumpIndex - 1), u4GetWf1);
file = kalFileOpen(aucPath, O_RDONLY, 0);
if ((file != NULL) && !IS_ERR(file)) {
/* read 1K data per time */
for (i = 0; i < RTN_IQ_DATA_LEN / sizeof(UINT_32);
i++, g_au4Offset[u4GetWf1][u4IQ] += IQ_FILE_LINE_OFFSET) {
if (kalFileRead(file, g_au4Offset[u4GetWf1][u4IQ], aucData, IQ_FILE_IQ_STR_LEN) == 0)
break;
count = 0;
for (j = 0; j < 8; j++) {
if (aucData[j] != ' ')
aucData[count++] = aucData[j];
}
aucData[count] = '\0';
rv = kstrtoint(aucData, 0, &g_au4IQData[i]); /* transfer data format (string to int) */
}
*prDataLen = i * sizeof(UINT_32);
kalFileClose(file);
ret = 0;
}
DBGLOG(INIT, INFO, "MT6632 : QA_AGENT GetIQData prDataLen = %d\n", *prDataLen);
DBGLOG(INIT, INFO, "MT6632 : QA_AGENT GetIQData i = %d\n", i);
return ret;
}
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when received dump memory event packet.
* transfer the memory data to the IQ format data and write into file
*
* @param prEventDumpMem Pointer to the event dump memory structure.
*
* @return 0: SUCCESS, -1: FAIL
*
*/
/*----------------------------------------------------------------------------*/
UINT_32 TsfRawData2IqFmt(P_EVENT_DUMP_MEM_T prEventDumpMem)
{
static UINT_8 aucPathWF0[40]; /* the path for iq data dump out */
static UINT_8 aucPathWF1[40]; /* the path for iq data dump out */
static UINT_8 aucPathRAWWF0[40]; /* the path for iq data dump out */
static UINT_8 aucPathRAWWF1[40]; /* the path for iq data dump out */
PUINT_8 pucDataWF0 = NULL; /* the data write into file */
PUINT_8 pucDataWF1 = NULL; /* the data write into file */
PUINT_8 pucDataRAWWF0 = NULL; /* the data write into file */
PUINT_8 pucDataRAWWF1 = NULL; /* the data write into file */
UINT_32 u4SrcOffset; /* record the buffer offset */
UINT_32 u4FmtLen = 0; /* bus format length */
UINT_32 u4CpyLen = 0;
UINT_32 u4RemainByte;
UINT_32 u4DataWBufSize = 150;
UINT_32 u4DataRAWWBufSize = 150;
UINT_32 u4DataWLenF0 = 0;
UINT_32 u4DataWLenF1 = 0;
UINT_32 u4DataRAWWLenF0 = 0;
UINT_32 u4DataRAWWLenF1 = 0;
BOOLEAN fgAppend;
INT_32 u4Iqc160WF0Q0, u4Iqc160WF1I1;
static UINT_8 ucDstOffset; /* for alignment. bcs we send 2KB data per packet,*/
/*the data will not align in 12 bytes case. */
static UINT_32 u4CurTimeTick;
static ICAP_BUS_FMT icapBusData;
UINT_32 *ptr;
pucDataWF0 = kmalloc(u4DataWBufSize, GFP_KERNEL);
pucDataWF1 = kmalloc(u4DataWBufSize, GFP_KERNEL);
pucDataRAWWF0 = kmalloc(u4DataRAWWBufSize, GFP_KERNEL);
pucDataRAWWF1 = kmalloc(u4DataRAWWBufSize, GFP_KERNEL);
if ((!pucDataWF0) || (!pucDataWF1) || (!pucDataRAWWF0) || (!pucDataRAWWF1)) {
DBGLOG(INIT, ERROR, "kmalloc failed.\n");
kfree(pucDataWF0);
kfree(pucDataWF1);
kfree(pucDataRAWWF0);
kfree(pucDataRAWWF1);
ASSERT(-1);
return -1;
}
fgAppend = TRUE;
if (prEventDumpMem->ucFragNum == 1) {
u4CurTimeTick = kalGetTimeTick();
/* Store memory dump into sdcard,
* path /sdcard/dump_<current system tick>_<memory address>_<memory length>.hex
*/
#if defined(LINUX)
/*if blbist mkdir undre /data/blbist, the dump files wouls put on it */
scnprintf(aucPathWF0, sizeof(aucPathWF0), "/tmp/dump_out_%05ld_WF0.txt", g_u2DumpIndex);
scnprintf(aucPathWF1, sizeof(aucPathWF1), "/tmp/dump_out_%05ld_WF1.txt", g_u2DumpIndex);
if (kalCheckPath(aucPathWF0) == -1) {
kalMemSet(aucPathWF0, 0x00, sizeof(aucPathWF0));
scnprintf(aucPathWF0, sizeof(aucPathWF0), "/data/dump_out_%05ld_WF0.txt", g_u2DumpIndex);
} else
kalTrunkPath(aucPathWF0);
if (kalCheckPath(aucPathWF1) == -1) {
kalMemSet(aucPathWF1, 0x00, sizeof(aucPathWF1));
scnprintf(aucPathWF1, sizeof(aucPathWF1), "/data/dump_out_%05ld_WF1.txt", g_u2DumpIndex);
} else
kalTrunkPath(aucPathWF1);
scnprintf(aucPathRAWWF0, sizeof(aucPathRAWWF0), "/dump_RAW_%05ld_WF0.txt", g_u2DumpIndex);
scnprintf(aucPathRAWWF1, sizeof(aucPathRAWWF1), "/dump_RAW_%05ld_WF1.txt", g_u2DumpIndex);
if (kalCheckPath(aucPathRAWWF0) == -1) {
kalMemSet(aucPathRAWWF0, 0x00, sizeof(aucPathRAWWF0));
scnprintf(aucPathRAWWF0, sizeof(aucPathRAWWF0), "/data/dump_RAW_%05ld_WF0.txt", g_u2DumpIndex);
} else
kalTrunkPath(aucPathRAWWF0);
if (kalCheckPath(aucPathRAWWF1) == -1) {
kalMemSet(aucPathRAWWF1, 0x00, sizeof(aucPathRAWWF1));
scnprintf(aucPathRAWWF1, sizeof(aucPathRAWWF1), "/data/dump_RAW_%05ld_WF1.txt", g_u2DumpIndex);
} else
kalTrunkPath(aucPathRAWWF1);
#else
kal_sprintf_ddk(aucPathWF0, sizeof(aucPathWF0),
u4CurTimeTick,
prEventDumpMem->u4Address, prEventDumpMem->u4Length + prEventDumpMem->u4RemainLength);
kal_sprintf_ddk(aucPathWF1, sizeof(aucPathWF1),
u4CurTimeTick,
prEventDumpMem->u4Address, prEventDumpMem->u4Length + prEventDumpMem->u4RemainLength);
#endif
/* fgAppend = FALSE; */
}
ptr = (PUINT_32)(&prEventDumpMem->aucBuffer[0]);
/*DBGLOG(INIT, INFO, ": ==> (prEventDumpMem = %08x %08x %08x)\n", *(ptr), *(ptr + 4), *(ptr + 8));*/
/*DBGLOG(INIT, INFO, ": ==> (prEventDumpMem->eIcapContent = %x)\n", prEventDumpMem->eIcapContent);*/
for (u4SrcOffset = 0, u4RemainByte = prEventDumpMem->u4Length; u4RemainByte > 0;) {
u4FmtLen =
(prEventDumpMem->eIcapContent == ICAP_CONTENT_SPECTRUM) ? sizeof(SPECTRUM_BUS_FMT_T) : sizeof(ICAP_BUS_FMT);
/* 4 bytes : 12 bytes */
u4CpyLen = (u4RemainByte - u4FmtLen >= 0) ? u4FmtLen : u4RemainByte;
if ((ucDstOffset + u4CpyLen) > sizeof(icapBusData)) {
DBGLOG(INIT, ERROR,
"ucDstOffset(%u) + u4CpyLen(%u) exceed bound of icapBusData\n",
ucDstOffset, u4CpyLen);
kfree(pucDataWF0);
kfree(pucDataWF1);
kfree(pucDataRAWWF0);
kfree(pucDataRAWWF1);
ASSERT(-1);
return -1;
}
memcpy((UINT_8 *)&icapBusData + ucDstOffset, &prEventDumpMem->aucBuffer[0] + u4SrcOffset, u4CpyLen);
#if 0
if (prEventDumpMem->eIcapContent == ICAP_CONTENT_ADC) {
sprintf(aucDataWF0, "%8d,%8d\n", icapBusData.rAdcBusData.u4Dcoc0I,
icapBusData.rAdcBusData.u4Dcoc0Q);
sprintf(aucDataWF1, "%8d,%8d\n", icapBusData.rAdcBusData.u4Dcoc1I,
icapBusData.rAdcBusData.u4Dcoc1Q);
}
#endif
if (prEventDumpMem->eIcapContent == ICAP_CONTENT_FIIQ ||
prEventDumpMem->eIcapContent == ICAP_CONTENT_FDIQ) {
u4DataWLenF0 = scnprintf(pucDataWF0, u4DataWBufSize, "%8d,%8d\n",
icapBusData.rIqcBusData.u4Iqc0I,
icapBusData.rIqcBusData.u4Iqc0Q);
u4DataWLenF1 = scnprintf(pucDataWF1, u4DataWBufSize, "%8d,%8d\n",
icapBusData.rIqcBusData.u4Iqc1I,
icapBusData.rIqcBusData.u4Iqc1Q);
} else if (prEventDumpMem->eIcapContent - 1000 == ICAP_CONTENT_FIIQ
|| prEventDumpMem->eIcapContent - 1000 == ICAP_CONTENT_FDIQ) {
u4Iqc160WF0Q0 =
icapBusData.rIqc160BusData.u4Iqc0Q0P1 | (icapBusData.rIqc160BusData.u4Iqc0Q0P2 << 8);
u4Iqc160WF1I1 =
icapBusData.rIqc160BusData.u4Iqc1I1P1 | (icapBusData.rIqc160BusData.u4Iqc1I1P2 << 4);
u4DataWLenF0 = scnprintf(pucDataWF0, u4DataWBufSize, "%8d,%8d\n%8d,%8d\n",
icapBusData.rIqc160BusData.u4Iqc0I0, u4Iqc160WF0Q0,
icapBusData.rIqc160BusData.u4Iqc0I1,
icapBusData.rIqc160BusData.u4Iqc0Q1);
u4DataWLenF1 = scnprintf(pucDataWF1, u4DataWBufSize, "%8d,%8d\n%8d,%8d\n",
icapBusData.rIqc160BusData.u4Iqc1I0,
icapBusData.rIqc160BusData.u4Iqc1Q0, u4Iqc160WF1I1,
icapBusData.rIqc160BusData.u4Iqc1Q1);
} else if (prEventDumpMem->eIcapContent == ICAP_CONTENT_SPECTRUM) {
u4DataWLenF0 = scnprintf(pucDataWF0, u4DataWBufSize, "%8d,%8d\n",
icapBusData.rSpectrumBusData.u4DcocI,
icapBusData.rSpectrumBusData.u4DcocQ);
} else if (prEventDumpMem->eIcapContent == ICAP_CONTENT_ADC) {
u4DataWLenF0 = scnprintf(pucDataWF0, u4DataWBufSize,
"%8d,%8d\n%8d,%8d\n%8d,%8d\n%8d,%8d\n%8d,%8d\n%8d,%8d\n",
icapBusData.rPackedAdcBusData.u4AdcI0T0,
icapBusData.rPackedAdcBusData.u4AdcQ0T0,
icapBusData.rPackedAdcBusData.u4AdcI0T1,
icapBusData.rPackedAdcBusData.u4AdcQ0T1,
icapBusData.rPackedAdcBusData.u4AdcI0T2,
icapBusData.rPackedAdcBusData.u4AdcQ0T2,
icapBusData.rPackedAdcBusData.u4AdcI0T3,
icapBusData.rPackedAdcBusData.u4AdcQ0T3,
icapBusData.rPackedAdcBusData.u4AdcI0T4,
icapBusData.rPackedAdcBusData.u4AdcQ0T4,
icapBusData.rPackedAdcBusData.u4AdcI0T5,
icapBusData.rPackedAdcBusData.u4AdcQ0T5);
u4DataWLenF1 = scnprintf(pucDataWF1, u4DataWBufSize,
"%8d,%8d\n%8d,%8d\n%8d,%8d\n%8d,%8d\n%8d,%8d\n%8d,%8d\n",
icapBusData.rPackedAdcBusData.u4AdcI1T0,
icapBusData.rPackedAdcBusData.u4AdcQ1T0,
icapBusData.rPackedAdcBusData.u4AdcI1T1,
icapBusData.rPackedAdcBusData.u4AdcQ1T1,
icapBusData.rPackedAdcBusData.u4AdcI1T2,
icapBusData.rPackedAdcBusData.u4AdcQ1T2,
icapBusData.rPackedAdcBusData.u4AdcI1T3,
icapBusData.rPackedAdcBusData.u4AdcQ1T3,
icapBusData.rPackedAdcBusData.u4AdcI1T4,
icapBusData.rPackedAdcBusData.u4AdcQ1T4,
icapBusData.rPackedAdcBusData.u4AdcI1T5,
icapBusData.rPackedAdcBusData.u4AdcQ1T5);
} else if (prEventDumpMem->eIcapContent - 2000 == ICAP_CONTENT_ADC) {
u4DataWLenF0 = scnprintf(pucDataWF0, u4DataWBufSize, "%8d,%8d\n%8d,%8d\n%8d,%8d\n",
icapBusData.rPackedAdcBusData.u4AdcI0T0,
icapBusData.rPackedAdcBusData.u4AdcQ0T0,
icapBusData.rPackedAdcBusData.u4AdcI0T1,
icapBusData.rPackedAdcBusData.u4AdcQ0T1,
icapBusData.rPackedAdcBusData.u4AdcI0T2,
icapBusData.rPackedAdcBusData.u4AdcQ0T2);
u4DataWLenF1 = scnprintf(pucDataWF1, u4DataWBufSize, "%8d,%8d\n%8d,%8d\n%8d,%8d\n",
icapBusData.rPackedAdcBusData.u4AdcI1T0,
icapBusData.rPackedAdcBusData.u4AdcQ1T0,
icapBusData.rPackedAdcBusData.u4AdcI1T1,
icapBusData.rPackedAdcBusData.u4AdcQ1T1,
icapBusData.rPackedAdcBusData.u4AdcI1T2,
icapBusData.rPackedAdcBusData.u4AdcQ1T2);
} else if (prEventDumpMem->eIcapContent == ICAP_CONTENT_TOAE) {
/* actually, this is DCOC. we take TOAE as DCOC */
u4DataWLenF0 = scnprintf(pucDataWF0, u4DataWBufSize, "%8d,%8d\n",
icapBusData.rAdcBusData.u4Dcoc0I, icapBusData.rAdcBusData.u4Dcoc0Q);
u4DataWLenF1 = scnprintf(pucDataWF1, u4DataWBufSize, "%8d,%8d\n",
icapBusData.rAdcBusData.u4Dcoc1I, icapBusData.rAdcBusData.u4Dcoc1Q);
}
if (u4CpyLen == u4FmtLen) { /* the data format is complete */
kalWriteToFile(aucPathWF0, fgAppend, pucDataWF0, u4DataWLenF0);
kalWriteToFile(aucPathWF1, fgAppend, pucDataWF1, u4DataWLenF1);
}
ptr = (PUINT_32)(&prEventDumpMem->aucBuffer[0] + u4SrcOffset);
u4DataRAWWLenF0 = scnprintf(pucDataRAWWF0, u4DataWBufSize, "%08x%08x%08x\n",
*(ptr + 2), *(ptr + 1), *ptr);
kalWriteToFile(aucPathRAWWF0, fgAppend, pucDataRAWWF0, u4DataRAWWLenF0);
kalWriteToFile(aucPathRAWWF1, fgAppend, pucDataRAWWF1, u4DataRAWWLenF1);
u4RemainByte -= u4CpyLen;
u4SrcOffset += u4CpyLen; /* shift offset */
ucDstOffset = 0; /* only use ucDstOffset at first packet for align 2KB */
}
/* if this is a last packet, we can't transfer the remain data.
* bcs we can't guarantee the data is complete align data format
*/
if (u4CpyLen != u4FmtLen) { /* the data format is complete */
ucDstOffset = u4CpyLen; /* not align 2KB, keep the data and next packet data will append it */
}
kfree(pucDataWF0);
kfree(pucDataWF1);
kfree(pucDataRAWWF0);
kfree(pucDataRAWWF1);
if (u4RemainByte < 0) {
ASSERT(-1);
return -1;
}
return 0;
}
#endif /* CFG_SUPPORT_QA_TOOL */
#if CFG_SUPPORT_CAL_RESULT_BACKUP_TO_HOST
VOID nicCmdEventQueryCalBackupV2(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_PARAM_CAL_BACKUP_STRUCT_V2_T prCalBackupDataV2Info;
P_CMD_CAL_BACKUP_STRUCT_V2_T prEventCalBackupDataV2;
UINT_32 u4QueryInfoLen, u4QueryInfo, u4TempAddress;
P_GLUE_INFO_T prGlueInfo;
DBGLOG(RFTEST, INFO, "%s\n", __func__);
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
prGlueInfo = prAdapter->prGlueInfo;
prEventCalBackupDataV2 = (P_CMD_CAL_BACKUP_STRUCT_V2_T) (pucEventBuf);
u4QueryInfoLen = sizeof(CMD_CAL_BACKUP_STRUCT_V2_T);
prCalBackupDataV2Info = (P_PARAM_CAL_BACKUP_STRUCT_V2_T) prCmdInfo->pvInformationBuffer;
#if 0
DBGLOG(RFTEST, INFO, "============ Receive a Cal Data EVENT (Info) ============\n");
DBGLOG(RFTEST, INFO, "Reason = %d\n", prEventCalBackupDataV2->ucReason);
DBGLOG(RFTEST, INFO, "Action = %d\n", prEventCalBackupDataV2->ucAction);
DBGLOG(RFTEST, INFO, "NeedResp = %d\n", prEventCalBackupDataV2->ucNeedResp);
DBGLOG(RFTEST, INFO, "FragNum = %d\n", prEventCalBackupDataV2->ucFragNum);
DBGLOG(RFTEST, INFO, "RomRam = %d\n", prEventCalBackupDataV2->ucRomRam);
DBGLOG(RFTEST, INFO, "ThermalValue = %d\n", prEventCalBackupDataV2->u4ThermalValue);
DBGLOG(RFTEST, INFO, "Address = 0x%08x\n", prEventCalBackupDataV2->u4Address);
DBGLOG(RFTEST, INFO, "Length = %d\n", prEventCalBackupDataV2->u4Length);
DBGLOG(RFTEST, INFO, "RemainLength = %d\n", prEventCalBackupDataV2->u4RemainLength);
DBGLOG(RFTEST, INFO, "=========================================================\n");
#endif
if (prEventCalBackupDataV2->ucReason == 0 && prEventCalBackupDataV2->ucAction == 0) {
DBGLOG(RFTEST, INFO, "Received an EVENT for Query Thermal Temp.\n");
prCalBackupDataV2Info->u4ThermalValue = prEventCalBackupDataV2->u4ThermalValue;
g_rBackupCalDataAllV2.u4ThermalInfo = prEventCalBackupDataV2->u4ThermalValue;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
} else if (prEventCalBackupDataV2->ucReason == 0 && prEventCalBackupDataV2->ucAction == 1) {
DBGLOG(RFTEST, INFO, "Received an EVENT for Query Total Cal Data Length.\n");
prCalBackupDataV2Info->u4Length = prEventCalBackupDataV2->u4Length;
if (prEventCalBackupDataV2->ucRomRam == 0)
g_rBackupCalDataAllV2.u4ValidRomCalDataLength = prEventCalBackupDataV2->u4Length;
else if (prEventCalBackupDataV2->ucRomRam == 1)
g_rBackupCalDataAllV2.u4ValidRamCalDataLength = prEventCalBackupDataV2->u4Length;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
} else if (prEventCalBackupDataV2->ucReason == 2 && prEventCalBackupDataV2->ucAction == 4) {
DBGLOG(RFTEST, INFO, "Received an EVENT for Query All Cal (%s) Data. FragNum = %d\n",
prCalBackupDataV2Info->ucRomRam == 0 ? "ROM" : "RAM",
prEventCalBackupDataV2->ucFragNum);
prCalBackupDataV2Info->u4Address = prEventCalBackupDataV2->u4Address;
prCalBackupDataV2Info->u4Length = prEventCalBackupDataV2->u4Length;
prCalBackupDataV2Info->u4RemainLength = prEventCalBackupDataV2->u4RemainLength;
prCalBackupDataV2Info->ucFragNum = prEventCalBackupDataV2->ucFragNum;
/* Copy Cal Data From FW to Driver Array */
if (prEventCalBackupDataV2->ucRomRam == 0) {
u4TempAddress = prEventCalBackupDataV2->u4Address;
kalMemCopy((PUINT_8)(g_rBackupCalDataAllV2.au4RomCalData) + u4TempAddress,
(PUINT_8)(prEventCalBackupDataV2->au4Buffer),
prEventCalBackupDataV2->u4Length);
} else if (prEventCalBackupDataV2->ucRomRam == 1) {
u4TempAddress = prEventCalBackupDataV2->u4Address;
kalMemCopy((PUINT_8)(g_rBackupCalDataAllV2.au4RamCalData) + u4TempAddress,
(PUINT_8)(prEventCalBackupDataV2->au4Buffer),
prEventCalBackupDataV2->u4Length);
}
if (prEventCalBackupDataV2->u4Address == 0xFFFFFFFF) {
DBGLOG(RFTEST, INFO, "RLM CMD : Address Error!!!!!!!!!!!\n");
} else if (prEventCalBackupDataV2->u4RemainLength == 0
&& prEventCalBackupDataV2->ucRomRam == 1) {
DBGLOG(RFTEST, INFO, "RLM CMD : Get Cal Data from FW (%s). Finish!!!!!!!!!!!\n",
prCalBackupDataV2Info->ucRomRam == 0 ? "ROM" : "RAM");
} else if (prEventCalBackupDataV2->u4RemainLength == 0
&& prEventCalBackupDataV2->ucRomRam == 0) {
DBGLOG(RFTEST, INFO, "RLM CMD : Get Cal Data from FW (%s). Finish!!!!!!!!!!!\n",
prCalBackupDataV2Info->ucRomRam == 0 ? "ROM" : "RAM");
prCalBackupDataV2Info->ucFragNum = 0;
prCalBackupDataV2Info->ucRomRam = 1;
prCalBackupDataV2Info->u4ThermalValue = 0;
prCalBackupDataV2Info->u4Address = 0;
prCalBackupDataV2Info->u4Length = 0;
prCalBackupDataV2Info->u4RemainLength = 0;
DBGLOG(RFTEST, INFO, "RLM CMD : Get Cal Data from FW (%s). Start!!!!!!!!!!!!!!!!\n",
prCalBackupDataV2Info->ucRomRam == 0 ? "ROM" : "RAM");
DBGLOG(RFTEST, INFO, "Thermal Temp = %d\n", g_rBackupCalDataAllV2.u4ThermalInfo);
wlanoidQueryCalBackupV2(prAdapter,
prCalBackupDataV2Info,
sizeof(PARAM_CAL_BACKUP_STRUCT_V2_T),
&u4QueryInfo);
} else {
wlanoidSendCalBackupV2Cmd(prAdapter,
prCmdInfo->pvInformationBuffer, prCmdInfo->u4InformationBufferLength);
}
} else if (prEventCalBackupDataV2->ucReason == 3 && prEventCalBackupDataV2->ucAction == 5) {
DBGLOG(RFTEST, INFO,
"Received an EVENT for Send All Cal Data. FragNum = %d\n",
prEventCalBackupDataV2->ucFragNum);
prCalBackupDataV2Info->u4Address = prEventCalBackupDataV2->u4Address;
prCalBackupDataV2Info->u4Length = prEventCalBackupDataV2->u4Length;
prCalBackupDataV2Info->u4RemainLength = prEventCalBackupDataV2->u4RemainLength;
prCalBackupDataV2Info->ucFragNum = prEventCalBackupDataV2->ucFragNum;
if (prEventCalBackupDataV2->u4RemainLength == 0
|| prEventCalBackupDataV2->u4Address == 0xFFFFFFFF) {
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
} else {
wlanoidSendCalBackupV2Cmd(prAdapter,
prCmdInfo->pvInformationBuffer, prCmdInfo->u4InformationBufferLength);
}
} else {
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#endif
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called to handle dump burst event
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the command information
* @param pucEventBuf Pointer to event buffer
*
* @return none
*
*/
/*----------------------------------------------------------------------------*/
VOID nicEventQueryMemDump(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
P_EVENT_DUMP_MEM_T prEventDumpMem;
static UINT_8 aucPath[256];
static UINT_8 aucPath_done[300];
static UINT_32 u4CurTimeTick;
ASSERT(prAdapter);
ASSERT(pucEventBuf);
snprintf(aucPath, sizeof(aucPath), "/dump_%05ld.hex", g_u2DumpIndex);
prEventDumpMem = (P_EVENT_DUMP_MEM_T) (pucEventBuf);
if (kalCheckPath(aucPath) == -1) {
kalMemSet(aucPath, 0x00, 256);
snprintf(aucPath, sizeof(aucPath), "/data/dump_%05ld.hex", g_u2DumpIndex);
}
if (prEventDumpMem->ucFragNum == 1) {
/* Store memory dump into sdcard,
* path /sdcard/dump_<current system tick>_<memory address>_<memory length>.hex
*/
u4CurTimeTick = kalGetTimeTick();
#if defined(LINUX)
/*if blbist mkdir undre /data/blbist, the dump files wouls put on it */
snprintf(aucPath, sizeof(aucPath), "/dump_%05ld.hex", g_u2DumpIndex);
if (kalCheckPath(aucPath) == -1) {
kalMemSet(aucPath, 0x00, 256);
snprintf(aucPath, sizeof(aucPath), "/data/dump_%05ld.hex", g_u2DumpIndex);
}
#else
kal_sprintf_ddk(aucPath, sizeof(aucPath),
u4CurTimeTick,
prEventDumpMem->u4Address, prEventDumpMem->u4Length + prEventDumpMem->u4RemainLength);
#endif
kalWriteToFile(aucPath, FALSE, &prEventDumpMem->aucBuffer[0], prEventDumpMem->u4Length);
} else {
/* Append current memory dump to the hex file */
kalWriteToFile(aucPath, TRUE, &prEventDumpMem->aucBuffer[0], prEventDumpMem->u4Length);
}
#if CFG_SUPPORT_QA_TOOL
TsfRawData2IqFmt(prEventDumpMem);
#endif /* CFG_SUPPORT_QA_TOOL */
DBGLOG(INIT, INFO,
"iCap : ==> (u4RemainLength = %x, u4Address=%x )\n", prEventDumpMem->u4RemainLength,
prEventDumpMem->u4Address);
if (prEventDumpMem->u4RemainLength == 0 || prEventDumpMem->u4Address == 0xFFFFFFFF) {
/* The request is finished or firmware response a error */
/* Reply time tick to iwpriv */
g_bIcapEnable = FALSE;
g_bCaptureDone = TRUE;
snprintf(aucPath_done, sizeof(aucPath_done), "/file_dump_done.txt");
if (kalCheckPath(aucPath_done) == -1) {
kalMemSet(aucPath_done, 0x00, 256);
snprintf(aucPath_done, sizeof(aucPath_done), "/data/file_dump_done.txt");
}
DBGLOG(INIT, INFO, ": ==> gen done_file\n");
kalWriteToFile(aucPath_done, FALSE, aucPath_done, sizeof(aucPath_done));
#if CFG_SUPPORT_QA_TOOL
g_au4Offset[0][0] = 0;
g_au4Offset[0][1] = 9;
g_au4Offset[1][0] = 0;
g_au4Offset[1][1] = 9;
#endif /* CFG_SUPPORT_QA_TOOL */
g_u2DumpIndex++;
}
}
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when command for memory dump has
* replied a event.
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the command information
* @param pucEventBuf Pointer to event buffer
*
* @return none
*
*/
/*----------------------------------------------------------------------------*/
VOID nicCmdEventQueryMemDump(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
P_EVENT_DUMP_MEM_T prEventDumpMem;
static UINT_8 aucPath[256];
/* static UINT_8 aucPath_done[300]; */
static UINT_32 u4CurTimeTick;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (1) {
prGlueInfo = prAdapter->prGlueInfo;
prEventDumpMem = (P_EVENT_DUMP_MEM_T) (pucEventBuf);
u4QueryInfoLen = sizeof(P_PARAM_CUSTOM_MEM_DUMP_STRUCT_T);
if (prEventDumpMem->ucFragNum == 1) {
/* Store memory dump into sdcard,
* path /sdcard/dump_<current system tick>_<memory address>_<memory length>.hex
*/
u4CurTimeTick = kalGetTimeTick();
#if defined(LINUX)
/* PeiHsuan add for avoiding out of memory 20160801 */
if (g_u2DumpIndex >= 20)
g_u2DumpIndex = 0;
/*if blbist mkdir undre /data/blbist, the dump files wouls put on it */
snprintf(aucPath, sizeof(aucPath), "/dump_%05ld.hex", g_u2DumpIndex);
if (kalCheckPath(aucPath) == -1) {
kalMemSet(aucPath, 0x00, 256);
snprintf(aucPath, sizeof(aucPath), "/data/dump_%05ld.hex", g_u2DumpIndex);
} else
kalTrunkPath(aucPath);
DBGLOG(INIT, INFO, "iCap Create New Dump File dump_%05ld.hex\n", g_u2DumpIndex);
#else
kal_sprintf_ddk(aucPath, sizeof(aucPath),
u4CurTimeTick,
prEventDumpMem->u4Address,
prEventDumpMem->u4Length + prEventDumpMem->u4RemainLength);
/* strcpy(aucPath, "dump.hex"); */
#endif
kalWriteToFile(aucPath, FALSE, &prEventDumpMem->aucBuffer[0], prEventDumpMem->u4Length);
} else {
/* Append current memory dump to the hex file */
kalWriteToFile(aucPath, TRUE, &prEventDumpMem->aucBuffer[0], prEventDumpMem->u4Length);
}
#if CFG_SUPPORT_QA_TOOL
TsfRawData2IqFmt(prEventDumpMem);
#endif /* CFG_SUPPORT_QA_TOOL */
if (prEventDumpMem->u4RemainLength == 0 || prEventDumpMem->u4Address == 0xFFFFFFFF) {
/* The request is finished or firmware response a error */
/* Reply time tick to iwpriv */
if (prCmdInfo->fgIsOid) {
/* the oid would be complete only in oid-trigger mode,
* that is no need to if the event-trigger
*/
if (g_bIcapEnable == FALSE) {
*((PUINT_32) prCmdInfo->pvInformationBuffer) = u4CurTimeTick;
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery,
u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
g_bIcapEnable = FALSE;
g_bCaptureDone = TRUE;
#if defined(LINUX)
g_u2DumpIndex++;
#else
kal_sprintf_done_ddk(aucPath_done, sizeof(aucPath_done));
kalWriteToFile(aucPath_done, FALSE, aucPath_done, sizeof(aucPath_done));
#endif
} else {
#if defined(LINUX)
#else /* 2013/05/26 fw would try to send the buffer successfully */
/* The memory dump request is not finished, Send next command */
wlanSendMemDumpCmd(prAdapter,
prCmdInfo->pvInformationBuffer, prCmdInfo->u4InformationBufferLength);
#endif
}
}
return;
}
#if CFG_SUPPORT_BATCH_SCAN
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when event for SUPPORT_BATCH_SCAN
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the command information
* @param pucEventBuf Pointer to the event buffer
*
* @return none
*
*/
/*----------------------------------------------------------------------------*/
VOID nicCmdEventBatchScanResult(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_EVENT_BATCH_RESULT_T prEventBatchResult;
P_GLUE_INFO_T prGlueInfo;
DBGLOG(SCN, TRACE, "nicCmdEventBatchScanResult");
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prEventBatchResult = (P_EVENT_BATCH_RESULT_T) pucEventBuf;
u4QueryInfoLen = sizeof(EVENT_BATCH_RESULT_T);
kalMemCopy(prCmdInfo->pvInformationBuffer, prEventBatchResult, sizeof(EVENT_BATCH_RESULT_T));
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#endif
VOID nicEventHifCtrl(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
#if defined(_HIF_USB)
P_EVENT_HIF_CTRL_T prEventHifCtrl;
prEventHifCtrl = (P_EVENT_HIF_CTRL_T) (prEvent->aucBuffer);
DBGLOG(HAL, INFO, "%s: EVENT_ID_HIF_CTRL\n", __func__);
DBGLOG(HAL, INFO, "prEventHifCtrl->ucHifType = %hhu\n", prEventHifCtrl->ucHifType);
DBGLOG(HAL, INFO, "prEventHifCtrl->ucHifTxTrafficStatus, prEventHifCtrl->ucHifRxTrafficStatus = %hhu, %hhu\n",
prEventHifCtrl->ucHifTxTrafficStatus, prEventHifCtrl->ucHifRxTrafficStatus);
if (prEventHifCtrl->ucHifTxTrafficStatus == ENUM_HIF_TRAFFIC_IDLE &&
prEventHifCtrl->ucHifRxTrafficStatus == ENUM_HIF_TRAFFIC_IDLE) { /* success */
halUSBPreSuspendDone(prAdapter, NULL, prEvent->aucBuffer);
} else if (prEventHifCtrl->ucHifTxTrafficStatus == ENUM_HIF_TRAFFIC_BUSY ||
prEventHifCtrl->ucHifRxTrafficStatus == ENUM_HIF_TRAFFIC_BUSY) { /* busy */
halUSBPreSuspendTimeout(prAdapter, NULL);
} else if (prEventHifCtrl->ucHifTxTrafficStatus == ENUM_HIF_TRAFFIC_INVALID ||
prEventHifCtrl->ucHifRxTrafficStatus == ENUM_HIF_TRAFFIC_INVALID) { /* invalid */
halUSBPreSuspendTimeout(prAdapter, NULL);
}
#endif
}
#if CFG_SUPPORT_BUILD_DATE_CODE
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when event for build date code information
* has been retrieved
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the command information
* @param pucEventBuf Pointer to the event buffer
*
* @return none
*
*/
/*----------------------------------------------------------------------------*/
VOID nicCmdEventBuildDateCode(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_EVENT_BUILD_DATE_CODE prEvent;
P_GLUE_INFO_T prGlueInfo;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
/* 4 <2> Update information of OID */
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prEvent = (P_EVENT_BUILD_DATE_CODE) pucEventBuf;
u4QueryInfoLen = sizeof(UINT_8) * 16;
kalMemCopy(prCmdInfo->pvInformationBuffer, prEvent->aucDateCode, sizeof(UINT_8) * 16);
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#endif
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when event for query STA link status
* has been retrieved
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the command information
* @param pucEventBuf Pointer to the event buffer
*
* @return none
*
*/
/*----------------------------------------------------------------------------*/
VOID nicCmdEventQueryStaStatistics(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_EVENT_STA_STATISTICS_T prEvent;
P_GLUE_INFO_T prGlueInfo;
P_PARAM_GET_STA_STATISTICS prStaStatistics;
ENUM_WMM_ACI_T eAci;
P_STA_RECORD_T prStaRec;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
ASSERT(prCmdInfo->pvInformationBuffer);
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prEvent = (P_EVENT_STA_STATISTICS_T) pucEventBuf;
prStaStatistics = (P_PARAM_GET_STA_STATISTICS) prCmdInfo->pvInformationBuffer;
u4QueryInfoLen = sizeof(PARAM_GET_STA_STA_STATISTICS);
/* Statistics from FW is valid */
if (prEvent->u4Flags & BIT(0)) {
prStaStatistics->ucPer = prEvent->ucPer;
prStaStatistics->ucRcpi = prEvent->ucRcpi;
prStaStatistics->u4PhyMode = prEvent->u4PhyMode;
prStaStatistics->u2LinkSpeed = prEvent->u2LinkSpeed;
prStaStatistics->u4TxFailCount = prEvent->u4TxFailCount;
prStaStatistics->u4TxLifeTimeoutCount = prEvent->u4TxLifeTimeoutCount;
prStaStatistics->u4TransmitCount = prEvent->u4TransmitCount;
prStaStatistics->u4TransmitFailCount = prEvent->u4TransmitFailCount;
prStaStatistics->u4Rate1TxCnt = prEvent->u4Rate1TxCnt;
prStaStatistics->u4Rate1FailCnt = prEvent->u4Rate1FailCnt;
prStaStatistics->ucTemperature = prEvent->ucTemperature;
prStaStatistics->ucSkipAr = prEvent->ucSkipAr;
prStaStatistics->ucArTableIdx = prEvent->ucArTableIdx;
prStaStatistics->ucRateEntryIdx = prEvent->ucRateEntryIdx;
prStaStatistics->ucRateEntryIdxPrev = prEvent->ucRateEntryIdxPrev;
prStaStatistics->ucTxSgiDetectPassCnt = prEvent->ucTxSgiDetectPassCnt;
prStaStatistics->ucAvePer = prEvent->ucAvePer;
kalMemCopy(prStaStatistics->aucArRatePer, prEvent->aucArRatePer,
sizeof(prEvent->aucArRatePer));
kalMemCopy(prStaStatistics->aucRateEntryIndex, prEvent->aucRateEntryIndex,
sizeof(prEvent->aucRateEntryIndex));
prStaStatistics->ucArStateCurr = prEvent->ucArStateCurr;
prStaStatistics->ucArStatePrev = prEvent->ucArStatePrev;
prStaStatistics->ucArActionType = prEvent->ucArActionType;
prStaStatistics->ucHighestRateCnt = prEvent->ucHighestRateCnt;
prStaStatistics->ucLowestRateCnt = prEvent->ucLowestRateCnt;
prStaStatistics->u2TrainUp = prEvent->u2TrainUp;
prStaStatistics->u2TrainDown = prEvent->u2TrainDown;
kalMemCopy(&prStaStatistics->rTxVector, &prEvent->rTxVector,
sizeof(prEvent->rTxVector));
kalMemCopy(&prStaStatistics->rMibInfo, &prEvent->rMibInfo,
sizeof(prEvent->rMibInfo));
prStaStatistics->fgIsForceTxStream = prEvent->fgIsForceTxStream;
prStaStatistics->fgIsForceSeOff = prEvent->fgIsForceSeOff;
prStaRec = cnmGetStaRecByIndex(prAdapter, prEvent->ucStaRecIdx);
if (prStaRec) {
/*link layer statistics */
for (eAci = 0; eAci < WMM_AC_INDEX_NUM; eAci++) {
prStaStatistics->arLinkStatistics[eAci].u4TxFailMsdu =
prEvent->arLinkStatistics[eAci].u4TxFailMsdu;
prStaStatistics->arLinkStatistics[eAci].u4TxRetryMsdu =
prEvent->arLinkStatistics[eAci].u4TxRetryMsdu;
/*for dump bss statistics */
prStaRec->arLinkStatistics[eAci].u4TxFailMsdu =
prEvent->arLinkStatistics[eAci].u4TxFailMsdu;
prStaRec->arLinkStatistics[eAci].u4TxRetryMsdu =
prEvent->arLinkStatistics[eAci].u4TxRetryMsdu;
}
}
if (prEvent->u4TxCount) {
UINT_32 u4TxDoneAirTimeMs = USEC_TO_MSEC(prEvent->u4TxDoneAirTime * 32);
prStaStatistics->u4TxAverageAirTime = (u4TxDoneAirTimeMs / prEvent->u4TxCount);
} else {
prStaStatistics->u4TxAverageAirTime = 0;
}
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#if CFG_AUTO_CHANNEL_SEL_SUPPORT
/*----------------------------------------------------------------------------*/
/*!
* @brief This function is called when event for query LTE safe channels
* has been retrieved
*
* @param prAdapter Pointer to the Adapter structure.
* @param prCmdInfo Pointer to the command information
* @param pucEventBuf Pointer to the event buffer
*
* @return none
*/
/*----------------------------------------------------------------------------*/
VOID nicCmdEventQueryLteSafeChn(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_EVENT_LTE_SAFE_CHN_T prEvent;
P_GLUE_INFO_T prGlueInfo;
P_PARAM_GET_CHN_INFO prLteSafeChnInfo;
UINT_8 ucIdx = 0;
if ((prAdapter == NULL)
|| (prCmdInfo == NULL)
|| (pucEventBuf == NULL)
|| (prCmdInfo->pvInformationBuffer == NULL)) {
ASSERT(FALSE);
return;
}
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prEvent = (P_EVENT_LTE_SAFE_CHN_T) pucEventBuf; /* FW responsed data */
prLteSafeChnInfo = (P_PARAM_GET_CHN_INFO) prCmdInfo->pvInformationBuffer;
u4QueryInfoLen = sizeof(PARAM_GET_CHN_INFO);
/* Statistics from FW is valid */
if (prEvent->u4Flags & BIT(0)) {
for (ucIdx = 0; ucIdx < NL80211_TESTMODE_AVAILABLE_CHAN_ATTR_MAX; ucIdx++) {
prLteSafeChnInfo->rLteSafeChnList.au4SafeChannelBitmask[ucIdx] =
prEvent->rLteSafeChn.au4SafeChannelBitmask[ucIdx];
DBGLOG(P2P, INFO,
"[ACS]LTE safe channels[%d]=0x%08x\n", ucIdx,
prLteSafeChnInfo->rLteSafeChnList.au4SafeChannelBitmask[ucIdx]);
}
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#endif
VOID nicEventRddPulseDump(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
UINT_16 u2Idx, u2PulseCnt;
P_EVENT_WIFI_RDD_TEST_T prRddPulseEvent;
ASSERT(prAdapter);
ASSERT(pucEventBuf);
prRddPulseEvent = (P_EVENT_WIFI_RDD_TEST_T) (pucEventBuf);
u2PulseCnt = (prRddPulseEvent->u4FuncLength - RDD_EVENT_HDR_SIZE) / RDD_ONEPLUSE_SIZE;
DBGLOG(INIT, INFO, "[RDD]0x%08x %08d[RDD%d]\n", prRddPulseEvent->u4Prefix
, prRddPulseEvent->u4Count, prRddPulseEvent->ucRddIdx);
for (u2Idx = 0; u2Idx < u2PulseCnt; u2Idx++) {
DBGLOG(INIT, INFO, "[RDD]0x%02x%02x%02x%02x %02x%02x%02x%02x[RDD%d]\n"
, prRddPulseEvent->aucBuffer[RDD_ONEPLUSE_SIZE*u2Idx+RDD_PULSE_OFFSET3]
, prRddPulseEvent->aucBuffer[RDD_ONEPLUSE_SIZE*u2Idx+RDD_PULSE_OFFSET2]
, prRddPulseEvent->aucBuffer[RDD_ONEPLUSE_SIZE*u2Idx+RDD_PULSE_OFFSET1]
, prRddPulseEvent->aucBuffer[RDD_ONEPLUSE_SIZE*u2Idx+RDD_PULSE_OFFSET0]
, prRddPulseEvent->aucBuffer[RDD_ONEPLUSE_SIZE*u2Idx+RDD_PULSE_OFFSET7]
, prRddPulseEvent->aucBuffer[RDD_ONEPLUSE_SIZE*u2Idx+RDD_PULSE_OFFSET6]
, prRddPulseEvent->aucBuffer[RDD_ONEPLUSE_SIZE*u2Idx+RDD_PULSE_OFFSET5]
, prRddPulseEvent->aucBuffer[RDD_ONEPLUSE_SIZE*u2Idx+RDD_PULSE_OFFSET4]
, prRddPulseEvent->ucRddIdx
);
}
DBGLOG(INIT, INFO, "[RDD]0x%08x %08x[RDD%d]\n", prRddPulseEvent->u4SubBandRssi0
, prRddPulseEvent->u4SubBandRssi1, prRddPulseEvent->ucRddIdx);
}
#if CFG_SUPPORT_ADVANCE_CONTROL
VOID nicCmdEventQueryAdvCtrl(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
PUINT_8 query;
P_GLUE_INFO_T prGlueInfo;
UINT_32 query_len;
P_CMD_ADV_CONFIG_HEADER_T hdr;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
if (!pucEventBuf) {
DBGLOG(REQ, ERROR, "pucEventBuf is null.\n");
return;
}
hdr = (P_CMD_ADV_CONFIG_HEADER_T) pucEventBuf;
DBGLOG(REQ, LOUD, "%s type %x len %d>\n", __func__, hdr->u2Type, hdr->u2Len);
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
query_len = hdr->u2Len;
query = prCmdInfo->pvInformationBuffer;
if (query && (query_len == prCmdInfo->u4InformationBufferLength))
kalMemCopy(query, hdr, query_len);
else
DBGLOG(REQ, LOUD, "%s type %x, len %d != buflen %d>\n"
, __func__, hdr->u2Type, hdr->u2Len, prCmdInfo->u4InformationBufferLength);
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, query_len, WLAN_STATUS_SUCCESS);
}
}
#endif
#if CFG_SUPPORT_MSP
VOID nicCmdEventQueryWlanInfo(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_PARAM_HW_WLAN_INFO_T prWlanInfo;
P_EVENT_WLAN_INFO prEventWlanInfo;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventWlanInfo = (P_EVENT_WLAN_INFO) pucEventBuf;
DBGLOG(RSN, INFO, "MT6632 : nicCmdEventQueryWlanInfo\n");
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
u4QueryInfoLen = sizeof(PARAM_HW_WLAN_INFO_T);
prWlanInfo = (P_PARAM_HW_WLAN_INFO_T) prCmdInfo->pvInformationBuffer;
/* prWlanInfo->u4Length = sizeof(PARAM_HW_WLAN_INFO_T); */
if (prEventWlanInfo && prWlanInfo) {
kalMemCopy(&prWlanInfo->rWtblTxConfig,
&prEventWlanInfo->rWtblTxConfig,
sizeof(PARAM_TX_CONFIG_T));
kalMemCopy(&prWlanInfo->rWtblSecConfig,
&prEventWlanInfo->rWtblSecConfig,
sizeof(PARAM_SEC_CONFIG_T));
kalMemCopy(&prWlanInfo->rWtblKeyConfig,
&prEventWlanInfo->rWtblKeyConfig,
sizeof(PARAM_KEY_CONFIG_T));
kalMemCopy(&prWlanInfo->rWtblRateInfo,
&prEventWlanInfo->rWtblRateInfo,
sizeof(PARAM_PEER_RATE_INFO_T));
kalMemCopy(&prWlanInfo->rWtblBaConfig,
&prEventWlanInfo->rWtblBaConfig,
sizeof(PARAM_PEER_BA_CONFIG_T));
kalMemCopy(&prWlanInfo->rWtblPeerCap,
&prEventWlanInfo->rWtblPeerCap,
sizeof(PARAM_PEER_CAP_T));
kalMemCopy(&prWlanInfo->rWtblRxCounter,
&prEventWlanInfo->rWtblRxCounter,
sizeof(PARAM_PEER_RX_COUNTER_ALL_T));
kalMemCopy(&prWlanInfo->rWtblTxCounter,
&prEventWlanInfo->rWtblTxCounter,
sizeof(PARAM_PEER_TX_COUNTER_ALL_T));
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
VOID nicCmdEventQueryMibInfo(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_PARAM_HW_MIB_INFO_T prMibInfo;
P_EVENT_MIB_INFO prEventMibInfo;
P_GLUE_INFO_T prGlueInfo;
UINT_32 u4QueryInfoLen;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
prEventMibInfo = (P_EVENT_MIB_INFO) pucEventBuf;
DBGLOG(RSN, INFO, "MT6632 : nicCmdEventQueryMibInfo\n");
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
u4QueryInfoLen = sizeof(PARAM_HW_MIB_INFO_T);
prMibInfo = (P_PARAM_HW_MIB_INFO_T) prCmdInfo->pvInformationBuffer;
if (prEventMibInfo && prMibInfo) {
kalMemCopy(&prMibInfo->rHwMibCnt,
&prEventMibInfo->rHwMibCnt,
sizeof(HW_MIB_COUNTER_T));
kalMemCopy(&prMibInfo->rHwMib2Cnt,
&prEventMibInfo->rHwMib2Cnt,
sizeof(HW_MIB2_COUNTER_T));
kalMemCopy(&prMibInfo->rHwTxAmpduMts,
&prEventMibInfo->rHwTxAmpduMts,
sizeof(HW_TX_AMPDU_METRICS_T));
}
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#endif
#if CFG_SUPPORT_LAST_SEC_MCS_INFO
VOID nicCmdEventTxMcsInfo(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
struct EVENT_TX_MCS_INFO *prTxMcsEvent;
struct PARAM_TX_MCS_INFO *prTxMcsInfo;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
ASSERT(pucEventBuf);
ASSERT(prCmdInfo->pvInformationBuffer);
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
prTxMcsEvent = (struct EVENT_TX_MCS_INFO *) pucEventBuf;
prTxMcsInfo = (struct PARAM_TX_MCS_INFO *) prCmdInfo->pvInformationBuffer;
u4QueryInfoLen = sizeof(struct EVENT_TX_MCS_INFO);
kalMemCopy(prTxMcsInfo->au2TxRateCode, prTxMcsEvent->au2TxRateCode,
sizeof(prTxMcsEvent->au2TxRateCode));
kalMemCopy(prTxMcsInfo->aucTxRatePer, prTxMcsEvent->aucTxRatePer,
sizeof(prTxMcsEvent->aucTxRatePer));
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery, u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}
#endif
#if CFG_TCP_IP_CHKSUM_OFFLOAD
WLAN_STATUS nicCmdEventQueryNicCsumOffload(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
P_NIC_CSUM_OFFLOAD_T prChecksumOffload = (P_NIC_CSUM_OFFLOAD_T)pucEventBuf;
prAdapter->fgIsSupportCsumOffload = prChecksumOffload->ucIsSupportCsumOffload;
DBGLOG(INIT, INFO, "nicCmdEventQueryNicCsumOffload: ucIsSupportCsumOffload = %x\n",
prAdapter->fgIsSupportCsumOffload);
return WLAN_STATUS_SUCCESS;
}
#endif
WLAN_STATUS nicCmdEventQueryNicCoexFeature(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
P_NIC_COEX_FEATURE_T prCoexFeature = (P_NIC_COEX_FEATURE_T)pucEventBuf;
prAdapter->u4FddMode = prCoexFeature->u4FddMode;
DBGLOG(INIT, INFO, "nicCmdEventQueryNicCoexFeature: u4FddMode = %x\n",
prAdapter->u4FddMode);
return WLAN_STATUS_SUCCESS;
}
WLAN_STATUS nicCmdEventQueryNicEfuseAddr(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
P_NIC_EFUSE_ADDRESS_T prTxResource = (P_NIC_EFUSE_ADDRESS_T)pucEventBuf;
prAdapter->u4EfuseStartAddress = prTxResource->u4EfuseStartAddress;
prAdapter->u4EfuseEndAddress = prTxResource->u4EfuseEndAddress;
DBGLOG(INIT, INFO, "nicCmdEventQueryNicEfuseAddr: u4EfuseStartAddress = %x\n",
prAdapter->u4EfuseStartAddress);
DBGLOG(INIT, INFO, "nicCmdEventQueryNicEfuseAddr: u4EfuseEndAddress = %x\n",
prAdapter->u4EfuseEndAddress);
return WLAN_STATUS_SUCCESS;
}
WLAN_STATUS nicCmdEventQueryEfuseOffset(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
struct _NIC_EFUSE_OFFSET_T *prEfuseOffset = (struct _NIC_EFUSE_OFFSET_T *)pucEventBuf;
if (prEfuseOffset->u4TotalItem > 0)
prAdapter->u4EfuseMacAddrOffset = prEfuseOffset->u4WlanMacAddr;
return WLAN_STATUS_SUCCESS;
}
WLAN_STATUS nicCmdEventQueryRModeCapability(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
struct _CAP_R_MODE_CAP_T *prRModeOffset = (struct _CAP_R_MODE_CAP_T *)pucEventBuf;
prAdapter->ucRModeOnlyFlag = prRModeOffset->ucRModeOnlyFlag;
return WLAN_STATUS_SUCCESS;
}
WLAN_STATUS nicCmdEventQueryNicTxResource(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
P_NIC_TX_RESOURCE_T prTxResource = (P_NIC_TX_RESOURCE_T)pucEventBuf;
prAdapter->fgIsNicTxReousrceValid = TRUE;
prAdapter->nicTxReousrce.u4McuTotalResource = prTxResource->u4McuTotalResource;
prAdapter->nicTxReousrce.u4McuResourceUnit = prTxResource->u4McuResourceUnit;
prAdapter->nicTxReousrce.u4LmacTotalResource = prTxResource->u4LmacTotalResource;
prAdapter->nicTxReousrce.u4LmacResourceUnit = prTxResource->u4LmacResourceUnit;
DBGLOG(INIT, INFO, "nicCmdEventQueryNicTxResource: u4McuTotalResource = %x\n",
prAdapter->nicTxReousrce.u4McuTotalResource);
DBGLOG(INIT, INFO, "nicCmdEventQueryNicTxResource: u4McuResourceUnit = %x\n",
prAdapter->nicTxReousrce.u4McuResourceUnit);
DBGLOG(INIT, INFO, "nicCmdEventQueryNicTxResource: u4LmacTotalResource = %x\n",
prAdapter->nicTxReousrce.u4LmacTotalResource);
DBGLOG(INIT, INFO, "nicCmdEventQueryNicTxResource: u4LmacResourceUnit = %x\n",
prAdapter->nicTxReousrce.u4LmacResourceUnit);
return WLAN_STATUS_SUCCESS;
}
VOID nicCmdEventQueryNicCapabilityV2(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucEventBuf)
{
P_EVENT_NIC_CAPABILITY_V2_T prEventNicV2 = (P_EVENT_NIC_CAPABILITY_V2_T)pucEventBuf;
P_NIC_CAPABILITY_V2_ELEMENT prElement;
UINT_32 tag_idx, table_idx, offset;
offset = 0;
/* process each element */
for (tag_idx = 0; tag_idx < prEventNicV2->u2TotalElementNum; tag_idx++) {
prElement = (P_NIC_CAPABILITY_V2_ELEMENT)(prEventNicV2->aucBuffer + offset);
for (table_idx = 0;
table_idx < (sizeof(gNicCapabilityV2InfoTable)/sizeof(NIC_CAPABILITY_V2_REF_TABLE_T));
table_idx++) {
/* find the corresponding tag's handler */
if (gNicCapabilityV2InfoTable[table_idx].tag_type == prElement->tag_type) {
gNicCapabilityV2InfoTable[table_idx].hdlr(prAdapter, prElement->aucbody);
break;
}
}
/* move to the next tag */
offset += prElement->body_len + (UINT_16) OFFSET_OF(NIC_CAPABILITY_V2_ELEMENT, aucbody);
}
}
VOID nicEventLinkQuality(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_CMD_INFO_T prCmdInfo;
#if CFG_ENABLE_WIFI_DIRECT && CFG_SUPPORT_P2P_RSSI_QUERY
if (prEvent->u2PacketLen == EVENT_HDR_WITHOUT_RXD_SIZE + sizeof(EVENT_LINK_QUALITY_EX)) {
P_EVENT_LINK_QUALITY_EX prLqEx = (P_EVENT_LINK_QUALITY_EX) (prEvent->aucBuffer);
if (prLqEx->ucIsLQ0Rdy)
nicUpdateLinkQuality(prAdapter, 0, (P_EVENT_LINK_QUALITY) prLqEx);
if (prLqEx->ucIsLQ1Rdy)
nicUpdateLinkQuality(prAdapter, 1, (P_EVENT_LINK_QUALITY) prLqEx);
} else {
/* For old FW, P2P may invoke link quality query, and make driver flag becone TRUE. */
DBGLOG(P2P, WARN, "Old FW version, not support P2P RSSI query.\n");
/* Must not use NETWORK_TYPE_P2P_INDEX, cause the structure is mismatch. */
nicUpdateLinkQuality(prAdapter, 0, (P_EVENT_LINK_QUALITY) (prEvent->aucBuffer));
}
#else
/*only support ais query */
{
UINT_8 ucBssIndex;
P_BSS_INFO_T prBssInfo;
for (ucBssIndex = 0; ucBssIndex < BSS_INFO_NUM; ucBssIndex++) {
prBssInfo = prAdapter->aprBssInfo[ucBssIndex];
if (prBssInfo->eNetworkType == NETWORK_TYPE_AIS && prBssInfo->fgIsInUse)
break;
}
if (ucBssIndex >= BSS_INFO_NUM)
ucBssIndex = 1; /* No hit(bss1 for default ais network) */
/* printk("=======> rssi with bss%d ,%d\n",ucBssIndex,
* ((P_EVENT_LINK_QUALITY_V2)(prEvent->aucBuffer))->rLq[ucBssIndex].cRssi);
*/
nicUpdateLinkQuality(prAdapter, ucBssIndex, (P_EVENT_LINK_QUALITY_V2) (prEvent->aucBuffer));
}
#endif
/* command response handling */
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
if (prCmdInfo != NULL) {
if (prCmdInfo->pfCmdDoneHandler)
prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
else if (prCmdInfo->fgIsOid)
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
#ifndef LINUX
if (prAdapter->rWlanInfo.eRssiTriggerType == ENUM_RSSI_TRIGGER_GREATER &&
prAdapter->rWlanInfo.rRssiTriggerValue >= (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi)) {
prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_TRIGGERED;
kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
(PVOID)&(prAdapter->rWlanInfo.rRssiTriggerValue), sizeof(PARAM_RSSI));
} else if (prAdapter->rWlanInfo.eRssiTriggerType == ENUM_RSSI_TRIGGER_LESS &&
prAdapter->rWlanInfo.rRssiTriggerValue <= (PARAM_RSSI) (prAdapter->rLinkQuality.cRssi)) {
prAdapter->rWlanInfo.eRssiTriggerType = ENUM_RSSI_TRIGGER_TRIGGERED;
kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
(PVOID)&(prAdapter->rWlanInfo.rRssiTriggerValue), sizeof(PARAM_RSSI));
}
#endif
}
VOID nicEventLayer0ExtMagic(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
UINT_32 u4QueryInfoLen;
P_CMD_INFO_T prCmdInfo;
P_EVENT_ACCESS_EFUSE prEventEfuseAccess;
P_EVENT_EFUSE_FREE_BLOCK_T prEventGetFreeBlock;
P_EVENT_GET_TX_POWER_T prEventGetTXPower;
if ((prEvent->ucExtenEID) == EXT_EVENT_ID_CMD_RESULT) {
u4QueryInfoLen = sizeof(PARAM_CUSTOM_EFUSE_BUFFER_MODE_T);
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
if (prCmdInfo != NULL) {
if ((prCmdInfo->fgIsOid) != 0) {
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery,
u4QueryInfoLen, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
}
} else if ((prEvent->ucExtenEID) == EXT_EVENT_ID_CMD_EFUSE_ACCESS) {
u4QueryInfoLen = sizeof(PARAM_CUSTOM_ACCESS_EFUSE_T);
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
prEventEfuseAccess = (P_EVENT_ACCESS_EFUSE) (prEvent->aucBuffer);
/* Efuse block size 16 */
kalMemCopy(prAdapter->aucEepromVaule, prEventEfuseAccess->aucData, 16);
if (prCmdInfo != NULL) {
if ((prCmdInfo->fgIsOid) != 0) {
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery,
u4QueryInfoLen, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
}
} else if ((prEvent->ucExtenEID) == EXT_EVENT_ID_EFUSE_FREE_BLOCK) {
u4QueryInfoLen = sizeof(PARAM_CUSTOM_EFUSE_FREE_BLOCK_T);
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
prEventGetFreeBlock = (P_EVENT_EFUSE_FREE_BLOCK_T) (prEvent->aucBuffer);
prAdapter->u4FreeBlockNum = prEventGetFreeBlock->u2FreeBlockNum;
if (prCmdInfo != NULL) {
if ((prCmdInfo->fgIsOid) != 0) {
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery,
u4QueryInfoLen, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
}
} else if ((prEvent->ucExtenEID) == EXT_EVENT_ID_GET_TX_POWER) {
u4QueryInfoLen = sizeof(PARAM_CUSTOM_GET_TX_POWER_T);
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
prEventGetTXPower = (P_EVENT_GET_TX_POWER_T) (prEvent->aucBuffer);
prAdapter->u4GetTxPower = prEventGetTXPower->ucTx0TargetPower;
if (prCmdInfo != NULL) {
if ((prCmdInfo->fgIsOid) != 0) {
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery,
u4QueryInfoLen, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
}
}
}
VOID nicEventMicErrorInfo(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_EVENT_MIC_ERR_INFO prMicError;
/* P_PARAM_AUTH_EVENT_T prAuthEvent; */
P_STA_RECORD_T prStaRec;
DBGLOG(RSN, EVENT, "EVENT_ID_MIC_ERR_INFO\n");
prMicError = (P_EVENT_MIC_ERR_INFO) (prEvent->aucBuffer);
prStaRec = cnmGetStaRecByAddress(prAdapter, prAdapter->prAisBssInfo->ucBssIndex,
prAdapter->rWlanInfo.rCurrBssId.arMacAddress);
ASSERT(prStaRec);
if (prStaRec)
rsnTkipHandleMICFailure(prAdapter, prStaRec, (BOOLEAN) prMicError->u4Flags);
else
DBGLOG(RSN, INFO, "No STA rec!!\n");
#if 0
prAuthEvent = (P_PARAM_AUTH_EVENT_T) prAdapter->aucIndicationEventBuffer;
/* Status type: Authentication Event */
prAuthEvent->rStatus.eStatusType = ENUM_STATUS_TYPE_AUTHENTICATION;
/* Authentication request */
prAuthEvent->arRequest[0].u4Length = sizeof(PARAM_AUTH_REQUEST_T);
kalMemCopy((PVOID) prAuthEvent->arRequest[0].arBssid,
(PVOID) prAdapter->rWlanInfo.rCurrBssId.arMacAddress, /* whsu:Todo? */
PARAM_MAC_ADDR_LEN);
if (prMicError->u4Flags != 0)
prAuthEvent->arRequest[0].u4Flags = PARAM_AUTH_REQUEST_GROUP_ERROR;
else
prAuthEvent->arRequest[0].u4Flags = PARAM_AUTH_REQUEST_PAIRWISE_ERROR;
kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
WLAN_STATUS_MEDIA_SPECIFIC_INDICATION,
(PVOID) prAuthEvent,
sizeof(PARAM_STATUS_INDICATION_T) + sizeof(PARAM_AUTH_REQUEST_T));
#endif
}
VOID nicEventScanDone(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
scnEventScanDone(prAdapter, (P_EVENT_SCAN_DONE) (prEvent->aucBuffer), TRUE);
}
VOID nicEventNloDone(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
DBGLOG(INIT, INFO, "EVENT_ID_NLO_DONE\n");
scnEventNloDone(prAdapter, (P_EVENT_NLO_DONE_T) (prEvent->aucBuffer));
#if CFG_SUPPORT_PNO
prAdapter->prAisBssInfo->fgIsPNOEnable = FALSE;
if (prAdapter->prAisBssInfo->fgIsNetRequestInActive && prAdapter->prAisBssInfo->fgIsPNOEnable) {
UNSET_NET_ACTIVE(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
DBGLOG(INIT, INFO, "INACTIVE AIS from ACTIVEto disable PNO\n");
/* sync with firmware */
nicDeactivateNetwork(prAdapter, prAdapter->prAisBssInfo->ucBssIndex);
}
#endif
}
VOID nicEventSleepyNotify(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
#if !defined(_HIF_USB)
P_EVENT_SLEEPY_INFO_T prEventSleepyNotify;
prEventSleepyNotify = (P_EVENT_SLEEPY_INFO_T) (prEvent->aucBuffer);
/* DBGLOG(RX, INFO, ("ucSleepyState = %d\n", prEventSleepyNotify->ucSleepyState)); */
prAdapter->fgWiFiInSleepyState = (BOOLEAN) (prEventSleepyNotify->ucSleepyState);
#if CFG_SUPPORT_MULTITHREAD
if (prEventSleepyNotify->ucSleepyState)
kalSetFwOwnEvent2Hif(prAdapter->prGlueInfo);
#endif
#endif
}
VOID nicEventBtOverWifi(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
#if CFG_ENABLE_BT_OVER_WIFI
UINT_8 aucTmp[sizeof(AMPC_EVENT) + sizeof(BOW_LINK_DISCONNECTED)];
P_EVENT_BT_OVER_WIFI prEventBtOverWifi;
P_AMPC_EVENT prBowEvent;
P_BOW_LINK_CONNECTED prBowLinkConnected;
P_BOW_LINK_DISCONNECTED prBowLinkDisconnected;
prEventBtOverWifi = (P_EVENT_BT_OVER_WIFI) (prEvent->aucBuffer);
/* construct event header */
prBowEvent = (P_AMPC_EVENT) aucTmp;
if (prEventBtOverWifi->ucLinkStatus == 0) {
/* Connection */
prBowEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_CONNECTED;
prBowEvent->rHeader.ucSeqNumber = 0;
prBowEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_CONNECTED);
/* fill event body */
prBowLinkConnected = (P_BOW_LINK_CONNECTED) (prBowEvent->aucPayload);
prBowLinkConnected->rChannel.ucChannelNum = prEventBtOverWifi->ucSelectedChannel;
kalMemZero(prBowLinkConnected->aucPeerAddress, MAC_ADDR_LEN); /* @FIXME */
kalIndicateBOWEvent(prAdapter->prGlueInfo, prBowEvent);
} else {
/* Disconnection */
prBowEvent->rHeader.ucEventId = BOW_EVENT_ID_LINK_DISCONNECTED;
prBowEvent->rHeader.ucSeqNumber = 0;
prBowEvent->rHeader.u2PayloadLength = sizeof(BOW_LINK_DISCONNECTED);
/* fill event body */
prBowLinkDisconnected = (P_BOW_LINK_DISCONNECTED) (prBowEvent->aucPayload);
prBowLinkDisconnected->ucReason = 0; /* @FIXME */
kalMemZero(prBowLinkDisconnected->aucPeerAddress, MAC_ADDR_LEN); /* @FIXME */
kalIndicateBOWEvent(prAdapter->prGlueInfo, prBowEvent);
}
#endif
}
VOID nicEventStatistics(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_CMD_INFO_T prCmdInfo;
/* buffer statistics for further query */
prAdapter->fgIsStatValid = TRUE;
prAdapter->rStatUpdateTime = kalGetTimeTick();
kalMemCopy(&prAdapter->rStatStruct, prEvent->aucBuffer, sizeof(EVENT_STATISTICS));
/* command response handling */
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
if (prCmdInfo != NULL) {
if (prCmdInfo->pfCmdDoneHandler)
prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
else if (prCmdInfo->fgIsOid)
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
}
VOID nicEventWlanInfo(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_CMD_INFO_T prCmdInfo;
/* buffer statistics for further query */
prAdapter->fgIsStatValid = TRUE;
prAdapter->rStatUpdateTime = kalGetTimeTick();
kalMemCopy(&prAdapter->rEventWlanInfo, prEvent->aucBuffer, sizeof(EVENT_WLAN_INFO));
DBGLOG(RSN, INFO, "EVENT_ID_WLAN_INFO");
/* command response handling */
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
if (prCmdInfo != NULL) {
if (prCmdInfo->pfCmdDoneHandler)
prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
else if (prCmdInfo->fgIsOid)
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
}
VOID nicEventMibInfo(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_CMD_INFO_T prCmdInfo;
/* buffer statistics for further query */
prAdapter->fgIsStatValid = TRUE;
prAdapter->rStatUpdateTime = kalGetTimeTick();
DBGLOG(RSN, INFO, "EVENT_ID_MIB_INFO");
/* command response handling */
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
if (prCmdInfo != NULL) {
if (prCmdInfo->pfCmdDoneHandler)
prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
else if (prCmdInfo->fgIsOid)
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
}
#if CFG_SUPPORT_LAST_SEC_MCS_INFO
VOID nicEventTxMcsInfo(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_CMD_INFO_T prCmdInfo;
DBGLOG(RSN, INFO, "EVENT_ID_TX_MCS_INFO");
/* command response handling */
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
if (prCmdInfo != NULL) {
if (prCmdInfo->pfCmdDoneHandler)
prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
else if (prCmdInfo->fgIsOid)
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
}
}
#endif
VOID nicEventBeaconTimeout(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
DBGLOG(NIC, INFO, "EVENT_ID_BSS_BEACON_TIMEOUT\n");
if (prAdapter->fgDisBcnLostDetection == FALSE) {
P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL;
P_EVENT_BSS_BEACON_TIMEOUT_T prEventBssBeaconTimeout;
prEventBssBeaconTimeout = (P_EVENT_BSS_BEACON_TIMEOUT_T) (prEvent->aucBuffer);
if (prEventBssBeaconTimeout->ucBssIndex >= MAX_BSS_INDEX)
return;
DBGLOG(NIC, INFO, "Reason code: %d\n", prEventBssBeaconTimeout->ucReasonCode);
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prEventBssBeaconTimeout->ucBssIndex);
if (prEventBssBeaconTimeout->ucBssIndex == prAdapter->prAisBssInfo->ucBssIndex)
aisBssBeaconTimeout(prAdapter);
#if CFG_ENABLE_WIFI_DIRECT
else if (prBssInfo->eNetworkType == NETWORK_TYPE_P2P)
p2pRoleFsmRunEventBeaconTimeout(prAdapter, prBssInfo);
#endif
#if CFG_ENABLE_BT_OVER_WIFI
else if (GET_BSS_INFO_BY_INDEX(prAdapter, prEventBssBeaconTimeout->ucBssIndex)->eNetworkType ==
NETWORK_TYPE_BOW) {
/* ToDo:: Nothing */
}
#endif
else {
DBGLOG(RX, ERROR, "EVENT_ID_BSS_BEACON_TIMEOUT: (ucBssIndex = %d)\n",
prEventBssBeaconTimeout->ucBssIndex);
}
}
}
VOID nicEventUpdateNoaParams(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
#if CFG_ENABLE_WIFI_DIRECT
if (prAdapter->fgIsP2PRegistered) {
P_EVENT_UPDATE_NOA_PARAMS_T prEventUpdateNoaParam;
prEventUpdateNoaParam = (P_EVENT_UPDATE_NOA_PARAMS_T) (prEvent->aucBuffer);
if (GET_BSS_INFO_BY_INDEX(prAdapter, prEventUpdateNoaParam->ucBssIndex)->eNetworkType ==
NETWORK_TYPE_P2P) {
p2pProcessEvent_UpdateNOAParam(prAdapter, prEventUpdateNoaParam->ucBssIndex,
prEventUpdateNoaParam);
} else {
ASSERT(0);
}
}
#else
ASSERT(0);
#endif
}
VOID nicEventStaAgingTimeout(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
if (prAdapter->fgDisStaAgingTimeoutDetection == FALSE) {
P_EVENT_STA_AGING_TIMEOUT_T prEventStaAgingTimeout;
P_STA_RECORD_T prStaRec;
P_BSS_INFO_T prBssInfo = (P_BSS_INFO_T) NULL;
prEventStaAgingTimeout = (P_EVENT_STA_AGING_TIMEOUT_T) (prEvent->aucBuffer);
prStaRec = cnmGetStaRecByIndex(prAdapter, prEventStaAgingTimeout->ucStaRecIdx);
if (prStaRec == NULL)
return;
DBGLOG(NIC, INFO, "EVENT_ID_STA_AGING_TIMEOUT %u " MACSTR "\n",
prEventStaAgingTimeout->ucStaRecIdx, MAC2STR(prStaRec->aucMacAddr));
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex);
bssRemoveClient(prAdapter, prBssInfo, prStaRec);
/* Call False Auth */
if (prAdapter->fgIsP2PRegistered) {
p2pFuncDisconnect(prAdapter, prBssInfo, prStaRec, TRUE,
REASON_CODE_DISASSOC_INACTIVITY);
}
}
/* gDisStaAgingTimeoutDetection */
}
VOID nicEventApObssStatus(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
#if CFG_ENABLE_WIFI_DIRECT
if (prAdapter->fgIsP2PRegistered)
rlmHandleObssStatusEventPkt(prAdapter, (P_EVENT_AP_OBSS_STATUS_T) prEvent->aucBuffer);
#endif
}
VOID nicEventRoamingStatus(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
#if CFG_SUPPORT_ROAMING
P_CMD_ROAMING_TRANSIT_T prTransit;
prTransit = (P_CMD_ROAMING_TRANSIT_T) (prEvent->aucBuffer);
roamingFsmProcessEvent(prAdapter, prTransit);
#endif /* CFG_SUPPORT_ROAMING */
}
VOID nicEventSendDeauth(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
SW_RFB_T rSwRfb;
#if DBG
P_WLAN_MAC_HEADER_T prWlanMacHeader;
prWlanMacHeader = (P_WLAN_MAC_HEADER_T) &prEvent->aucBuffer[0];
DBGLOG(RX, TRACE, "nicRx: aucAddr1: " MACSTR "\n", MAC2STR(prWlanMacHeader->aucAddr1));
DBGLOG(RX, TRACE, "nicRx: aucAddr2: " MACSTR "\n", MAC2STR(prWlanMacHeader->aucAddr2));
#endif
/* receive packets without StaRec */
rSwRfb.pvHeader = (P_WLAN_MAC_HEADER_T) &prEvent->aucBuffer[0];
if (authSendDeauthFrame(prAdapter, NULL, NULL, &rSwRfb, REASON_CODE_CLASS_3_ERR,
(PFN_TX_DONE_HANDLER) NULL) == WLAN_STATUS_SUCCESS) {
DBGLOG(RX, TRACE, "Send Deauth Error\n");
}
}
VOID nicEventUpdateRddStatus(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
#if CFG_SUPPORT_RDD_TEST_MODE
P_EVENT_RDD_STATUS_T prEventRddStatus;
prEventRddStatus = (P_EVENT_RDD_STATUS_T) (prEvent->aucBuffer);
prAdapter->ucRddStatus = prEventRddStatus->ucRddStatus;
#endif
}
VOID nicEventUpdateBwcsStatus(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_PTA_IPC_T prEventBwcsStatus;
prEventBwcsStatus = (P_PTA_IPC_T) (prEvent->aucBuffer);
#if CFG_SUPPORT_BCM_BWCS_DEBUG
DBGLOG(RSN, EVENT, "BCM BWCS Event: %02x%02x%02x%02x\n",
prEventBwcsStatus->u.aucBTPParams[0],
prEventBwcsStatus->u.aucBTPParams[1],
prEventBwcsStatus->u.aucBTPParams[2], prEventBwcsStatus->u.aucBTPParams[3]);
#endif
kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_BWCS_UPDATE,
(PVOID) prEventBwcsStatus, sizeof(PTA_IPC_T));
}
VOID nicEventUpdateBcmDebug(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_PTA_IPC_T prEventBwcsStatus;
prEventBwcsStatus = (P_PTA_IPC_T) (prEvent->aucBuffer);
#if CFG_SUPPORT_BCM_BWCS_DEBUG
DBGLOG(RSN, EVENT, "BCM FW status: %02x%02x%02x%02x\n",
prEventBwcsStatus->u.aucBTPParams[0],
prEventBwcsStatus->u.aucBTPParams[1],
prEventBwcsStatus->u.aucBTPParams[2], prEventBwcsStatus->u.aucBTPParams[3]);
#endif
}
VOID nicEventAddPkeyDone(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_EVENT_ADD_KEY_DONE_INFO prAddKeyDone;
P_STA_RECORD_T prStaRec;
prAddKeyDone = (P_EVENT_ADD_KEY_DONE_INFO) (prEvent->aucBuffer);
DBGLOG(RSN, EVENT, "EVENT_ID_ADD_PKEY_DONE BSSIDX=%d " MACSTR "\n",
prAddKeyDone->ucBSSIndex, MAC2STR(prAddKeyDone->aucStaAddr));
prStaRec = cnmGetStaRecByAddress(prAdapter, prAddKeyDone->ucBSSIndex, prAddKeyDone->aucStaAddr);
if (prStaRec) {
DBGLOG(RSN, EVENT, "STA " MACSTR " Add Key Done!!\n", MAC2STR(prStaRec->aucMacAddr));
prStaRec->fgIsTxKeyReady = TRUE;
qmUpdateStaRec(prAdapter, prStaRec);
}
}
VOID nicEventIcapDone(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_EVENT_ICAP_STATUS_T prEventIcapStatus;
PARAM_CUSTOM_MEM_DUMP_STRUCT_T rMemDumpInfo;
UINT_32 u4QueryInfo;
prEventIcapStatus = (P_EVENT_ICAP_STATUS_T) (prEvent->aucBuffer);
rMemDumpInfo.u4Address = prEventIcapStatus->u4StartAddress;
rMemDumpInfo.u4Length = prEventIcapStatus->u4IcapSieze;
#if CFG_SUPPORT_QA_TOOL
rMemDumpInfo.u4IcapContent = prEventIcapStatus->u4IcapContent;
#endif
wlanoidQueryMemDump(prAdapter, &rMemDumpInfo, sizeof(rMemDumpInfo), &u4QueryInfo);
}
#if CFG_SUPPORT_CAL_RESULT_BACKUP_TO_HOST
PARAM_CAL_BACKUP_STRUCT_V2_T g_rCalBackupDataV2;
VOID nicEventCalAllDone(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_CMD_CAL_BACKUP_STRUCT_V2_T prEventCalBackupDataV2;
UINT_32 u4QueryInfo;
DBGLOG(RFTEST, INFO, "%s\n", __func__);
memset(&g_rCalBackupDataV2, 0, sizeof(PARAM_CAL_BACKUP_STRUCT_V2_T));
prEventCalBackupDataV2 = (P_CMD_CAL_BACKUP_STRUCT_V2_T) (prEvent->aucBuffer);
if (prEventCalBackupDataV2->ucReason == 1 && prEventCalBackupDataV2->ucAction == 2) {
DBGLOG(RFTEST, INFO, "Received an EVENT for Trigger Do All Cal Function.\n");
g_rCalBackupDataV2.ucReason = 2;
g_rCalBackupDataV2.ucAction = 4;
g_rCalBackupDataV2.ucNeedResp = 1;
g_rCalBackupDataV2.ucFragNum = 0;
g_rCalBackupDataV2.ucRomRam = 0;
g_rCalBackupDataV2.u4ThermalValue = 0;
g_rCalBackupDataV2.u4Address = 0;
g_rCalBackupDataV2.u4Length = 0;
g_rCalBackupDataV2.u4RemainLength = 0;
DBGLOG(RFTEST, INFO, "RLM CMD : Get Cal Data from FW (%s). Start!!!!!!!!!!!!!!!!\n",
g_rCalBackupDataV2.ucRomRam == 0 ? "ROM" : "RAM");
DBGLOG(RFTEST, INFO, "Thermal Temp = %d\n", g_rBackupCalDataAllV2.u4ThermalInfo);
wlanoidQueryCalBackupV2(prAdapter,
&g_rCalBackupDataV2,
sizeof(PARAM_CAL_BACKUP_STRUCT_V2_T),
&u4QueryInfo);
}
}
#endif
VOID nicEventDebugMsg(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_EVENT_DEBUG_MSG_T prEventDebugMsg;
UINT_16 u2DebugMsgId;
UINT_8 ucMsgType;
UINT_8 ucFlags;
UINT_32 u4Value;
UINT_16 u2MsgSize;
P_UINT_8 pucMsg;
prEventDebugMsg = (P_EVENT_DEBUG_MSG_T) (prEvent->aucBuffer);
u2DebugMsgId = prEventDebugMsg->u2DebugMsgId;
ucMsgType = prEventDebugMsg->ucMsgType;
ucFlags = prEventDebugMsg->ucFlags;
u4Value = prEventDebugMsg->u4Value;
u2MsgSize = prEventDebugMsg->u2MsgSize;
pucMsg = prEventDebugMsg->aucMsg;
DBGLOG(SW4, TRACE, "DEBUG_MSG Id %u Type %u Fg 0x%x Val 0x%x Size %u\n",
u2DebugMsgId, ucMsgType, ucFlags, u4Value, u2MsgSize);
if (u2MsgSize <= DEBUG_MSG_SIZE_MAX) {
if (ucMsgType >= DEBUG_MSG_TYPE_END)
ucMsgType = DEBUG_MSG_TYPE_MEM32;
if (ucMsgType == DEBUG_MSG_TYPE_ASCII) {
PUINT_8 pucChr;
pucMsg[u2MsgSize] = '\0';
/* skip newline */
pucChr = kalStrChr(pucMsg, '\0');
if (*(pucChr - 1) == '\n')
*(pucChr - 1) = '\0';
DBGLOG(SW4, EVENT, "<FW>%s\n", pucMsg);
} else if (ucMsgType == DEBUG_MSG_TYPE_MEM8) {
DBGLOG(SW4, INFO, "<FW>Dump MEM8\n");
DBGLOG_MEM8(SW4, INFO, pucMsg, u2MsgSize);
} else {
DBGLOG(SW4, INFO, "<FW>Dump MEM32\n");
DBGLOG_MEM32(SW4, INFO, pucMsg, u2MsgSize);
}
} /* DEBUG_MSG_SIZE_MAX */
else
DBGLOG(SW4, INFO, "Debug msg size %u is too large.\n", u2MsgSize);
}
VOID nicEventTdls(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
#if CFG_SUPPORT_TDLS
TdlsexEventHandle(prAdapter->prGlueInfo, (PUINT_8)prEvent->aucBuffer,
(UINT_32)(prEvent->u2PacketLength - 8));
#endif
}
VOID nicEventDumpMem(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_CMD_INFO_T prCmdInfo;
DBGLOG(SW4, INFO, "%s: EVENT_ID_DUMP_MEM\n", __func__);
prCmdInfo = nicGetPendingCmdInfo(prAdapter, prEvent->ucSeqNum);
if (prCmdInfo != NULL) {
DBGLOG(NIC, INFO, ": ==> 1\n");
if (prCmdInfo->pfCmdDoneHandler)
prCmdInfo->pfCmdDoneHandler(prAdapter, prCmdInfo, prEvent->aucBuffer);
else if (prCmdInfo->fgIsOid)
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_SUCCESS);
/* return prCmdInfo */
cmdBufFreeCmdInfo(prAdapter, prCmdInfo);
} else {
/* Burst mode */
DBGLOG(NIC, INFO, ": ==> 2\n");
nicEventQueryMemDump(prAdapter, prEvent->aucBuffer);
}
}
VOID nicEventAssertDump(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
if (wlanIsChipRstRecEnabled(prAdapter))
wlanChipRstPreAct(prAdapter);
if (prEvent->ucS2DIndex == S2D_INDEX_EVENT_N2H) {
if (!prAdapter->fgN9AssertDumpOngoing) {
DBGLOG(NIC, ERROR, "%s: EVENT_ID_ASSERT_DUMP\n", __func__);
DBGLOG(NIC, ERROR, "\n[DUMP_N9]====N9 ASSERT_DUMPSTART====\n");
prAdapter->fgKeepPrintCoreDump = TRUE;
if (kalOpenCorDumpFile(TRUE) != WLAN_STATUS_SUCCESS)
DBGLOG(NIC, ERROR, "kalOpenCorDumpFile fail\n");
else
prAdapter->fgN9CorDumpFileOpend = TRUE;
prAdapter->fgN9AssertDumpOngoing = TRUE;
}
if (prAdapter->fgN9AssertDumpOngoing) {
if (prAdapter->fgKeepPrintCoreDump)
DBGLOG(NIC, ERROR, "[DUMP_N9]%s:\n", prEvent->aucBuffer);
if (!kalStrnCmp(prEvent->aucBuffer, ";more log added here", 5)
|| !kalStrnCmp(prEvent->aucBuffer, ";[core dump start]", 5))
prAdapter->fgKeepPrintCoreDump = FALSE;
if (prAdapter->fgN9CorDumpFileOpend) {
if (kalWriteCorDumpFile(prEvent->aucBuffer,
prEvent->u2PacketLength - EVENT_HDR_WITHOUT_RXD_SIZE, TRUE) !=
WLAN_STATUS_SUCCESS) {
DBGLOG(NIC, INFO, "kalWriteN9CorDumpFile fail\n");
}
}
wlanCorDumpTimerReset(prAdapter, TRUE);
}
} else {
/* prEvent->ucS2DIndex == S2D_INDEX_EVENT_C2H */
if (!prAdapter->fgCr4AssertDumpOngoing) {
DBGLOG(NIC, ERROR, "%s: EVENT_ID_ASSERT_DUMP\n", __func__);
DBGLOG(NIC, ERROR, "\n[DUMP_Cr4]====CR4 ASSERT_DUMPSTART====\n");
prAdapter->fgKeepPrintCoreDump = TRUE;
if (kalOpenCorDumpFile(FALSE) != WLAN_STATUS_SUCCESS)
DBGLOG(NIC, ERROR, "kalOpenCorDumpFile fail\n");
else
prAdapter->fgCr4CorDumpFileOpend = TRUE;
prAdapter->fgCr4AssertDumpOngoing = TRUE;
}
if (prAdapter->fgCr4AssertDumpOngoing) {
if (prAdapter->fgKeepPrintCoreDump)
DBGLOG(NIC, ERROR, "[DUMP_CR4]%s:\n", prEvent->aucBuffer);
if (!kalStrnCmp(prEvent->aucBuffer, ";more log added here", 5))
prAdapter->fgKeepPrintCoreDump = FALSE;
if (prAdapter->fgCr4CorDumpFileOpend) {
if (kalWriteCorDumpFile(prEvent->aucBuffer,
prEvent->u2PacketLength - EVENT_HDR_WITHOUT_RXD_SIZE, FALSE) !=
WLAN_STATUS_SUCCESS) {
DBGLOG(NIC, ERROR, "kalWriteN9CorDumpFile fail\n");
}
}
wlanCorDumpTimerReset(prAdapter, FALSE);
}
}
}
VOID nicEventRddSendPulse(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
DBGLOG(RLM, INFO, "%s: EVENT_ID_RDD_SEND_PULSE\n", __func__);
nicEventRddPulseDump(prAdapter, prEvent->aucBuffer);
}
VOID nicEventUpdateCoexPhyrate(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
UINT_8 i;
P_EVENT_UPDATE_COEX_PHYRATE_T prEventUpdateCoexPhyrate;
DBGLOG(NIC, LOUD, "%s\n", __func__);
prEventUpdateCoexPhyrate = (P_EVENT_UPDATE_COEX_PHYRATE_T)(prEvent->aucBuffer);
for (i = 0; i < (HW_BSSID_NUM+1); i++) {
prAdapter->aprBssInfo[i]->u4CoexPhyRateLimit = prEventUpdateCoexPhyrate->au4PhyRateLimit[i];
DBGLOG(NIC, INFO, "Coex:BSS[%d]R:%d\n", i, prAdapter->aprBssInfo[i]->u4CoexPhyRateLimit);
}
}
#if (CFG_WOW_SUPPORT == 1)
VOID nicEventWakeUpReason(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
struct _EVENT_WAKEUP_REASON_INFO *prWakeUpReason;
P_GLUE_INFO_T prGlueInfo;
DBGLOG(NIC, INFO, "nicEventWakeUpReason\n");
prGlueInfo = prAdapter->prGlueInfo;
/* Driver receives EVENT_ID_WOW_WAKEUP_REASON after firmware wake up host
* The possible Wakeup Reason define in FW as following
* 0: MAGIC PACKET
* 1: BITMAP
* 2: ARPNS
* 3: GTK_REKEY
* 4: COALESCING_FILTER
* 5: HW_GLOBAL_ENABLE
* 6: TCP_SYN PACKET
* 7: TDLS
* 8: DISCONNECT
* 9: IPV4_UDP PACKET
* 10: IPV4_TCP PACKET
* 11: IPV6_UDP PACKET
* 12: IPV6_TCP PACKET
*/
prWakeUpReason = (struct _EVENT_WAKEUP_REASON_INFO *) (prEvent->aucBuffer);
prGlueInfo->prAdapter->rWowCtrl.ucReason = prWakeUpReason->reason;
DBGLOG(NIC, INFO, "nicEventWakeUpReason:%d\n", prGlueInfo->prAdapter->rWowCtrl.ucReason);
}
#endif
VOID nicEventCSIData(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
struct EVENT_CSI_DATA_T *prCsiData;
DBGLOG(NIC, INFO, "nicEventCSIData\n");
if (prAdapter->rCsiData.bIsOutputing) {
DBGLOG(NIC, INFO,
"Previous CSI is now outputted via /proc. Ignore this new data!\n");
return;
}
if (prAdapter->rCsiData.ucDataOutputted != 0) {
DBGLOG(NIC, INFO,
"Previous %s data is not outputted. Ignore this new data!\n",
(prAdapter->rCsiData.ucDataOutputted & BIT(0)) ? "Q" : "I");
return;
}
prCsiData = (struct EVENT_CSI_DATA_T *) (prEvent->aucBuffer);
prAdapter->rCsiData.ucDbdcIdx = prCsiData->ucDbdcIdx;
prAdapter->rCsiData.ucBw = prCsiData->ucBw;
prAdapter->rCsiData.bIsCck = prCsiData->bIsCck;
prAdapter->rCsiData.cRssi = prCsiData->cRssi;
prAdapter->rCsiData.ucSNR = prCsiData->ucSNR;
prAdapter->rCsiData.u8TimeStamp = kalDivU64(kalGetBootTime(), USEC_PER_MSEC);
kalMemZero(prAdapter->rCsiData.ac2IData, sizeof(prAdapter->rCsiData.ac2IData));
kalMemZero(prAdapter->rCsiData.ac2QData, sizeof(prAdapter->rCsiData.ac2QData));
kalMemCopy(prAdapter->rCsiData.ac2IData,
prCsiData->ac2IData, sizeof(prCsiData->ac2IData));
kalMemCopy(prAdapter->rCsiData.ac2QData,
prCsiData->ac2QData, sizeof(prCsiData->ac2QData));
prAdapter->rCsiData.u2DataCount = prCsiData->u2DataCount;
wake_up_interruptible(&(prAdapter->rCsiData.waitq));
}
#if CFG_SUPPORT_REPLAY_DETECTION
VOID nicCmdEventSetAddKey(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo, IN PUINT_8 pucEventBuf)
{
P_WIFI_CMD_T prWifiCmd = NULL;
P_CMD_802_11_KEY prCmdKey = NULL;
struct SEC_DETECT_REPLAY_INFO *prDetRplyInfo = NULL;
UINT_8 ucBssIndex = 0;
P_BSS_INFO_T prBssInfo = NULL;
ASSERT(prAdapter);
ASSERT(prCmdInfo);
if (prCmdInfo->fgIsOid) {
/* Update Set Information Length */
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery, prCmdInfo->u4InformationBufferLength, WLAN_STATUS_SUCCESS);
}
prWifiCmd = (P_WIFI_CMD_T) (prCmdInfo->pucInfoBuffer);
prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
ucBssIndex = prCmdKey->ucBssIdx;
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIndex);
ASSERT(prBssInfo);
prDetRplyInfo = &prBssInfo->rDetRplyInfo;
if (pucEventBuf) {
prWifiCmd = (P_WIFI_CMD_T) (pucEventBuf);
prCmdKey = (P_CMD_802_11_KEY) (prWifiCmd->aucBuffer);
if (!prCmdKey->ucKeyType) {
prDetRplyInfo->ucCurKeyId = prCmdKey->ucKeyId;
prDetRplyInfo->ucKeyType = prCmdKey->ucKeyType;
prDetRplyInfo->arReplayPNInfo[prCmdKey->ucKeyId].fgRekey = TRUE;
prDetRplyInfo->arReplayPNInfo[prCmdKey->ucKeyId].fgFirstPkt = TRUE;
DBGLOG(NIC, TRACE, "Keyid is %d, ucKeyType is %d\n",
prCmdKey->ucKeyId, prCmdKey->ucKeyType);
}
}
}
VOID nicOidCmdTimeoutSetAddKey(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo)
{
ASSERT(prAdapter);
DBGLOG(NIC, WARN, "Wlan setaddkey timeout.\n");
if (prCmdInfo->fgIsOid)
kalOidComplete(prAdapter->prGlueInfo, prCmdInfo->fgSetQuery, 0, WLAN_STATUS_FAILURE);
}
VOID nicEventGetGtkDataSync(IN P_ADAPTER_T prAdapter, IN P_WIFI_EVENT_T prEvent)
{
P_PARAM_GTK_REKEY_DATA prGtkData = NULL;
struct SEC_DETECT_REPLAY_INFO *prDetRplyInfo = NULL;
P_BSS_INFO_T prBssInfo = NULL;
UINT_8 ucCurKeyId;
prGtkData = (P_PARAM_GTK_REKEY_DATA) (prEvent->aucBuffer);
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter,
prAdapter->prAisBssInfo->ucBssIndex);
prDetRplyInfo = &prBssInfo->rDetRplyInfo;
prDetRplyInfo->ucCurKeyId = prGtkData->ucCurKeyId;
ucCurKeyId = prDetRplyInfo->ucCurKeyId;
kalMemZero(prDetRplyInfo->arReplayPNInfo[ucCurKeyId].auPN, NL80211_REPLAY_CTR_LEN);
#if 0
/* if Drv alread rx a new PN value large than fw PN, then skip PN update */
if (qmRxDetectReplay(prGtkData->aucReplayCtr,
prDetRplyInfo->arReplayPNInfo[ucCurKeyId].auPN))
return;
#endif
kalMemCopy(prDetRplyInfo->arReplayPNInfo[ucCurKeyId].auPN,
prGtkData->aucReplayCtr, 6);
DBGLOG(RSN, INFO, "Get BC/MC PN update from fw.\n");
DBGLOG_MEM8(RSN, INFO, (PUINT_8)prDetRplyInfo->arReplayPNInfo[ucCurKeyId].auPN, NL80211_REPLAY_CTR_LEN);
}
#endif
VOID nicCmdEventGetTxPwrTbl(IN P_ADAPTER_T prAdapter, IN P_CMD_INFO_T prCmdInfo,
IN PUINT_8 pucEventBuf)
{
UINT_32 u4QueryInfoLen;
P_GLUE_INFO_T prGlueInfo;
struct EVENT_GET_TXPWR_TBL *prTxPwrTblEvent = NULL;
struct PARAM_CMD_GET_TXPWR_TBL *prTxPwrTbl = NULL;
void *info_buf = NULL;
if (!prAdapter) {
DBGLOG(NIC, ERROR, "NULL prAdapter!\n");
return;
}
if (!prCmdInfo) {
DBGLOG(NIC, ERROR, "NULL prCmdInfo!\n");
return;
}
if (!pucEventBuf || !prCmdInfo->pvInformationBuffer) {
if (prCmdInfo->fgIsOid) {
kalOidComplete(prAdapter->prGlueInfo,
prCmdInfo->fgSetQuery,
0,
WLAN_STATUS_FAILURE);
}
if (!pucEventBuf)
DBGLOG(NIC, WARN, "NULL pucEventBuf!\n");
if (!prCmdInfo->pvInformationBuffer)
DBGLOG(NIC, WARN, "NULL pvInformationBuffer!\n");
return;
}
if (prCmdInfo->fgIsOid) {
prGlueInfo = prAdapter->prGlueInfo;
info_buf = prCmdInfo->pvInformationBuffer;
prTxPwrTblEvent = (struct EVENT_GET_TXPWR_TBL *) pucEventBuf;
prTxPwrTbl = (struct PARAM_CMD_GET_TXPWR_TBL *) info_buf;
u4QueryInfoLen = sizeof(struct PARAM_CMD_GET_TXPWR_TBL);
prTxPwrTbl->ucCenterCh = prTxPwrTblEvent->ucCenterCh;
kalMemCopy(prTxPwrTbl->tx_pwr_tbl,
prTxPwrTblEvent->tx_pwr_tbl,
sizeof(prTxPwrTblEvent->tx_pwr_tbl));
kalOidComplete(prGlueInfo, prCmdInfo->fgSetQuery,
u4QueryInfoLen, WLAN_STATUS_SUCCESS);
}
}