blob: ea47f010cc8aadfb9ec1d23c75df497855eb5ad0 [file] [edit]
/*******************************************************************************
*
* 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/os/linux
* /gl_wext_priv.c#8
*/
/*! \file gl_wext_priv.c
* \brief This file includes private ioctl support.
*/
/*******************************************************************************
* 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_os.h"
#include "gl_wext_priv.h"
#if CFG_SUPPORT_QA_TOOL
#include "gl_ate_agent.h"
#include "gl_qa_agent.h"
#endif
#if CFG_SUPPORT_WAPI
#include "gl_sec.h"
#endif
#if CFG_ENABLE_WIFI_DIRECT
#include "gl_p2p_os.h"
#endif
/*
* #if CFG_SUPPORT_QA_TOOL
* extern UINT_16 g_u2DumpIndex;
* #endif
*/
/*******************************************************************************
* C O N S T A N T S
*******************************************************************************
*/
#define NUM_SUPPORTED_OIDS (sizeof(arWlanOidReqTable) / \
sizeof(struct WLAN_REQ_ENTRY))
#define CMD_OID_BUF_LENGTH 4096
#define CFG_STAT_DBG_PEER_NUM 10
#define TO_STR(value) #value
#define INT_TO_STR(value) TO_STR(value)
/*******************************************************************************
* F U N C T I O N D E C L A R A T I O N S
*******************************************************************************
*/
static int
priv_get_ndis(IN struct net_device *prNetDev,
IN struct NDIS_TRANSPORT_STRUCT *prNdisReq,
OUT uint32_t *pu4OutputLen);
static int
priv_set_ndis(IN struct net_device *prNetDev,
IN struct NDIS_TRANSPORT_STRUCT *prNdisReq,
OUT uint32_t *pu4OutputLen);
#if 0 /* CFG_SUPPORT_WPS */
static int
priv_set_appie(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, OUT char *pcExtra);
static int
priv_set_filter(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, OUT char *pcExtra);
#endif /* CFG_SUPPORT_WPS */
static u_int8_t reqSearchSupportedOidEntry(IN uint32_t rOid,
OUT struct WLAN_REQ_ENTRY **ppWlanReqEntry);
#if 0
static uint32_t
reqExtQueryConfiguration(IN struct GLUE_INFO *prGlueInfo,
OUT void *pvQueryBuffer, IN uint32_t u4QueryBufferLen,
OUT uint32_t *pu4QueryInfoLen);
static uint32_t
reqExtSetConfiguration(IN struct GLUE_INFO *prGlueInfo,
IN void *pvSetBuffer, IN uint32_t u4SetBufferLen,
OUT uint32_t *pu4SetInfoLen);
#endif
static uint32_t
reqExtSetAcpiDevicePowerState(IN struct GLUE_INFO
*prGlueInfo,
IN void *pvSetBuffer, IN uint32_t u4SetBufferLen,
OUT uint32_t *pu4SetInfoLen);
#if CFG_SUPPORT_CSI
static int priv_driver_set_csi(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen);
#endif
/*******************************************************************************
* P R I V A T E D A T A
*******************************************************************************
*/
static uint8_t aucOidBuf[CMD_OID_BUF_LENGTH] = { 0 };
/* OID processing table */
/* Order is important here because the OIDs should be in order of
* increasing value for binary searching.
*/
static struct WLAN_REQ_ENTRY arWlanOidReqTable[] = {
#if 0
{
(NDIS_OID)rOid,
(uint8_t *)pucOidName,
fgQryBufLenChecking, fgSetBufLenChecking,
fgIsHandleInGlueLayerOnly, u4InfoBufLen,
pfOidQueryHandler,
pfOidSetHandler
}
#endif
/* General Operational Characteristics */
/* Ethernet Operational Characteristics */
{
OID_802_3_CURRENT_ADDRESS,
DISP_STRING("OID_802_3_CURRENT_ADDRESS"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE, 6,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryCurrentAddr,
NULL
},
/* OID_802_3_MULTICAST_LIST */
/* OID_802_3_MAXIMUM_LIST_SIZE */
/* Ethernet Statistics */
/* NDIS 802.11 Wireless LAN OIDs */
{
OID_802_11_SUPPORTED_RATES,
DISP_STRING("OID_802_11_SUPPORTED_RATES"),
TRUE, FALSE, ENUM_OID_DRIVER_CORE,
(sizeof(uint8_t) * PARAM_MAX_LEN_RATES_EX),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQuerySupportedRates,
NULL
}
,
/*
* {OID_802_11_CONFIGURATION,
* DISP_STRING("OID_802_11_CONFIGURATION"),
* TRUE, TRUE, ENUM_OID_GLUE_EXTENSION,
* sizeof(struct PARAM_802_11_CONFIG),
* (PFN_OID_HANDLER_FUNC_REQ)reqExtQueryConfiguration,
* (PFN_OID_HANDLER_FUNC_REQ)reqExtSetConfiguration},
*/
{
OID_PNP_SET_POWER,
DISP_STRING("OID_PNP_SET_POWER"),
TRUE, FALSE, ENUM_OID_GLUE_EXTENSION,
sizeof(enum PARAM_DEVICE_POWER_STATE),
NULL,
(PFN_OID_HANDLER_FUNC_REQ) reqExtSetAcpiDevicePowerState
}
,
/* Custom OIDs */
{
OID_CUSTOM_OID_INTERFACE_VERSION,
DISP_STRING("OID_CUSTOM_OID_INTERFACE_VERSION"),
TRUE, FALSE, ENUM_OID_DRIVER_CORE, 4,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryOidInterfaceVersion,
NULL
}
,
#if 0
#if PTA_ENABLED
{
OID_CUSTOM_BT_COEXIST_CTRL,
DISP_STRING("OID_CUSTOM_BT_COEXIST_CTRL"),
FALSE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(PARAM_CUSTOM_BT_COEXIST_T),
NULL,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtCoexistCtrl
},
#endif
{
OID_CUSTOM_POWER_MANAGEMENT_PROFILE,
DISP_STRING("OID_CUSTOM_POWER_MANAGEMENT_PROFILE"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryPwrMgmtProfParam,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPwrMgmtProfParam},
{
OID_CUSTOM_PATTERN_CONFIG,
DISP_STRING("OID_CUSTOM_PATTERN_CONFIG"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(PARAM_CUSTOM_PATTERN_SEARCH_CONFIG_STRUCT_T),
NULL,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPatternConfig
},
{
OID_CUSTOM_BG_SSID_SEARCH_CONFIG,
DISP_STRING("OID_CUSTOM_BG_SSID_SEARCH_CONFIG"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
NULL,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBgSsidParam
},
{
OID_CUSTOM_VOIP_SETUP,
DISP_STRING("OID_CUSTOM_VOIP_SETUP"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryVoipConnectionStatus,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetVoipConnectionStatus
},
{
OID_CUSTOM_ADD_TS,
DISP_STRING("OID_CUSTOM_ADD_TS"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
NULL,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidAddTS
},
{
OID_CUSTOM_DEL_TS,
DISP_STRING("OID_CUSTOM_DEL_TS"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
NULL,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidDelTS
},
#if CFG_LP_PATTERN_SEARCH_SLT
{
OID_CUSTOM_SLT,
DISP_STRING("OID_CUSTOM_SLT"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQuerySltResult,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetSltMode
},
#endif
{
OID_CUSTOM_ROAMING_EN,
DISP_STRING("OID_CUSTOM_ROAMING_EN"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRoamingFunction,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetRoamingFunction},
{
OID_CUSTOM_WMM_PS_TEST,
DISP_STRING("OID_CUSTOM_WMM_PS_TEST"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE, 4,
NULL,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetWiFiWmmPsTest
},
{
OID_CUSTOM_COUNTRY_STRING,
DISP_STRING("OID_CUSTOM_COUNTRY_STRING"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryCurrentCountry,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetCurrentCountry
},
#if CFG_SUPPORT_802_11D
{
OID_CUSTOM_MULTI_DOMAIN_CAPABILITY,
DISP_STRING("OID_CUSTOM_MULTI_DOMAIN_CAPABILITY"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryMultiDomainCap,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetMultiDomainCap
},
#endif
{
OID_CUSTOM_GPIO2_MODE,
DISP_STRING("OID_CUSTOM_GPIO2_MODE"),
FALSE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(ENUM_PARAM_GPIO2_MODE_T),
NULL,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetGPIO2Mode},
{
OID_CUSTOM_CONTINUOUS_POLL,
DISP_STRING("OID_CUSTOM_CONTINUOUS_POLL"),
FALSE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(PARAM_CONTINUOUS_POLL_T),
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryContinuousPollInterval,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetContinuousPollProfile
},
{
OID_CUSTOM_DISABLE_BEACON_DETECTION,
DISP_STRING("OID_CUSTOM_DISABLE_BEACON_DETECTION"),
FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
(PFN_OID_HANDLER_FUNC_REQ)
wlanoidQueryDisableBeaconDetectionFunc,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisableBeaconDetectionFunc
},
/* WPS */
{
OID_CUSTOM_DISABLE_PRIVACY_CHECK,
DISP_STRING("OID_CUSTOM_DISABLE_PRIVACY_CHECK"),
FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
NULL,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetDisablePriavcyCheck
},
#endif
{
OID_CUSTOM_MCR_RW,
DISP_STRING("OID_CUSTOM_MCR_RW"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_CUSTOM_MCR_RW_STRUCT),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryMcrRead,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetMcrWrite}
,
{
OID_CUSTOM_EEPROM_RW,
DISP_STRING("OID_CUSTOM_EEPROM_RW"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_CUSTOM_EEPROM_RW_STRUCT),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryEepromRead,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetEepromWrite
}
,
{
OID_CUSTOM_SW_CTRL,
DISP_STRING("OID_CUSTOM_SW_CTRL"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_CUSTOM_SW_CTRL_STRUCT),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQuerySwCtrlRead,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetSwCtrlWrite
}
,
{
OID_CUSTOM_MEM_DUMP,
DISP_STRING("OID_CUSTOM_MEM_DUMP"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_CUSTOM_MEM_DUMP_STRUCT),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryMemDump,
NULL
}
,
{
OID_CUSTOM_TEST_MODE,
DISP_STRING("OID_CUSTOM_TEST_MODE"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
NULL,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidRftestSetTestMode
}
,
#if 0
{
OID_CUSTOM_TEST_RX_STATUS,
DISP_STRING("OID_CUSTOM_TEST_RX_STATUS"),
FALSE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_CUSTOM_RFTEST_RX_STATUS_STRUCT),
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRfTestRxStatus,
NULL
},
{
OID_CUSTOM_TEST_TX_STATUS,
DISP_STRING("OID_CUSTOM_TEST_TX_STATUS"),
FALSE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_CUSTOM_RFTEST_TX_STATUS_STRUCT),
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryRfTestTxStatus,
NULL
},
#endif
{
OID_CUSTOM_ABORT_TEST_MODE,
DISP_STRING("OID_CUSTOM_ABORT_TEST_MODE"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
NULL,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidRftestSetAbortTestMode
}
,
{
OID_CUSTOM_MTK_WIFI_TEST,
DISP_STRING("OID_CUSTOM_MTK_WIFI_TEST"),
/* PeiHsuan Temp Remove this check for workaround Gen2/Gen3 EM
* Mode Modification
*/
/* TRUE, TRUE, ENUM_OID_DRIVER_CORE,
* sizeof(PARAM_MTK_WIFI_TEST_STRUCT_T),
*/
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidRftestQueryAutoTest,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidRftestSetAutoTest
}
,
{
OID_CUSTOM_TEST_ICAP_MODE,
DISP_STRING("OID_CUSTOM_TEST_ICAP_MODE"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
NULL,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidRftestSetTestIcapMode
}
,
/* OID_CUSTOM_EMULATION_VERSION_CONTROL */
/* BWCS */
#if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS
{
OID_CUSTOM_BWCS_CMD,
DISP_STRING("OID_CUSTOM_BWCS_CMD"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(struct PTA_IPC),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryBT,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetBT
}
,
#endif
#if 0
{
OID_CUSTOM_SINGLE_ANTENNA,
DISP_STRING("OID_CUSTOM_SINGLE_ANTENNA"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 4,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryBtSingleAntenna,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetBtSingleAntenna
},
{
OID_CUSTOM_SET_PTA,
DISP_STRING("OID_CUSTOM_SET_PTA"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 4,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidQueryPta,
(PFN_OID_HANDLER_FUNC_REQ)wlanoidSetPta
},
#endif
{
OID_CUSTOM_MTK_NVRAM_RW,
DISP_STRING("OID_CUSTOM_MTK_NVRAM_RW"),
TRUE, TRUE, ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_CUSTOM_EEPROM_RW_STRUCT),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryNvramRead,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetNvramWrite}
,
{
OID_CUSTOM_CFG_SRC_TYPE,
DISP_STRING("OID_CUSTOM_CFG_SRC_TYPE"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE,
sizeof(enum ENUM_CFG_SRC_TYPE),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryCfgSrcType,
NULL
}
,
{
OID_CUSTOM_EEPROM_TYPE,
DISP_STRING("OID_CUSTOM_EEPROM_TYPE"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE,
sizeof(enum ENUM_EEPROM_TYPE),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryEepromType,
NULL
}
,
#if CFG_SUPPORT_WAPI
{
OID_802_11_WAPI_MODE,
DISP_STRING("OID_802_11_WAPI_MODE"),
FALSE, TRUE, ENUM_OID_DRIVER_CORE, 4,
NULL,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetWapiMode
}
,
{
OID_802_11_WAPI_ASSOC_INFO,
DISP_STRING("OID_802_11_WAPI_ASSOC_INFO"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
NULL,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetWapiAssocInfo
}
,
{
OID_802_11_SET_WAPI_KEY,
DISP_STRING("OID_802_11_SET_WAPI_KEY"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_WPI_KEY),
NULL,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetWapiKey
}
,
#endif
#if CFG_SUPPORT_WPS2
{
OID_802_11_WSC_ASSOC_INFO,
DISP_STRING("OID_802_11_WSC_ASSOC_INFO"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, 0,
NULL,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetWSCAssocInfo
}
,
#endif
#if CFG_SUPPORT_LOWLATENCY_MODE
/* Note: we should put following code in order */
{
OID_CUSTOM_LOWLATENCY_MODE, /* 0xFFA0CC00 */
DISP_STRING("OID_CUSTOM_LOWLATENCY_MODE"),
FALSE, FALSE, ENUM_OID_DRIVER_CORE, sizeof(uint32_t),
NULL,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetLowLatencyMode
}
,
#endif /* CFG_SUPPORT_LOWLATENCY_MODE */
{
OID_IPC_WIFI_LOG_UI,
DISP_STRING("OID_IPC_WIFI_LOG_UI"),
FALSE,
FALSE,
ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_WIFI_LOG_LEVEL_UI),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryWifiLogLevelSupport,
NULL
}
,
{
OID_IPC_WIFI_LOG_LEVEL,
DISP_STRING("OID_IPC_WIFI_LOG_LEVEL"),
FALSE,
FALSE,
ENUM_OID_DRIVER_CORE,
sizeof(struct PARAM_WIFI_LOG_LEVEL),
(PFN_OID_HANDLER_FUNC_REQ) wlanoidQueryWifiLogLevel,
(PFN_OID_HANDLER_FUNC_REQ) wlanoidSetWifiLogLevel
}
,
};
/*******************************************************************************
* F U N C T I O N S
*******************************************************************************
*/
/*----------------------------------------------------------------------------*/
/*!
* \brief Dispatching function for private ioctl region (SIOCIWFIRSTPRIV ~
* SIOCIWLASTPRIV).
*
* \param[in] prNetDev Net device requested.
* \param[in] prIfReq Pointer to ifreq structure.
* \param[in] i4Cmd Command ID between SIOCIWFIRSTPRIV and SIOCIWLASTPRIV.
*
* \retval 0 for success.
* \retval -EOPNOTSUPP If cmd is not supported.
* \retval -EFAULT For fail.
*
*/
/*----------------------------------------------------------------------------*/
int priv_support_ioctl(IN struct net_device *prNetDev,
IN OUT struct ifreq *prIfReq, IN int i4Cmd)
{
/* prIfReq is verified in the caller function wlanDoIOCTL() */
struct iwreq *prIwReq = (struct iwreq *)prIfReq;
struct iw_request_info rIwReqInfo;
/* prNetDev is verified in the caller function wlanDoIOCTL() */
/* Prepare the call */
rIwReqInfo.cmd = (__u16) i4Cmd;
rIwReqInfo.flags = 0;
switch (i4Cmd) {
case IOCTL_SET_INT:
/* NOTE(Kevin): 1/3 INT Type <= IFNAMSIZ, so we don't need
* copy_from/to_user()
*/
return priv_set_int(prNetDev, &rIwReqInfo, &(prIwReq->u),
(char *) &(prIwReq->u));
case IOCTL_GET_INT:
/* NOTE(Kevin): 1/3 INT Type <= IFNAMSIZ, so we don't need
* copy_from/to_user()
*/
return priv_get_int(prNetDev, &rIwReqInfo, &(prIwReq->u),
(char *) &(prIwReq->u));
case IOCTL_SET_STRUCT:
#if CFG_MTK_ENGINEER_MODE_SUPPORT
case IOCTL_SET_STRUCT_FOR_EM:
#endif
return priv_set_struct(prNetDev, &rIwReqInfo, &prIwReq->u,
(char *) &(prIwReq->u));
case IOCTL_GET_STRUCT:
return priv_get_struct(prNetDev, &rIwReqInfo, &prIwReq->u,
(char *) &(prIwReq->u));
#if (CFG_SUPPORT_QA_TOOL)
case IOCTL_QA_TOOL_DAEMON:
return priv_qa_agent(prNetDev, &rIwReqInfo, &(prIwReq->u),
(char *) &(prIwReq->u));
#endif
/* This case need to fall through */
case IOC_AP_GET_STA_LIST:
/* This case need to fall through */
case IOC_AP_SET_MAC_FLTR:
/* This case need to fall through */
case IOC_AP_SET_CFG:
/* This case need to fall through */
case IOC_AP_STA_DISASSOC:
return priv_set_ap(prNetDev, &rIwReqInfo, &(prIwReq->u),
(char *) &(prIwReq->u));
#if CFG_SUPPORT_WAC
case IOCTL_SET_DRIVER:
return priv_set_struct(prNetDev, &rIwReqInfo, &prIwReq->u,
(char *) &(prIwReq->u));
#endif
case IOCTL_GET_STR:
default:
return -EOPNOTSUPP;
} /* end of switch */
} /* priv_support_ioctl */
#if CFG_SUPPORT_BATCH_SCAN
struct EVENT_BATCH_RESULT
g_rEventBatchResult[CFG_BATCH_MAX_MSCAN];
uint32_t batchChannelNum2Freq(uint32_t u4ChannelNum)
{
uint32_t u4ChannelInMHz;
if (u4ChannelNum >= 1 && u4ChannelNum <= 13)
u4ChannelInMHz = 2412 + (u4ChannelNum - 1) * 5;
else if (u4ChannelNum == 14)
u4ChannelInMHz = 2484;
else if (u4ChannelNum == 133)
u4ChannelInMHz = 3665; /* 802.11y */
else if (u4ChannelNum == 137)
u4ChannelInMHz = 3685; /* 802.11y */
else if (u4ChannelNum >= 34 && u4ChannelNum <= 165)
u4ChannelInMHz = 5000 + u4ChannelNum * 5;
else if (u4ChannelNum >= 183 && u4ChannelNum <= 196)
u4ChannelInMHz = 4000 + u4ChannelNum * 5;
else
u4ChannelInMHz = 0;
return u4ChannelInMHz;
}
#define TMP_TEXT_LEN_S 40
#define TMP_TEXT_LEN_L 60
static uint8_t text1[TMP_TEXT_LEN_S], text2[TMP_TEXT_LEN_L],
text3[TMP_TEXT_LEN_L]; /* A safe len */
uint32_t
batchConvertResult(IN struct EVENT_BATCH_RESULT
*prEventBatchResult,
OUT void *pvBuffer, IN uint32_t u4MaxBufferLen,
OUT uint32_t *pu4RetLen)
{
int8_t *p = pvBuffer;
int8_t ssid[ELEM_MAX_LEN_SSID + 1];
int32_t nsize, nsize1, nsize2, nsize3, scancount;
int32_t i, j, nleft;
uint32_t freq;
struct EVENT_BATCH_RESULT_ENTRY *prEntry;
struct EVENT_BATCH_RESULT *pBr;
nsize = 0;
nleft = u4MaxBufferLen - 5; /* -5 for "----\n" */
pBr = prEventBatchResult;
scancount = 0;
for (j = 0; j < CFG_BATCH_MAX_MSCAN; j++) {
scancount += pBr->ucScanCount;
pBr++;
}
nsize1 = kalSnprintf(text1, TMP_TEXT_LEN_S,
"scancount=%d\nnextcount=%d\n", scancount,
scancount);
if (nsize1 < nleft) {
kalStrnCpy(p, text1, nsize1);
p += nsize1;
nleft -= nsize1;
} else
goto short_buf;
pBr = prEventBatchResult;
for (j = 0; j < CFG_BATCH_MAX_MSCAN; j++) {
DBGLOG(SCN, TRACE,
"convert mscan = %d, apcount=%d, nleft=%d\n", j,
pBr->ucScanCount, nleft);
if (pBr->ucScanCount == 0) {
pBr++;
continue;
}
nleft -= 5; /* -5 for "####\n" */
/* We only support one round scan result now. */
nsize1 = kalSnprintf(text1, TMP_TEXT_LEN_S, "apcount=%d\n",
pBr->ucScanCount);
if (nsize1 < nleft) {
kalStrnCpy(p, text1, nsize1);
p += nsize1;
nleft -= nsize1;
} else
goto short_buf;
for (i = 0; i < pBr->ucScanCount; i++) {
prEntry = &pBr->arBatchResult[i];
nsize1 = kalSnprintf(text1, TMP_TEXT_LEN_S,
"bssid=" MACSTR "\n",
MAC2STR(prEntry->aucBssid));
kalMemCopy(ssid,
prEntry->aucSSID,
(prEntry->ucSSIDLen < ELEM_MAX_LEN_SSID ?
prEntry->ucSSIDLen : ELEM_MAX_LEN_SSID));
ssid[(prEntry->ucSSIDLen <
(ELEM_MAX_LEN_SSID - 1) ? prEntry->ucSSIDLen :
(ELEM_MAX_LEN_SSID - 1))] = '\0';
nsize2 = kalSnprintf(text2, TMP_TEXT_LEN_L, "ssid=%s\n",
ssid);
freq = batchChannelNum2Freq(prEntry->ucFreq);
nsize3 =
kalSnprintf(text3, TMP_TEXT_LEN_L,
"freq=%u\nlevel=%d\ndist=%u\ndistSd=%u\n====\n",
freq, prEntry->cRssi, prEntry->u4Dist,
prEntry->u4Distsd);
nsize = nsize1 + nsize2 + nsize3;
if (nsize < nleft) {
kalStrnCpy(p, text1, TMP_TEXT_LEN_S);
p += nsize1;
kalStrnCpy(p, text2, TMP_TEXT_LEN_L);
p += nsize2;
kalStrnCpy(p, text3, TMP_TEXT_LEN_L);
p += nsize3;
nleft -= nsize;
} else {
DBGLOG(SCN, TRACE,
"Warning: Early break! (%d)\n", i);
break; /* discard following entries,
* TODO: apcount?
*/
}
}
nsize1 = kalSnprintf(text1, TMP_TEXT_LEN_S, "%s", "####\n");
if (nsize1 < nleft) {
kalStrnCpy(p, text1, nsize1);
p += nsize1;
nleft -= nsize1;
}
pBr++;
}
nsize1 = kalSnprintf(text1, TMP_TEXT_LEN_S, "%s", "----\n");
if (nsize1 < nleft) {
kalStrnCpy(p, text1, nsize1);
p += nsize1;
nleft -= nsize1;
}
*pu4RetLen = u4MaxBufferLen - nleft;
DBGLOG(SCN, TRACE, "total len = %d (max len = %d)\n",
*pu4RetLen, u4MaxBufferLen);
return WLAN_STATUS_SUCCESS;
short_buf:
DBGLOG(SCN, TRACE,
"Short buffer issue! %d > %d, %s\n",
u4MaxBufferLen + (nsize - nleft), u4MaxBufferLen,
(char *)pvBuffer);
return WLAN_STATUS_INVALID_LENGTH;
}
#endif
void
parseNoiseHistogramReport(uint32_t *i4BytesWritten, char *pcCommand,
int *i4TotalLen, IN struct CMD_NOISE_HISTOGRAM_REPORT *cmd)
{
if (cmd->ucAction == CMD_NOISE_HISTOGRAM_GET) {
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\nWF0 Noise IPI");
#if CFG_IPI_2CHAIN_SUPPORT
} else if (cmd->ucAction == CMD_NOISE_HISTOGRAM_GET2) {
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\nWF1 Noise IPI");
#endif /* CFG_IPI_2CHAIN_SUPPORT */
}
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n Power > -55: %10d", cmd->u4IPI10);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-55 >= Power > -60: %10d", cmd->u4IPI9);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-60 >= Power > -65: %10d", cmd->u4IPI8);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-65 >= Power > -70: %10d", cmd->u4IPI7);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-70 >= Power > -75: %10d", cmd->u4IPI6);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-75 >= Power > -80: %10d", cmd->u4IPI5);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-80 >= Power > -83: %10d", cmd->u4IPI4);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-83 >= Power > -86: %10d", cmd->u4IPI3);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-86 >= Power > -89: %10d", cmd->u4IPI2);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-89 >= Power > -92: %10d", cmd->u4IPI1);
*i4BytesWritten += snprintf(pcCommand + *i4BytesWritten,
*i4TotalLen - *i4BytesWritten,
"\n-92 >= Power : %10d", cmd->u4IPI0);
}
/*----------------------------------------------------------------------------*/
/*!
* \brief Private ioctl set int handler.
*
* \param[in] prNetDev Net device requested.
* \param[in] prIwReqInfo Pointer to iwreq structure.
* \param[in] prIwReqData The ioctl data structure, use the field of
* sub-command.
* \param[in] pcExtra The buffer with input value
*
* \retval 0 For success.
* \retval -EOPNOTSUPP If cmd is not supported.
* \retval -EINVAL If a value is out of range.
*
*/
/*----------------------------------------------------------------------------*/
int
priv_set_int(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, IN char *pcExtra)
{
uint32_t u4SubCmd;
uint32_t *pu4IntBuf;
struct NDIS_TRANSPORT_STRUCT *prNdisReq;
struct GLUE_INFO *prGlueInfo;
uint32_t u4BufLen = 0;
int status = 0;
struct PTA_IPC *prPtaIpc;
ASSERT(prNetDev);
ASSERT(prIwReqInfo);
ASSERT(prIwReqData);
ASSERT(pcExtra);
if (GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra) == FALSE)
return -EINVAL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
u4SubCmd = (uint32_t) prIwReqData->mode;
pu4IntBuf = (uint32_t *) pcExtra;
switch (u4SubCmd) {
case PRIV_CMD_TEST_MODE:
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY) {
prNdisReq->ndisOidCmd = OID_CUSTOM_TEST_MODE;
} else if (pu4IntBuf[1] == 0) {
prNdisReq->ndisOidCmd = OID_CUSTOM_ABORT_TEST_MODE;
} else if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY_ICAP) {
prNdisReq->ndisOidCmd = OID_CUSTOM_TEST_ICAP_MODE;
} else {
status = 0;
break;
}
prNdisReq->inNdisOidlength = 0;
prNdisReq->outNdisOidLength = 0;
/* Execute this OID */
status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
break;
case PRIV_CMD_TEST_CMD:
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
prNdisReq->inNdisOidlength = 8;
prNdisReq->outNdisOidLength = 8;
/* Execute this OID */
status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
break;
#if CFG_SUPPORT_PRIV_MCR_RW
case PRIV_CMD_ACCESS_MCR:
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
if (!prGlueInfo->fgMcrAccessAllowed) {
if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY
&& pu4IntBuf[2] == PRIV_CMD_TEST_MAGIC_KEY)
prGlueInfo->fgMcrAccessAllowed = TRUE;
status = 0;
break;
}
if (pu4IntBuf[1] == PRIV_CMD_TEST_MAGIC_KEY
&& pu4IntBuf[2] == PRIV_CMD_TEST_MAGIC_KEY) {
status = 0;
break;
}
kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
prNdisReq->inNdisOidlength = 8;
prNdisReq->outNdisOidLength = 8;
/* Execute this OID */
status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
break;
#endif
case PRIV_CMD_SW_CTRL:
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
prNdisReq->inNdisOidlength = 8;
prNdisReq->outNdisOidLength = 8;
/* Execute this OID */
status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
break;
#if 0
case PRIV_CMD_BEACON_PERIOD:
/* pu4IntBuf[0] is used as input SubCmd */
rStatus = wlanSetInformation(prGlueInfo->prAdapter,
wlanoidSetBeaconInterval, (void *)&pu4IntBuf[1],
sizeof(uint32_t), &u4BufLen);
break;
#endif
#if CFG_TCP_IP_CHKSUM_OFFLOAD
case PRIV_CMD_CSUM_OFFLOAD: {
uint32_t u4CSUMFlags;
if (pu4IntBuf[1] == 1)
u4CSUMFlags = CSUM_OFFLOAD_EN_ALL;
else if (pu4IntBuf[1] == 0)
u4CSUMFlags = 0;
else
return -EINVAL;
if (kalIoctl(prGlueInfo, wlanoidSetCSUMOffload,
(void *)&u4CSUMFlags, sizeof(uint32_t), FALSE, FALSE, TRUE,
&u4BufLen) == WLAN_STATUS_SUCCESS) {
if (pu4IntBuf[1] == 1)
prNetDev->features |= NETIF_F_IP_CSUM |
NETIF_F_IPV6_CSUM |
NETIF_F_RXCSUM;
else if (pu4IntBuf[1] == 0)
prNetDev->features &= ~(NETIF_F_IP_CSUM |
NETIF_F_IPV6_CSUM |
NETIF_F_RXCSUM);
}
}
break;
#endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
case PRIV_CMD_POWER_MODE: {
struct PARAM_POWER_MODE_ rPowerMode;
struct BSS_INFO *prBssInfo =
prGlueInfo->prAdapter->prAisBssInfo;
if (!prBssInfo)
break;
rPowerMode.ePowerMode = (enum PARAM_POWER_MODE)
pu4IntBuf[1];
rPowerMode.ucBssIdx = prBssInfo->ucBssIndex;
/* pu4IntBuf[0] is used as input SubCmd */
kalIoctl(prGlueInfo, wlanoidSet802dot11PowerSaveProfile,
&rPowerMode, sizeof(struct PARAM_POWER_MODE_),
FALSE, FALSE, TRUE, &u4BufLen);
}
break;
case PRIV_CMD_WMM_PS: {
struct PARAM_CUSTOM_WMM_PS_TEST_STRUCT rWmmPsTest;
rWmmPsTest.bmfgApsdEnAc = (uint8_t) pu4IntBuf[1];
rWmmPsTest.ucIsEnterPsAtOnce = (uint8_t) pu4IntBuf[2];
rWmmPsTest.ucIsDisableUcTrigger = (uint8_t) pu4IntBuf[3];
rWmmPsTest.reserved = 0;
kalIoctl(prGlueInfo, wlanoidSetWiFiWmmPsTest,
(void *)&rWmmPsTest,
sizeof(struct PARAM_CUSTOM_WMM_PS_TEST_STRUCT),
FALSE, FALSE, TRUE, &u4BufLen);
}
break;
#if 0
case PRIV_CMD_ADHOC_MODE:
/* pu4IntBuf[0] is used as input SubCmd */
rStatus = wlanSetInformation(prGlueInfo->prAdapter,
wlanoidSetAdHocMode, (void *)&pu4IntBuf[1],
sizeof(uint32_t), &u4BufLen);
break;
#endif
case PRIV_CUSTOM_BWCS_CMD:
DBGLOG(REQ, INFO,
"pu4IntBuf[1] = %x, size of struct PTA_IPC = %d.\n",
pu4IntBuf[1], (uint32_t) sizeof(struct PTA_IPC));
prPtaIpc = (struct PTA_IPC *) aucOidBuf;
prPtaIpc->u.aucBTPParams[0] = (uint8_t) (pu4IntBuf[1] >>
24);
prPtaIpc->u.aucBTPParams[1] = (uint8_t) (pu4IntBuf[1] >>
16);
prPtaIpc->u.aucBTPParams[2] = (uint8_t) (pu4IntBuf[1] >> 8);
prPtaIpc->u.aucBTPParams[3] = (uint8_t) (pu4IntBuf[1]);
DBGLOG(REQ, INFO,
"BCM BWCS CMD : PRIV_CUSTOM_BWCS_CMD : aucBTPParams[0] = %02x, aucBTPParams[1] = %02x.\n",
prPtaIpc->u.aucBTPParams[0],
prPtaIpc->u.aucBTPParams[1]);
DBGLOG(REQ, INFO,
"BCM BWCS CMD : PRIV_CUSTOM_BWCS_CMD : aucBTPParams[2] = %02x, aucBTPParams[3] = %02x.\n",
prPtaIpc->u.aucBTPParams[2],
prPtaIpc->u.aucBTPParams[3]);
#if 0
status = wlanSetInformation(prGlueInfo->prAdapter, wlanoidSetBT,
(void *)&aucOidBuf[0], u4CmdLen, &u4BufLen);
#endif
status = wlanoidSetBT(prGlueInfo->prAdapter,
(void *)&aucOidBuf[0], sizeof(struct PTA_IPC),
&u4BufLen);
if (status != WLAN_STATUS_SUCCESS)
status = -EFAULT;
break;
case PRIV_CMD_BAND_CONFIG: {
DBGLOG(INIT, INFO, "CMD set_band = %u\n",
(uint32_t) pu4IntBuf[1]);
}
break;
#if CFG_ENABLE_WIFI_DIRECT
case PRIV_CMD_P2P_MODE: {
struct PARAM_CUSTOM_P2P_SET_STRUCT rSetP2P;
uint32_t rWlanStatus = WLAN_STATUS_SUCCESS;
rSetP2P.u4Enable = pu4IntBuf[1];
rSetP2P.u4Mode = pu4IntBuf[2];
#if 1
if (!rSetP2P.u4Enable)
p2pNetUnregister(prGlueInfo, TRUE);
/* pu4IntBuf[0] is used as input SubCmd */
rWlanStatus = kalIoctl(prGlueInfo, wlanoidSetP2pMode,
(void *)&rSetP2P,
sizeof(struct PARAM_CUSTOM_P2P_SET_STRUCT),
FALSE, FALSE, TRUE, &u4BufLen);
if ((rSetP2P.u4Enable)
&& (rWlanStatus == WLAN_STATUS_SUCCESS))
p2pNetRegister(prGlueInfo, TRUE);
#endif
}
break;
#endif
#if (CFG_MET_PACKET_TRACE_SUPPORT == 1)
case PRIV_CMD_MET_PROFILING: {
/* PARAM_CUSTOM_WFD_DEBUG_STRUCT_T rWfdDebugModeInfo; */
/* rWfdDebugModeInfo.ucWFDDebugMode=(UINT_8)pu4IntBuf[1]; */
/* rWfdDebugModeInfo.u2SNPeriod=(UINT_16)pu4IntBuf[2]; */
/* DBGLOG(REQ, INFO, ("WFD Debug Mode:%d Period:%d\n",
* rWfdDebugModeInfo.ucWFDDebugMode,
* rWfdDebugModeInfo.u2SNPeriod));
*/
prGlueInfo->fgMetProfilingEn = (uint8_t) pu4IntBuf[1];
prGlueInfo->u2MetUdpPort = (uint16_t) pu4IntBuf[2];
/* DBGLOG(INIT, INFO, ("MET_PROF: Enable=%d UDP_PORT=%d\n",
* prGlueInfo->fgMetProfilingEn, prGlueInfo->u2MetUdpPort);
*/
}
break;
#endif
case PRIV_CMD_SET_SER:
kalIoctl(prGlueInfo, wlanoidSetSer, (void *)&pu4IntBuf[1],
sizeof(uint32_t), FALSE, FALSE, TRUE, &u4BufLen);
break;
default:
return -EOPNOTSUPP;
}
return status;
}/* priv_set_int */
/*----------------------------------------------------------------------------*/
/*!
* \brief Private ioctl get int handler.
*
* \param[in] pDev Net device requested.
* \param[out] pIwReq Pointer to iwreq structure.
* \param[in] prIwReqData The ioctl req structure, use the field of sub-command.
* \param[out] pcExtra The buffer with put the return value
*
* \retval 0 For success.
* \retval -EOPNOTSUPP If cmd is not supported.
* \retval -EFAULT For fail.
*
*/
/*----------------------------------------------------------------------------*/
int
priv_get_int(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, IN OUT char *pcExtra)
{
uint32_t u4SubCmd;
uint32_t *pu4IntBuf;
struct GLUE_INFO *prGlueInfo;
uint32_t u4BufLen = 0;
int status = 0;
struct NDIS_TRANSPORT_STRUCT *prNdisReq;
int32_t ch[MAX_CHN_NUM];
ASSERT(prNetDev);
ASSERT(prIwReqInfo);
ASSERT(prIwReqData);
ASSERT(pcExtra);
if (GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra) == FALSE)
return -EINVAL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
u4SubCmd = (uint32_t) prIwReqData->mode;
pu4IntBuf = (uint32_t *) pcExtra;
switch (u4SubCmd) {
case PRIV_CMD_TEST_CMD:
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
prNdisReq->ndisOidCmd = OID_CUSTOM_MTK_WIFI_TEST;
prNdisReq->inNdisOidlength = 8;
prNdisReq->outNdisOidLength = 8;
status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
if (status == 0) {
prIwReqData->mode = *(uint32_t *)
&prNdisReq->ndisOidContent[4];
}
return status;
#if CFG_SUPPORT_PRIV_MCR_RW
case PRIV_CMD_ACCESS_MCR:
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
if (!prGlueInfo->fgMcrAccessAllowed) {
status = 0;
return status;
}
kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
prNdisReq->ndisOidCmd = OID_CUSTOM_MCR_RW;
prNdisReq->inNdisOidlength = 8;
prNdisReq->outNdisOidLength = 8;
status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
if (status == 0) {
prIwReqData->mode = *(uint32_t *)
&prNdisReq->ndisOidContent[4];
}
return status;
#endif
case PRIV_CMD_DUMP_MEM:
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
if (!prGlueInfo->fgMcrAccessAllowed
|| !capable(CAP_NET_ADMIN)) {
DBGLOG(REQ, WARN, "Access Denied\n");
status = 0;
return status;
}
kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
prNdisReq->ndisOidCmd = OID_CUSTOM_MEM_DUMP;
prNdisReq->inNdisOidlength = sizeof(struct
PARAM_CUSTOM_MEM_DUMP_STRUCT);
prNdisReq->outNdisOidLength = sizeof(struct
PARAM_CUSTOM_MEM_DUMP_STRUCT);
status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
if (status == 0)
prIwReqData->mode = *(uint32_t *)
&prNdisReq->ndisOidContent[0];
return status;
case PRIV_CMD_SW_CTRL:
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
kalMemCopy(&prNdisReq->ndisOidContent[0], &pu4IntBuf[1], 8);
prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
prNdisReq->inNdisOidlength = 8;
prNdisReq->outNdisOidLength = 8;
status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
if (status == 0) {
prIwReqData->mode = *(uint32_t *)
&prNdisReq->ndisOidContent[4];
}
return status;
#if 0
case PRIV_CMD_BEACON_PERIOD:
status = wlanQueryInformation(prGlueInfo->prAdapter,
wlanoidQueryBeaconInterval, (void *) pu4IntBuf,
sizeof(uint32_t), &u4BufLen);
return status;
case PRIV_CMD_POWER_MODE:
status = wlanQueryInformation(prGlueInfo->prAdapter,
wlanoidQuery802dot11PowerSaveProfile,
(void *)pu4IntBuf, sizeof(uint32_t), &u4BufLen);
return status;
case PRIV_CMD_ADHOC_MODE:
status = wlanQueryInformation(prGlueInfo->prAdapter,
wlanoidQueryAdHocMode, (void *) pu4IntBuf,
sizeof(uint32_t), &u4BufLen);
return status;
#endif
case PRIV_CMD_BAND_CONFIG:
DBGLOG(INIT, INFO, "CMD get_band=\n");
prIwReqData->mode = 0;
return status;
default:
break;
}
u4SubCmd = (uint32_t) prIwReqData->data.flags;
switch (u4SubCmd) {
case PRIV_CMD_GET_CH_LIST: {
uint16_t i, j = 0;
uint8_t NumOfChannel = MAX_CHN_NUM;
uint8_t ucMaxChannelNum = MAX_CHN_NUM;
struct RF_CHANNEL_INFO *aucChannelList;
DBGLOG(RLM, INFO, "Domain: Query Channel List.\n");
aucChannelList = (struct RF_CHANNEL_INFO *)
kalMemAlloc(sizeof(struct RF_CHANNEL_INFO)*MAX_CHN_NUM,
VIR_MEM_TYPE);
if (!aucChannelList) {
DBGLOG(REQ, ERROR,
"Can not alloc memory for rf channel info\n");
return -ENOMEM;
}
kalMemZero(aucChannelList,
sizeof(struct RF_CHANNEL_INFO)*MAX_CHN_NUM);
kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum,
&NumOfChannel, aucChannelList);
if (NumOfChannel > MAX_CHN_NUM)
NumOfChannel = MAX_CHN_NUM;
if (kalIsAPmode(prGlueInfo)) {
for (i = 0; i < NumOfChannel; i++) {
if ((aucChannelList[i].ucChannelNum <= 13) ||
(aucChannelList[i].ucChannelNum == 36
|| aucChannelList[i].ucChannelNum == 40
|| aucChannelList[i].ucChannelNum == 44
|| aucChannelList[i].ucChannelNum == 48)) {
ch[j] = (int32_t) aucChannelList[i]
.ucChannelNum;
j++;
}
}
} else {
for (j = 0; j < NumOfChannel; j++)
ch[j] = (int32_t)aucChannelList[j].ucChannelNum;
}
kalMemFree(aucChannelList, VIR_MEM_TYPE,
sizeof(struct RF_CHANNEL_INFO)*MAX_CHN_NUM);
prIwReqData->data.length = j;
if (copy_to_user(prIwReqData->data.pointer, ch,
NumOfChannel * sizeof(int32_t)))
return -EFAULT;
else
return status;
}
default:
return -EOPNOTSUPP;
}
return status;
}/* priv_get_int */
/*----------------------------------------------------------------------------*/
/*!
* \brief Private ioctl set int array handler.
*
* \param[in] prNetDev Net device requested.
* \param[in] prIwReqInfo Pointer to iwreq structure.
* \param[in] prIwReqData The ioctl data structure, use the field of
* sub-command.
* \param[in] pcExtra The buffer with input value
*
* \retval 0 For success.
* \retval -EOPNOTSUPP If cmd is not supported.
* \retval -EINVAL If a value is out of range.
*
*/
/*----------------------------------------------------------------------------*/
int
priv_set_ints(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, IN char *pcExtra)
{
uint16_t i = 0;
uint32_t u4SubCmd, u4BufLen, u4CmdLen;
struct GLUE_INFO *prGlueInfo;
int32_t setting[4] = {0};
int status = 0;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
struct SET_TXPWR_CTRL *prTxpwr;
ASSERT(prNetDev);
ASSERT(prIwReqInfo);
ASSERT(prIwReqData);
ASSERT(pcExtra);
if (GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra) == FALSE)
return -EINVAL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
u4SubCmd = (uint32_t) prIwReqData->data.flags;
u4CmdLen = (uint32_t) prIwReqData->data.length;
switch (u4SubCmd) {
case PRIV_CMD_SET_TX_POWER: {
if (u4CmdLen > 4)
return -EINVAL;
if (copy_from_user(setting, prIwReqData->data.pointer,
u4CmdLen))
return -EFAULT;
#if 0
DBGLOG(INIT, INFO, "Tx power num = %d\n",
prIwReqData->data.length);
DBGLOG(INIT, INFO,
"Tx power setting = %d %d %d %d\n", setting[0],
setting[1], setting[2], setting[3]);
#endif
prTxpwr = &prGlueInfo->rTxPwr;
if (setting[0] == 0
&& prIwReqData->data.length == 4 /* argc num */) {
/* 0 (All networks), 1 (legacy STA), 2 (Hotspot AP),
* 3 (P2P), 4 (BT over Wi-Fi)
*/
if (setting[1] == 1 || setting[1] == 0) {
if (setting[2] == 0 || setting[2] == 1)
prTxpwr->c2GLegacyStaPwrOffset =
setting[3];
if (setting[2] == 0 || setting[2] == 2)
prTxpwr->c5GLegacyStaPwrOffset =
setting[3];
}
if (setting[1] == 2 || setting[1] == 0) {
if (setting[2] == 0 || setting[2] == 1)
prTxpwr->c2GHotspotPwrOffset =
setting[3];
if (setting[2] == 0 || setting[2] == 2)
prTxpwr->c5GHotspotPwrOffset =
setting[3];
}
if (setting[1] == 3 || setting[1] == 0) {
if (setting[2] == 0 || setting[2] == 1)
prTxpwr->c2GP2pPwrOffset = setting[3];
if (setting[2] == 0 || setting[2] == 2)
prTxpwr->c5GP2pPwrOffset = setting[3];
}
if (setting[1] == 4 || setting[1] == 0) {
if (setting[2] == 0 || setting[2] == 1)
prTxpwr->c2GBowPwrOffset = setting[3];
if (setting[2] == 0 || setting[2] == 2)
prTxpwr->c5GBowPwrOffset = setting[3];
}
} else if (setting[0] == 1
&& prIwReqData->data.length == 2) {
prTxpwr->ucConcurrencePolicy = setting[1];
} else if (setting[0] == 2
&& prIwReqData->data.length == 3) {
if (setting[1] == 0) {
for (i = 0; i < 14; i++)
prTxpwr->acTxPwrLimit2G[i] = setting[2];
} else if (setting[1] <= 14)
prTxpwr->acTxPwrLimit2G[setting[1] - 1] =
setting[2];
} else if (setting[0] == 3
&& prIwReqData->data.length == 3) {
if (setting[1] == 0) {
for (i = 0; i < 4; i++)
prTxpwr->acTxPwrLimit5G[i] = setting[2];
} else if (setting[1] <= 4)
prTxpwr->acTxPwrLimit5G[setting[1] - 1] =
setting[2];
} else if (setting[0] == 4
&& prIwReqData->data.length == 2) {
if (setting[1] == 0)
wlanDefTxPowerCfg(prGlueInfo->prAdapter);
rStatus = kalIoctl(prGlueInfo, wlanoidSetTxPower,
prTxpwr,
sizeof(struct SET_TXPWR_CTRL),
FALSE, FALSE, TRUE, &u4BufLen);
} else
return -EFAULT;
}
return status;
default:
break;
}
return status;
}/* priv_set_ints */
/*----------------------------------------------------------------------------*/
/*!
* \brief Private ioctl get int array handler.
*
* \param[in] pDev Net device requested.
* \param[out] pIwReq Pointer to iwreq structure.
* \param[in] prIwReqData The ioctl req structure, use the field of sub-command.
* \param[out] pcExtra The buffer with put the return value
*
* \retval 0 For success.
* \retval -EOPNOTSUPP If cmd is not supported.
* \retval -EFAULT For fail.
*
*/
/*----------------------------------------------------------------------------*/
int
priv_get_ints(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, IN OUT char *pcExtra)
{
uint32_t u4SubCmd;
struct GLUE_INFO *prGlueInfo;
int status = 0;
int32_t ch[MAX_CHN_NUM];
ASSERT(prNetDev);
ASSERT(prIwReqInfo);
ASSERT(prIwReqData);
ASSERT(pcExtra);
if (GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra) == FALSE)
return -EINVAL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
u4SubCmd = (uint32_t) prIwReqData->data.flags;
switch (u4SubCmd) {
case PRIV_CMD_GET_CH_LIST: {
uint16_t i;
uint8_t NumOfChannel = MAX_CHN_NUM;
uint8_t ucMaxChannelNum = MAX_CHN_NUM;
struct RF_CHANNEL_INFO aucChannelList[MAX_CHN_NUM];
kalGetChannelList(prGlueInfo, BAND_NULL, ucMaxChannelNum,
&NumOfChannel, aucChannelList);
if (NumOfChannel > MAX_CHN_NUM)
NumOfChannel = MAX_CHN_NUM;
for (i = 0; i < NumOfChannel; i++)
ch[i] = (int32_t) aucChannelList[i].ucChannelNum;
prIwReqData->data.length = NumOfChannel;
if (copy_to_user(prIwReqData->data.pointer, ch,
NumOfChannel * sizeof(int32_t)))
return -EFAULT;
else
return status;
}
default:
break;
}
return status;
}/* priv_get_ints */
/*----------------------------------------------------------------------------*/
/*!
* \brief Private ioctl set structure handler.
*
* \param[in] pDev Net device requested.
* \param[in] prIwReqData Pointer to iwreq_data structure.
*
* \retval 0 For success.
* \retval -EOPNOTSUPP If cmd is not supported.
* \retval -EINVAL If a value is out of range.
*
*/
/*----------------------------------------------------------------------------*/
int
priv_set_struct(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, IN char *pcExtra)
{
uint32_t u4SubCmd = 0;
int status = 0;
/* WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; */
uint32_t u4CmdLen = 0;
struct NDIS_TRANSPORT_STRUCT *prNdisReq;
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4BufLen = 0;
ASSERT(prNetDev);
/* ASSERT(prIwReqInfo); */
ASSERT(prIwReqData);
/* ASSERT(pcExtra); */
kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
if (GLUE_CHK_PR2(prNetDev, prIwReqData) == FALSE)
return -EINVAL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
u4SubCmd = (uint32_t) prIwReqData->data.flags;
#if 0
DBGLOG(INIT, INFO,
"priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
prIwReqInfo->cmd, u4SubCmd);
#endif
switch (u4SubCmd) {
#if 0 /* PTA_ENABLED */
case PRIV_CMD_BT_COEXIST:
u4CmdLen = prIwReqData->data.length * sizeof(uint32_t);
ASSERT(sizeof(PARAM_CUSTOM_BT_COEXIST_T) >= u4CmdLen);
if (sizeof(PARAM_CUSTOM_BT_COEXIST_T) < u4CmdLen)
return -EFAULT;
if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer,
u4CmdLen)) {
status = -EFAULT; /* return -EFAULT; */
break;
}
rStatus = wlanSetInformation(prGlueInfo->prAdapter,
wlanoidSetBtCoexistCtrl, (void *)&aucOidBuf[0],
u4CmdLen, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
status = -EFAULT;
break;
#endif
case PRIV_CUSTOM_BWCS_CMD:
u4CmdLen = prIwReqData->data.length * sizeof(uint32_t);
ASSERT(sizeof(struct PTA_IPC) >= u4CmdLen);
if (sizeof(struct PTA_IPC) < u4CmdLen)
return -EFAULT;
#if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
DBGLOG(REQ, INFO,
"ucCmdLen = %d, size of struct PTA_IPC = %d, prIwReqData->data = 0x%x.\n",
u4CmdLen, sizeof(struct PTA_IPC), prIwReqData->data);
DBGLOG(REQ, INFO,
"priv_set_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
prIwReqInfo->cmd,
u4SubCmd);
DBGLOG(REQ, INFO, "*pcExtra = 0x%x\n", *pcExtra);
#endif
if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer,
u4CmdLen)) {
status = -EFAULT; /* return -EFAULT; */
break;
}
#if CFG_SUPPORT_BCM && CFG_SUPPORT_BCM_BWCS && CFG_SUPPORT_BCM_BWCS_DEBUG
DBGLOG(REQ, INFO,
"priv_set_struct(): BWCS CMD = %02x%02x%02x%02x\n",
aucOidBuf[2], aucOidBuf[3],
aucOidBuf[4], aucOidBuf[5]);
#endif
#if 0
status = wlanSetInformation(prGlueInfo->prAdapter, wlanoidSetBT,
(void *)&aucOidBuf[0], u4CmdLen, &u4BufLen);
#endif
#if 1
status = wlanoidSetBT(prGlueInfo->prAdapter,
(void *)&aucOidBuf[0], u4CmdLen, &u4BufLen);
#endif
if (status != WLAN_STATUS_SUCCESS)
status = -EFAULT;
break;
#if CFG_SUPPORT_WPS2
case PRIV_CMD_WSC_PROBE_REQ: {
/* retrieve IE for Probe Request */
u4CmdLen = prIwReqData->data.length;
if (u4CmdLen > GLUE_INFO_WSCIE_LENGTH) {
DBGLOG(REQ, ERROR, "Input data length is invalid %u\n",
u4CmdLen);
return -EINVAL;
}
if (prIwReqData->data.length > 0) {
if (copy_from_user(prGlueInfo->aucWSCIE,
prIwReqData->data.pointer,
u4CmdLen)) {
status = -EFAULT;
break;
}
prGlueInfo->u2WSCIELen = u4CmdLen;
} else {
prGlueInfo->u2WSCIELen = 0;
}
}
break;
#endif
case PRIV_CMD_OID:
u4CmdLen = prIwReqData->data.length;
if (u4CmdLen > CMD_OID_BUF_LENGTH) {
DBGLOG(REQ, ERROR, "Input data length is invalid %u\n",
u4CmdLen);
return -EINVAL;
}
if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer,
u4CmdLen)) {
status = -EFAULT;
break;
}
if (!kalMemCmp(&aucOidBuf[0], pcExtra, u4CmdLen)) {
/* ToDo:: DBGLOG */
DBGLOG(REQ, INFO, "pcExtra buffer is valid\n");
} else {
DBGLOG(REQ, INFO, "pcExtra 0x%p\n", pcExtra);
}
/* Execute this OID */
status = priv_set_ndis(prNetDev,
(struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0],
&u4BufLen);
/* Copy result to user space */
((struct NDIS_TRANSPORT_STRUCT *)
&aucOidBuf[0])->outNdisOidLength = u4BufLen;
if (copy_to_user(prIwReqData->data.pointer, &aucOidBuf[0],
OFFSET_OF(struct NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
DBGLOG(REQ, INFO, "copy_to_user oidBuf fail\n");
status = -EFAULT;
}
break;
case PRIV_CMD_SW_CTRL:
u4CmdLen = prIwReqData->data.length;
if (u4CmdLen > CMD_OID_BUF_LENGTH) {
DBGLOG(REQ, ERROR, "Input data length is invalid %u\n",
u4CmdLen);
return -EINVAL;
}
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
if (u4CmdLen > sizeof(prNdisReq->ndisOidContent)) {
DBGLOG(REQ, ERROR, "Input data length is invalid %u\n",
u4CmdLen);
return -EINVAL;
}
if (copy_from_user(&prNdisReq->ndisOidContent[0],
prIwReqData->data.pointer, u4CmdLen)) {
status = -EFAULT;
break;
}
prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
prNdisReq->inNdisOidlength = 8;
prNdisReq->outNdisOidLength = 8;
/* Execute this OID */
status = priv_set_ndis(prNetDev, prNdisReq, &u4BufLen);
break;
#if CFG_SUPPORT_WAC
case PRIV_CMD_WAC_IE:
/* Set WAC IE */
if (prIwReqData->data.length > 0) {
if (prIwReqData->data.length > ELEM_MAX_LEN_WAC_INFO) {
DBGLOG(REQ, ERROR, "exceed len(%ld),ignore\n",
prIwReqData->data.length);
break;
}
kalMemZero(prGlueInfo->prAdapter->
rWifiVar.aucWACIECache,
sizeof(prGlueInfo->prAdapter->rWifiVar.aucWACIECache));
if (copy_from_user(prGlueInfo->prAdapter->
rWifiVar.aucWACIECache,
prIwReqData->data.pointer,
prIwReqData->data.length)) {
status = -EFAULT;
DBGLOG(REQ, ERROR, "cp_f_us WACIE failed!\n");
break;
}
prGlueInfo->prAdapter->rWifiVar.u2WACIELen =
prIwReqData->data.length;
DBGLOG(REQ, INFO, "Set WAC IE:\n");
dumpMemory8(prGlueInfo->prAdapter->
rWifiVar.aucWACIECache,
prGlueInfo->prAdapter->rWifiVar.u2WACIELen);
} else {
prGlueInfo->prAdapter->rWifiVar.u2WACIELen = 0;
}
break;
#endif
default:
return -EOPNOTSUPP;
}
return status;
}/* priv_set_struct */
/*----------------------------------------------------------------------------*/
/*!
* \brief Private ioctl get struct handler.
*
* \param[in] pDev Net device requested.
* \param[out] pIwReq Pointer to iwreq structure.
* \param[in] cmd Private sub-command.
*
* \retval 0 For success.
* \retval -EFAULT If copy from user space buffer fail.
* \retval -EOPNOTSUPP Parameter "cmd" not recognized.
*
*/
/*----------------------------------------------------------------------------*/
int
priv_get_struct(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, IN OUT char *pcExtra)
{
uint32_t u4SubCmd = 0;
struct NDIS_TRANSPORT_STRUCT *prNdisReq = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4BufLen = 0;
/* uint32_t *pu4IntBuf = NULL; */
int status = 0;
kalMemZero(&aucOidBuf[0], sizeof(aucOidBuf));
ASSERT(prNetDev);
ASSERT(prIwReqData);
if (!prNetDev || !prIwReqData) {
DBGLOG(REQ, INFO,
"priv_get_struct(): invalid param(0x%p, 0x%p)\n",
prNetDev, prIwReqData);
return -EINVAL;
}
u4SubCmd = (uint32_t) prIwReqData->data.flags;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
if (!prGlueInfo) {
DBGLOG(REQ, INFO,
"priv_get_struct(): invalid prGlueInfo(0x%p, 0x%p)\n",
prNetDev,
*((struct GLUE_INFO **) netdev_priv(prNetDev)));
return -EINVAL;
}
#if 0
DBGLOG(INIT, INFO,
"priv_get_struct(): prIwReqInfo->cmd(0x%X), u4SubCmd(%ld)\n",
prIwReqInfo->cmd, u4SubCmd);
#endif
memset(aucOidBuf, 0, sizeof(aucOidBuf));
switch (u4SubCmd) {
case PRIV_CMD_OID:
if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer,
sizeof(struct NDIS_TRANSPORT_STRUCT))) {
DBGLOG(REQ, INFO,
"priv_get_struct() copy_from_user oidBuf fail\n");
return -EFAULT;
}
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
#if 0
DBGLOG(INIT, INFO,
"\n priv_get_struct cmd 0x%02x len:%d OID:0x%08x OID Len:%d\n",
cmd,
pIwReq->u.data.length, ndisReq->ndisOidCmd,
ndisReq->inNdisOidlength);
#endif
if (priv_get_ndis(prNetDev, prNdisReq, &u4BufLen) == 0) {
prNdisReq->outNdisOidLength = u4BufLen;
kalMemCopy(pcExtra, prNdisReq,
u4BufLen + sizeof(struct NDIS_TRANSPORT_STRUCT)
- sizeof(prNdisReq->ndisOidContent));
return 0;
}
prNdisReq->outNdisOidLength = u4BufLen;
if (copy_to_user(prIwReqData->data.pointer,
&aucOidBuf[0], OFFSET_OF(struct NDIS_TRANSPORT_STRUCT,
ndisOidContent))) {
DBGLOG(REQ, INFO,
"priv_get_struct() copy_to_user oidBuf fail(2)\n"
);
}
return -EFAULT;
case PRIV_CMD_SW_CTRL:
/* pu4IntBuf = (uint32_t *) prIwReqData->data.pointer; */
prNdisReq = (struct NDIS_TRANSPORT_STRUCT *) &aucOidBuf[0];
if (prIwReqData->data.length > (sizeof(aucOidBuf) -
OFFSET_OF(struct NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
DBGLOG(REQ, INFO,
"priv_get_struct() exceeds length limit\n");
return -EFAULT;
}
/* if (copy_from_user(&prNdisReq->ndisOidContent[0],
* prIwReqData->data.pointer,
*/
/* Coverity uanble to detect real size of ndisOidContent,
* it's 4084 bytes instead of 16 bytes
*/
if (copy_from_user(&aucOidBuf[OFFSET_OF(struct
NDIS_TRANSPORT_STRUCT, ndisOidContent)],
prIwReqData->data.pointer,
prIwReqData->data.length)) {
DBGLOG(REQ, INFO,
"priv_get_struct() copy_from_user oidBuf fail\n");
return -EFAULT;
}
prNdisReq->ndisOidCmd = OID_CUSTOM_SW_CTRL;
prNdisReq->inNdisOidlength = 8;
prNdisReq->outNdisOidLength = 8;
status = priv_get_ndis(prNetDev, prNdisReq, &u4BufLen);
if (status == 0) {
prNdisReq->outNdisOidLength = u4BufLen;
if (copy_to_user(prIwReqData->data.pointer,
&prNdisReq->ndisOidContent[4], 4))
DBGLOG(REQ, INFO,
"priv_get_struct() copy_to_user oidBuf fail(2)\n"
);
}
return 0;
default:
DBGLOG(REQ, WARN, "get struct cmd:0x%x\n", u4SubCmd);
return -EOPNOTSUPP;
}
} /* priv_get_struct */
/*----------------------------------------------------------------------------*/
/*!
* \brief The routine handles a set operation for a single OID.
*
* \param[in] pDev Net device requested.
* \param[in] ndisReq Ndis request OID information copy from user.
* \param[out] outputLen_p If the call is successful, returns the number of
* bytes written into the query buffer. If the
* call failed due to invalid length of the query
* buffer, returns the amount of storage needed..
*
* \retval 0 On success.
* \retval -EOPNOTSUPP If cmd is not supported.
*
*/
/*----------------------------------------------------------------------------*/
static int
priv_set_ndis(IN struct net_device *prNetDev,
IN struct NDIS_TRANSPORT_STRUCT *prNdisReq,
OUT uint32_t *pu4OutputLen)
{
struct WLAN_REQ_ENTRY *prWlanReqEntry = NULL;
uint32_t status = WLAN_STATUS_SUCCESS;
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4SetInfoLen = 0;
ASSERT(prNetDev);
ASSERT(prNdisReq);
ASSERT(pu4OutputLen);
if (!prNetDev || !prNdisReq || !pu4OutputLen) {
DBGLOG(REQ, INFO,
"priv_set_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
prNetDev, prNdisReq, pu4OutputLen);
return -EINVAL;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
if (!prGlueInfo) {
DBGLOG(REQ, INFO,
"priv_set_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
prNetDev,
*((struct GLUE_INFO **) netdev_priv(prNetDev)));
return -EINVAL;
}
#if 0
DBGLOG(INIT, INFO,
"priv_set_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
prNdisReq->ndisOidCmd);
#endif
if (reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
&prWlanReqEntry) == FALSE) {
/* WARNLOG(
* ("Set OID: 0x%08lx (unknown)\n",
* prNdisReq->ndisOidCmd));
*/
return -EOPNOTSUPP;
}
if (prWlanReqEntry->pfOidSetHandler == NULL) {
/* WARNLOG(
* ("Set %s: Null set handler\n",
* prWlanReqEntry->pucOidName));
*/
return -EOPNOTSUPP;
}
#if 0
DBGLOG(INIT, INFO, "priv_set_ndis(): %s\n",
prWlanReqEntry->pucOidName);
#endif
if (prWlanReqEntry->fgSetBufLenChecking) {
if (prNdisReq->inNdisOidlength !=
prWlanReqEntry->u4InfoBufLen) {
DBGLOG(REQ, WARN,
"Set %s: Invalid length (current=%d, needed=%d)\n",
prWlanReqEntry->pucOidName,
prNdisReq->inNdisOidlength,
prWlanReqEntry->u4InfoBufLen);
*pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
return -EINVAL;
}
} else {
if (prNdisReq->inNdisOidlength >
(sizeof(aucOidBuf) -
OFFSET_OF(struct NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
DBGLOG(REQ, INFO, "exceeds length limit\n");
return -EINVAL;
}
}
if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
/* GLUE sw info only */
status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
prNdisReq->ndisOidContent,
prNdisReq->inNdisOidlength, &u4SetInfoLen);
} else if (prWlanReqEntry->eOidMethod ==
ENUM_OID_GLUE_EXTENSION) {
/* multiple sw operations */
status = prWlanReqEntry->pfOidSetHandler(prGlueInfo,
prNdisReq->ndisOidContent,
prNdisReq->inNdisOidlength, &u4SetInfoLen);
} else if (prWlanReqEntry->eOidMethod ==
ENUM_OID_DRIVER_CORE) {
/* driver core */
status = kalIoctl(prGlueInfo,
(PFN_OID_HANDLER_FUNC) prWlanReqEntry->pfOidSetHandler,
prNdisReq->ndisOidContent,
prNdisReq->inNdisOidlength,
FALSE, FALSE, TRUE, &u4SetInfoLen);
} else {
DBGLOG(REQ, INFO,
"priv_set_ndis(): unsupported OID method:0x%x\n",
prWlanReqEntry->eOidMethod);
return -EOPNOTSUPP;
}
*pu4OutputLen = u4SetInfoLen;
switch (status) {
case WLAN_STATUS_SUCCESS:
break;
case WLAN_STATUS_INVALID_LENGTH:
/* WARNLOG(
* ("Set %s: Invalid length (current=%ld, needed=%ld)\n",
* prWlanReqEntry->pucOidName,
* prNdisReq->inNdisOidlength,
* u4SetInfoLen));
*/
break;
}
if (status != WLAN_STATUS_SUCCESS)
return -EFAULT;
return 0;
} /* priv_set_ndis */
/*----------------------------------------------------------------------------*/
/*!
* \brief The routine handles a query operation for a single OID. Basically we
* return information about the current state of the OID in question.
*
* \param[in] pDev Net device requested.
* \param[in] ndisReq Ndis request OID information copy from user.
* \param[out] outputLen_p If the call is successful, returns the number of
* bytes written into the query buffer. If the
* call failed due to invalid length of the query
* buffer, returns the amount of storage needed..
*
* \retval 0 On success.
* \retval -EOPNOTSUPP If cmd is not supported.
* \retval -EINVAL invalid input parameters
*
*/
/*----------------------------------------------------------------------------*/
static int
priv_get_ndis(IN struct net_device *prNetDev,
IN struct NDIS_TRANSPORT_STRUCT *prNdisReq,
OUT uint32_t *pu4OutputLen)
{
struct WLAN_REQ_ENTRY *prWlanReqEntry = NULL;
uint32_t u4BufLen = 0;
uint32_t status = WLAN_STATUS_SUCCESS;
struct GLUE_INFO *prGlueInfo = NULL;
ASSERT(prNetDev);
ASSERT(prNdisReq);
ASSERT(pu4OutputLen);
if (!prNetDev || !prNdisReq || !pu4OutputLen) {
DBGLOG(REQ, INFO,
"priv_get_ndis(): invalid param(0x%p, 0x%p, 0x%p)\n",
prNetDev, prNdisReq, pu4OutputLen);
return -EINVAL;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
if (!prGlueInfo) {
DBGLOG(REQ, INFO,
"priv_get_ndis(): invalid prGlueInfo(0x%p, 0x%p)\n",
prNetDev,
*((struct GLUE_INFO **) netdev_priv(prNetDev)));
return -EINVAL;
}
#if 0
DBGLOG(INIT, INFO,
"priv_get_ndis(): prNdisReq->ndisOidCmd(0x%lX)\n",
prNdisReq->ndisOidCmd);
#endif
if (reqSearchSupportedOidEntry(prNdisReq->ndisOidCmd,
&prWlanReqEntry) == FALSE) {
/* WARNLOG(
* ("Query OID: 0x%08lx (unknown)\n",
* prNdisReq->ndisOidCmd));
*/
return -EOPNOTSUPP;
}
if (prWlanReqEntry->pfOidQueryHandler == NULL) {
/* WARNLOG(
* ("Query %s: Null query handler\n",
* prWlanReqEntry->pucOidName));
*/
return -EOPNOTSUPP;
}
#if 0
DBGLOG(INIT, INFO, "priv_get_ndis(): %s\n",
prWlanReqEntry->pucOidName);
#endif
if (prWlanReqEntry->fgQryBufLenChecking) {
if (prNdisReq->inNdisOidlength <
prWlanReqEntry->u4InfoBufLen) {
/* Not enough room in InformationBuffer. Punt */
/* WARNLOG(
* ("Query %s: Buffer too short (current=%ld,
* needed=%ld)\n",
* prWlanReqEntry->pucOidName,
* prNdisReq->inNdisOidlength,
* prWlanReqEntry->u4InfoBufLen));
*/
*pu4OutputLen = prWlanReqEntry->u4InfoBufLen;
status = WLAN_STATUS_INVALID_LENGTH;
return -EINVAL;
}
} else {
if (prNdisReq->inNdisOidlength >
(sizeof(aucOidBuf) -
OFFSET_OF(struct NDIS_TRANSPORT_STRUCT, ndisOidContent))) {
DBGLOG(REQ, INFO, "exceeds length limit\n");
return -EINVAL;
}
}
if (prWlanReqEntry->eOidMethod == ENUM_OID_GLUE_ONLY) {
/* GLUE sw info only */
status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
prNdisReq->ndisOidContent,
prNdisReq->inNdisOidlength, &u4BufLen);
} else if (prWlanReqEntry->eOidMethod ==
ENUM_OID_GLUE_EXTENSION) {
/* multiple sw operations */
status = prWlanReqEntry->pfOidQueryHandler(prGlueInfo,
prNdisReq->ndisOidContent,
prNdisReq->inNdisOidlength, &u4BufLen);
} else if (prWlanReqEntry->eOidMethod ==
ENUM_OID_DRIVER_CORE) {
/* driver core */
status = kalIoctl(prGlueInfo,
(PFN_OID_HANDLER_FUNC)prWlanReqEntry->pfOidQueryHandler,
prNdisReq->ndisOidContent, prNdisReq->inNdisOidlength,
TRUE, TRUE, TRUE, &u4BufLen);
} else {
DBGLOG(REQ, INFO,
"priv_set_ndis(): unsupported OID method:0x%x\n",
prWlanReqEntry->eOidMethod);
return -EOPNOTSUPP;
}
*pu4OutputLen = u4BufLen;
switch (status) {
case WLAN_STATUS_SUCCESS:
break;
case WLAN_STATUS_INVALID_LENGTH:
/* WARNLOG(
* ("Set %s: Invalid length (current=%ld, needed=%ld)\n",
* prWlanReqEntry->pucOidName,
* prNdisReq->inNdisOidlength,
* u4BufLen));
*/
break;
}
if (status != WLAN_STATUS_SUCCESS)
return -EOPNOTSUPP;
return 0;
} /* priv_get_ndis */
#if CFG_SUPPORT_QA_TOOL
/*----------------------------------------------------------------------------*/
/*!
* \brief The routine handles ATE set operation.
*
* \param[in] pDev Net device requested.
* \param[in] prIwReqInfo Pointer to iwreq structure.
* \param[in] prIwReqData The ioctl data structure, use the field of
* sub-command.
* \param[in] pcExtra The buffer with input value
*
* \retval 0 On success.
* \retval -EOPNOTSUPP If cmd is not supported.
* \retval -EFAULT If copy from user space buffer fail.
*
*/
/*----------------------------------------------------------------------------*/
int
priv_ate_set(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData,
IN char *pcExtra)
{
int32_t i4Status;
/* uint8_t *InBuf;
* uint8_t *addr_str, *value_str;
* uint32_t InBufLen;
*/
uint32_t u4SubCmd;
/* u_int8_t isWrite = 0;
* uint32_t u4BufLen = 0;
* struct NDIS_TRANSPORT_STRUCT *prNdisReq;
* uint32_t pu4IntBuf[2];
*/
uint32_t u4CopySize = sizeof(aucOidBuf);
/* sanity check */
ASSERT(prNetDev);
ASSERT(prIwReqInfo);
ASSERT(prIwReqData);
ASSERT(pcExtra);
if (GLUE_CHK_PR3(prNetDev, prIwReqData, pcExtra) == FALSE)
return -EINVAL;
u4SubCmd = (uint32_t) prIwReqData->data.flags;
DBGLOG(REQ, INFO, "MT6632: %s, u4SubCmd=%d\n", __func__,
u4SubCmd);
switch (u4SubCmd) {
case PRIV_QACMD_SET:
u4CopySize = (prIwReqData->data.length < u4CopySize)
? prIwReqData->data.length : (u4CopySize - 1);
if (copy_from_user(&aucOidBuf[0], prIwReqData->data.pointer,
u4CopySize))
return -EFAULT;
aucOidBuf[u4CopySize] = '\0';
DBGLOG(REQ, INFO,
"PRIV_QACMD_SET: priv_set_string=(%s)(%u,%d)\n",
aucOidBuf, u4CopySize,
(int32_t)prIwReqData->data.length);
i4Status = AteCmdSetHandle(prNetDev, &aucOidBuf[0],
u4CopySize);
break;
default:
return -EOPNOTSUPP;
}
return 0;
}
#endif
/*----------------------------------------------------------------------------*/
/*!
* \brief This routine is called to search desired OID.
*
* \param rOid[in] Desired NDIS_OID
* \param ppWlanReqEntry[out] Found registered OID entry
*
* \retval TRUE: Matched OID is found
* \retval FALSE: No matched OID is found
*/
/*----------------------------------------------------------------------------*/
static u_int8_t reqSearchSupportedOidEntry(IN uint32_t rOid,
OUT struct WLAN_REQ_ENTRY **ppWlanReqEntry)
{
int32_t i, j, k;
i = 0;
j = NUM_SUPPORTED_OIDS - 1;
while (i <= j) {
k = (i + j) / 2;
if (rOid == arWlanOidReqTable[k].rOid) {
*ppWlanReqEntry = &arWlanOidReqTable[k];
return TRUE;
} else if (rOid < arWlanOidReqTable[k].rOid) {
j = k - 1;
} else {
i = k + 1;
}
}
return FALSE;
} /* reqSearchSupportedOidEntry */
/*----------------------------------------------------------------------------*/
/*!
* \brief Private ioctl driver handler.
*
* \param[in] pDev Net device requested.
* \param[out] pIwReq Pointer to iwreq structure.
* \param[in] cmd Private sub-command.
*
* \retval 0 For success.
* \retval -EFAULT If copy from user space buffer fail.
* \retval -EOPNOTSUPP Parameter "cmd" not recognized.
*
*/
/*----------------------------------------------------------------------------*/
int
priv_set_driver(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, IN OUT char *pcExtra)
{
uint32_t u4SubCmd = 0;
uint16_t u2Cmd = 0;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
ASSERT(prNetDev);
ASSERT(prIwReqData);
if (!prNetDev || !prIwReqData) {
DBGLOG(REQ, INFO,
"priv_set_driver(): invalid param(0x%p, 0x%p)\n",
prNetDev, prIwReqData);
return -EINVAL;
}
u2Cmd = prIwReqInfo->cmd;
DBGLOG(REQ, INFO, "prIwReqInfo->cmd %u\n", u2Cmd);
u4SubCmd = (uint32_t) prIwReqData->data.flags;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
if (!prGlueInfo) {
DBGLOG(REQ, INFO,
"priv_set_driver(): invalid prGlueInfo(0x%p, 0x%p)\n",
prNetDev,
*((struct GLUE_INFO **) netdev_priv(prNetDev)));
return -EINVAL;
}
/* trick,hack in ./net/wireless/wext-priv.c ioctl_private_iw_point */
/* because the cmd number is odd (get), the input string will not be
* copy_to_user
*/
DBGLOG(REQ, INFO, "prIwReqData->data.length %u\n",
prIwReqData->data.length);
/* Use GET type becauase large data by iwpriv. */
ASSERT(IW_IS_GET(u2Cmd));
if (prIwReqData->data.length != 0) {
#if KERNEL_VERSION(5, 0, 0) <= LINUX_VERSION_CODE
if (!access_ok(prIwReqData->data.pointer,
prIwReqData->data.length)) {
#else
if (!access_ok(VERIFY_READ, prIwReqData->data.pointer,
prIwReqData->data.length)) {
#endif
DBGLOG(REQ, INFO,
"%s access_ok Read fail written = %d\n",
__func__, i4BytesWritten);
return -EFAULT;
}
if (prIwReqData->data.length >= IW_PRIV_BUF_SIZE)
return -EFAULT;
if (copy_from_user(pcExtra, prIwReqData->data.pointer,
prIwReqData->data.length)) {
DBGLOG(REQ, INFO,
"%s copy_form_user fail written = %d\n",
__func__, prIwReqData->data.length);
return -EFAULT;
}
/* prIwReqData->data.length include the terminate '\0' */
pcExtra[prIwReqData->data.length - 1] = 0;
}
if (pcExtra) {
DBGLOG(REQ, INFO, "pcExtra %s\n", pcExtra);
/* Please check max length in rIwPrivTable */
DBGLOG(REQ, INFO, "%s prIwReqData->data.length = %d\n",
__func__, prIwReqData->data.length);
i4BytesWritten = priv_driver_cmds(prNetDev, pcExtra,
2000 /*prIwReqData->data.length */);
DBGLOG(REQ, INFO, "%s i4BytesWritten = %d\n", __func__,
i4BytesWritten);
}
DBGLOG(REQ, INFO, "pcExtra done\n");
if (i4BytesWritten > 0) {
if (i4BytesWritten > IW_PRIV_BUF_SIZE)
i4BytesWritten = IW_PRIV_BUF_SIZE;
prIwReqData->data.length =
i4BytesWritten; /* the iwpriv will use the length */
} else if (i4BytesWritten == 0) {
prIwReqData->data.length = i4BytesWritten;
}
#if 0
/* trick,hack in ./net/wireless/wext-priv.c ioctl_private_iw_point */
/* because the cmd number is even (set), the return string will not be
* copy_to_user
*/
ASSERT(IW_IS_SET(u2Cmd));
if (!access_ok(VERIFY_WRITE, prIwReqData->data.pointer,
i4BytesWritten)) {
DBGLOG(REQ, INFO, "%s access_ok Write fail written = %d\n",
__func__, i4BytesWritten);
return -EFAULT;
}
if (copy_to_user(prIwReqData->data.pointer, pcExtra,
i4BytesWritten)) {
DBGLOG(REQ, INFO, "%s copy_to_user fail written = %d\n",
__func__, i4BytesWritten);
return -EFAULT;
}
DBGLOG(RSN, INFO, "%s copy_to_user written = %d\n",
__func__, i4BytesWritten);
#endif
return 0;
} /* priv_set_driver */
#if 0
/*----------------------------------------------------------------------------*/
/*!
* \brief This routine is called to query the radio configuration used in IBSS
* mode and RF test mode.
*
* \param[in] prGlueInfo Pointer to the GLUE_INFO_T structure.
* \param[out] pvQueryBuffer Pointer to the buffer that holds the result of
* the query.
* \param[in] u4QueryBufferLen The length of the query buffer.
* \param[out] pu4QueryInfoLen If the call is successful, returns the number
* of bytes written into the query buffer. If the
* call failed due to invalid length of the query
* buffer, returns the amount of storage needed.
*
* \retval WLAN_STATUS_SUCCESS
* \retval WLAN_STATUS_INVALID_LENGTH
*/
/*----------------------------------------------------------------------------*/
static uint32_t
reqExtQueryConfiguration(IN struct GLUE_INFO *prGlueInfo,
OUT void *pvQueryBuffer, IN uint32_t u4QueryBufferLen,
OUT uint32_t *pu4QueryInfoLen)
{
struct PARAM_802_11_CONFIG *prQueryConfig =
(struct PARAM_802_11_CONFIG *) pvQueryBuffer;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4QueryInfoLen = 0;
DEBUGFUNC("wlanoidQueryConfiguration");
ASSERT(prGlueInfo);
ASSERT(pu4QueryInfoLen);
*pu4QueryInfoLen = sizeof(struct PARAM_802_11_CONFIG);
if (u4QueryBufferLen < sizeof(struct PARAM_802_11_CONFIG))
return WLAN_STATUS_INVALID_LENGTH;
ASSERT(pvQueryBuffer);
kalMemZero(prQueryConfig,
sizeof(struct PARAM_802_11_CONFIG));
/* Update the current radio configuration. */
prQueryConfig->u4Length = sizeof(struct PARAM_802_11_CONFIG);
#if defined(_HIF_SDIO)
rStatus = sdio_io_ctrl(prGlueInfo,
wlanoidSetBeaconInterval,
&prQueryConfig->u4BeaconPeriod, sizeof(uint32_t),
TRUE, TRUE, &u4QueryInfoLen);
#else
rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
wlanoidQueryBeaconInterval,
&prQueryConfig->u4BeaconPeriod,
sizeof(uint32_t), &u4QueryInfoLen);
#endif
if (rStatus != WLAN_STATUS_SUCCESS)
return rStatus;
#if defined(_HIF_SDIO)
rStatus = sdio_io_ctrl(prGlueInfo,
wlanoidQueryAtimWindow,
&prQueryConfig->u4ATIMWindow, sizeof(uint32_t),
TRUE, TRUE, &u4QueryInfoLen);
#else
rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
wlanoidQueryAtimWindow,
&prQueryConfig->u4ATIMWindow,
sizeof(uint32_t),
&u4QueryInfoLen);
#endif
if (rStatus != WLAN_STATUS_SUCCESS)
return rStatus;
#if defined(_HIF_SDIO)
rStatus = sdio_io_ctrl(prGlueInfo,
wlanoidQueryFrequency,
&prQueryConfig->u4DSConfig, sizeof(uint32_t),
TRUE, TRUE, &u4QueryInfoLen);
#else
rStatus = wlanQueryInformation(prGlueInfo->prAdapter,
wlanoidQueryFrequency,
&prQueryConfig->u4DSConfig,
sizeof(uint32_t),
&u4QueryInfoLen);
#endif
if (rStatus != WLAN_STATUS_SUCCESS)
return rStatus;
prQueryConfig->rFHConfig.u4Length = sizeof(
struct PARAM_802_11_CONFIG_FH);
return rStatus;
} /* end of reqExtQueryConfiguration() */
/*----------------------------------------------------------------------------*/
/*!
* \brief This routine is called to set the radio configuration used in IBSS
* mode.
*
* \param[in] prGlueInfo Pointer to the GLUE_INFO_T structure.
* \param[in] pvSetBuffer A pointer to the buffer that holds the data to be
* set.
* \param[in] u4SetBufferLen The length of the set buffer.
* \param[out] pu4SetInfoLen If the call is successful, returns the number of
* bytes read from the set buffer. If the call failed
* due to invalid length of the set buffer, returns
* the amount of storage needed.
*
* \retval WLAN_STATUS_SUCCESS
* \retval WLAN_STATUS_INVALID_LENGTH
* \retval WLAN_STATUS_NOT_ACCEPTED
*/
/*----------------------------------------------------------------------------*/
static uint32_t
reqExtSetConfiguration(IN struct GLUE_INFO *prGlueInfo,
IN void *pvSetBuffer, IN uint32_t u4SetBufferLen,
OUT uint32_t *pu4SetInfoLen)
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
struct PARAM_802_11_CONFIG *prNewConfig =
(struct PARAM_802_11_CONFIG *) pvSetBuffer;
uint32_t u4SetInfoLen = 0;
DEBUGFUNC("wlanoidSetConfiguration");
ASSERT(prGlueInfo);
ASSERT(pu4SetInfoLen);
*pu4SetInfoLen = sizeof(struct PARAM_802_11_CONFIG);
if (u4SetBufferLen < *pu4SetInfoLen)
return WLAN_STATUS_INVALID_LENGTH;
/* OID_802_11_CONFIGURATION. If associated, NOT_ACCEPTED shall be
* returned.
*/
if (prGlueInfo->eParamMediaStateIndicated ==
PARAM_MEDIA_STATE_CONNECTED)
return WLAN_STATUS_NOT_ACCEPTED;
ASSERT(pvSetBuffer);
#if defined(_HIF_SDIO)
rStatus = sdio_io_ctrl(prGlueInfo,
wlanoidSetBeaconInterval,
&prNewConfig->u4BeaconPeriod, sizeof(uint32_t),
FALSE, TRUE, &u4SetInfoLen);
#else
rStatus = wlanSetInformation(prGlueInfo->prAdapter,
wlanoidSetBeaconInterval,
&prNewConfig->u4BeaconPeriod,
sizeof(uint32_t),
&u4SetInfoLen);
#endif
if (rStatus != WLAN_STATUS_SUCCESS)
return rStatus;
#if defined(_HIF_SDIO)
rStatus = sdio_io_ctrl(prGlueInfo,
wlanoidSetAtimWindow,
&prNewConfig->u4ATIMWindow, sizeof(uint32_t),
FALSE, TRUE, &u4SetInfoLen);
#else
rStatus = wlanSetInformation(prGlueInfo->prAdapter,
wlanoidSetAtimWindow,
&prNewConfig->u4ATIMWindow,
sizeof(uint32_t), &u4SetInfoLen);
#endif
if (rStatus != WLAN_STATUS_SUCCESS)
return rStatus;
#if defined(_HIF_SDIO)
rStatus = sdio_io_ctrl(prGlueInfo, wlanoidSetFrequency,
&prNewConfig->u4DSConfig, sizeof(uint32_t),
FALSE, TRUE, &u4SetInfoLen);
#else
rStatus = wlanSetInformation(prGlueInfo->prAdapter, wlanoidSetFrequency,
&prNewConfig->u4DSConfig,
sizeof(uint32_t), &u4SetInfoLen);
#endif
if (rStatus != WLAN_STATUS_SUCCESS)
return rStatus;
return rStatus;
} /* end of reqExtSetConfiguration() */
#endif
/*----------------------------------------------------------------------------*/
/*!
* \brief This routine is called to set beacon detection function enable/disable
* state.
* This is mainly designed for usage under BT inquiry state
* (disable function).
*
* \param[in] pvAdapter Pointer to the Adapter structure
* \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
* \param[in] u4SetBufferLen The length of the set buffer
* \param[out] pu4SetInfoLen If the call is successful, returns the number of
* bytes read from the set buffer. If the call failed due to invalid length of
* the set buffer, returns the amount of storage needed.
*
* \retval WLAN_STATUS_SUCCESS
* \retval WLAN_STATUS_INVALID_DATA If new setting value is wrong.
* \retval WLAN_STATUS_INVALID_LENGTH
*
*/
/*----------------------------------------------------------------------------*/
static uint32_t
reqExtSetAcpiDevicePowerState(IN struct GLUE_INFO
*prGlueInfo,
IN void *pvSetBuffer, IN uint32_t u4SetBufferLen,
OUT uint32_t *pu4SetInfoLen)
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
ASSERT(prGlueInfo);
ASSERT(pvSetBuffer);
ASSERT(pu4SetInfoLen);
/* WIFI is enabled, when ACPI is
* D0 (ParamDeviceStateD0 = 1). And vice versa
*/
/* rStatus = wlanSetInformation(prGlueInfo->prAdapter, */
/* wlanoidSetAcpiDevicePowerState, */
/* pvSetBuffer, */
/* u4SetBufferLen, */
/* pu4SetInfoLen); */
return rStatus;
}
#define CMD_START "START"
#define CMD_STOP "STOP"
#define CMD_SCAN_ACTIVE "SCAN-ACTIVE"
#define CMD_SCAN_PASSIVE "SCAN-PASSIVE"
#define CMD_RSSI "RSSI"
#define CMD_LINKSPEED "LINKSPEED"
#define CMD_RXFILTER_START "RXFILTER-START"
#define CMD_RXFILTER_STOP "RXFILTER-STOP"
#define CMD_RXFILTER_ADD "RXFILTER-ADD"
#define CMD_RXFILTER_REMOVE "RXFILTER-REMOVE"
#define CMD_BTCOEXSCAN_START "BTCOEXSCAN-START"
#define CMD_BTCOEXSCAN_STOP "BTCOEXSCAN-STOP"
#define CMD_BTCOEXMODE "BTCOEXMODE"
#define CMD_SETSUSPENDOPT "SETSUSPENDOPT"
#define CMD_SETSUSPENDMODE "SETSUSPENDMODE"
#define CMD_P2P_DEV_ADDR "P2P_DEV_ADDR"
#define CMD_SETFWPATH "SETFWPATH"
#define CMD_SETBAND "SETBAND"
#define CMD_GETBAND "GETBAND"
#define CMD_AP_START "AP_START"
#if CFG_SUPPORT_QA_TOOL
#define CMD_GET_RX_STATISTICS "GET_RX_STATISTICS"
#endif
#define CMD_GET_STAT "GET_STAT"
#define CMD_GET_BSS_STATISTICS "GET_BSS_STATISTICS"
#define CMD_GET_STA_STATISTICS "GET_STA_STATISTICS"
#define CMD_GET_WTBL_INFO "GET_WTBL"
#define CMD_GET_MIB_INFO "GET_MIB"
#define CMD_GET_STA_INFO "GET_STA"
#define CMD_SET_FW_LOG "SET_FWLOG"
#define CMD_GET_QUE_INFO "GET_QUE"
#define CMD_GET_MEM_INFO "GET_MEM"
#define CMD_GET_HIF_INFO "GET_HIF"
#define CMD_GET_TP_INFO "GET_TP"
#define CMD_GET_STA_KEEP_CNT "KEEPCOUNTER"
#define CMD_STAT_RESET_CNT "RESETCOUNTER"
#define CMD_STAT_NOISE_SEL "NOISESELECT"
#define CMD_STAT_GROUP_SEL "GROUP"
#define CMD_SET_TXPOWER "SET_TXPOWER"
#define CMD_COUNTRY "COUNTRY"
#define CMD_CSA "CSA"
#define CMD_GET_COUNTRY "GET_COUNTRY"
#define CMD_GET_CHANNELS "GET_CHANNELS"
#define CMD_GET_AP_CHANNELS "GET_AP_CHANNELS"
#define CMD_P2P_SET_NOA "P2P_SET_NOA"
#define CMD_P2P_GET_NOA "P2P_GET_NOA"
#define CMD_P2P_SET_PS "P2P_SET_PS"
#define CMD_SET_AP_WPS_P2P_IE "SET_AP_WPS_P2P_IE"
#define CMD_SETROAMMODE "SETROAMMODE"
#define CMD_MIRACAST "MIRACAST"
#ifdef CFG_SUPPORT_ADJUST_MCC_STAY_TIME
#define CMD_MCCTIME "MCCTIME"
#endif
#if (CFG_SUPPORT_DFS_MASTER == 1)
#define CMD_SHOW_DFS_STATE "SHOW_DFS_STATE"
#define CMD_SHOW_DFS_RADAR_PARAM "SHOW_DFS_RADAR_PARAM"
#define CMD_SHOW_DFS_HELP "SHOW_DFS_HELP"
#define CMD_SHOW_DFS_CAC_TIME "SHOW_DFS_CAC_TIME"
#endif
#define CMD_PNOSSIDCLR_SET "PNOSSIDCLR"
#define CMD_PNOSETUP_SET "PNOSETUP "
#define CMD_PNOENABLE_SET "PNOFORCE"
#define CMD_PNODEBUG_SET "PNODEBUG"
#define CMD_WLS_BATCHING "WLS_BATCHING"
#define CMD_OKC_SET_PMK "SET_PMK"
#define CMD_OKC_ENABLE "OKC_ENABLE"
#define CMD_SETMONITOR "MONITOR"
#define CMD_SETBUFMODE "BUFFER_MODE"
#if CFG_AUTO_CHANNEL_SEL_SUPPORT
#define CMD_GET_CH_RANK_LIST "GET_CH_RANK_LIST"
#define CMD_GET_CH_DIRTINESS "GET_CH_DIRTINESS"
#endif
#if CFG_SUPPORT_ANT_DIV
#define CMD_SET_ANT_DIV "ANT_DIV_SET"
#define CMD_GET_ANT_DIV "ANT_DIV_GET"
#define CMD_DETC_ANT_DIV "ANT_DIV_DETC"
#define CMD_SWH_ANT_DIV "ANT_DIV_SWH"
#define CMD_SET_ANT_DIV_ARG_NUM 2
#define CMD_GET_ANT_DIV_ARG_NUM 1
#define CMD_DETC_ANT_DIV_ARG_NUM 1
#define CMD_SWH_ANT_DIV_ARG_NUM 1
#endif
#if CFG_CHIP_RESET_HANG
#define CMD_SET_RST_HANG "RST_HANG_SET"
#define CMD_SET_RST_HANG_ARG_NUM 2
#endif
#define CMD_EFUSE "EFUSE"
#define CMD_CCCR "CCCR"
/* miracast related definition */
#define MIRACAST_MODE_OFF 0
#define MIRACAST_MODE_SOURCE 1
#define MIRACAST_MODE_SINK 2
#ifndef MIRACAST_AMPDU_SIZE
#define MIRACAST_AMPDU_SIZE 8
#endif
#ifndef MIRACAST_MCHAN_ALGO
#define MIRACAST_MCHAN_ALGO 1
#endif
#ifndef MIRACAST_MCHAN_BW
#define MIRACAST_MCHAN_BW 25
#endif
#define CMD_BAND_AUTO 0
#define CMD_BAND_5G 1
#define CMD_BAND_2G 2
#define CMD_BAND_ALL 3
/* Mediatek private command */
#define CMD_GET_DONGLE_TYPE "GET_DONGLE_TYPE"
#define CMD_SET_MCR "SET_MCR"
#define CMD_GET_MCR "GET_MCR"
#define CMD_SET_DRV_MCR "SET_DRV_MCR"
#define CMD_GET_DRV_MCR "GET_DRV_MCR"
#define CMD_SET_SW_CTRL "SET_SW_CTRL"
#define CMD_GET_SW_CTRL "GET_SW_CTRL"
#define CMD_SET_CFG "SET_CFG"
#define CMD_GET_CFG "GET_CFG"
#define CMD_SET_CHIP "SET_CHIP"
#define CMD_GET_CHIP "GET_CHIP"
#define CMD_SET_DBG_LEVEL "SET_DBG_LEVEL"
#define CMD_GET_DBG_LEVEL "GET_DBG_LEVEL"
#define CMD_ADD_TS "addts"
#define CMD_DEL_TS "delts"
#define CMD_DUMP_TS "dumpts"
#define CMD_RM_IT "RM-IT"
#define CMD_DUMP_UAPSD "dumpuapsd"
#define CMD_FW_EVENT "FW-EVENT "
#ifdef CFG_ALPS_ANDROID_AOSP_PRIV_CMD
#define PRIV_CMD_SIZE 512
#else
#define PRIV_CMD_SIZE 2000
#endif
#define CMD_SET_FIXED_RATE "FixedRate"
#define CMD_GET_VERSION "VER"
#define CMD_SET_TEST_MODE "SET_TEST_MODE"
#define CMD_SET_TEST_CMD "SET_TEST_CMD"
#define CMD_GET_TEST_RESULT "GET_TEST_RESULT"
#define CMD_GET_STA_STAT "STAT"
#define CMD_GET_STA_STAT2 "STAT2"
#define CMD_GET_STA_RX_STAT "RX_STAT"
#define CMD_SET_ACL_POLICY "SET_ACL_POLICY"
#define CMD_ADD_ACL_ENTRY "ADD_ACL_ENTRY"
#define CMD_DEL_ACL_ENTRY "DEL_ACL_ENTRY"
#define CMD_SHOW_ACL_ENTRY "SHOW_ACL_ENTRY"
#define CMD_CLEAR_ACL_ENTRY "CLEAR_ACL_ENTRY"
#define CMD_SET_RA_DBG "RADEBUG"
#define CMD_SET_FIXED_FALLBACK "FIXEDRATEFALLBACK"
#define CMD_GET_STA_IDX "GET_STA_IDX"
#define CMD_GET_TX_POWER_INFO "TxPowerInfo"
#define CMD_GET_IPI "GET_IPI"
#if CFG_SUPPORT_ADJUST_MCC_MODE_SET
#define CMD_SET_MCC_MODE "SET_MCHAN_SCHED_MODE"
#endif
#if CFG_WOW_SUPPORT
#define CMD_WOW_START "WOW_START"
#define CMD_SET_WOW_ENABLE "SET_WOW_ENABLE"
#define CMD_SET_WOW_PAR "SET_WOW_PAR"
#define CMD_SET_WOW_UDP "SET_WOW_UDP"
#define CMD_SET_WOW_TCP "SET_WOW_TCP"
#define CMD_GET_WOW_PORT "GET_WOW_PORT"
#define CMD_GET_WOW_REASON "GET_WOW_REASON"
#define CMD_SET_SUSP_CMD "sET_SUSP_CMD"
#if CFG_SUPPORT_MDNS_OFFLOAD
#define CMD_SHOW_MDNS_RECORD "SHOW_MDNS_RECORD"
#define CMD_ENABLE_MDNS "ENABLE_MDNS_OFFLOAD"
#define CMD_DISABLE_MDNS "DISABLE_MDNS_OFFLOAD"
#define CMD_MDNS_SET_WAKE_FLAG "MDNS_SET_WAKE_FLAG"
#if TEST_CODE_FOR_MDNS
/* test code for mdns offload */
#define CMD_SEND_MDNS_RECORD "SEND_MDNS_RECORD"
#define CMD_ADD_MDNS_RECORD "ADD_MDNS_RECORD"
#define TEST_ADD_MDNS_RECORD "TEST_ADD_MDNS_RECORD"
#endif
#endif
#endif
#if CFG_SUPPORT_CSI
#define CMD_SET_CSI "SET_CSI"
#endif
#define CMD_SET_ADV_PWS "SET_ADV_PWS"
#define CMD_SET_MDTIM "SET_MDTIM"
#define CMD_GET_DSLP_CNT "GET_DSLEEP_CNT"
#define CMD_ENFORCE_POWER_MODE "ENFORCE_POWER_MODE"
#define CMD_GET_POWER_MODE "GET_POWER_MODE"
#define CMD_SET_DBDC "SET_DBDC"
#if CFG_SUPPORT_CAL_RESULT_BACKUP_TO_HOST
#define CMD_SET_CALBACKUP_TEST_DRV_FW "SET_CALBACKUP_TEST_DRV_FW"
#endif
#define CMD_GET_CNM "GET_CNM"
#if IS_ENABLED(CFG_CCN7_SAP_EASYMESH)
#define CMD_WHITELIST_STA "White_sta"
#define CMD_BLACKLIST_STA "Black_sta"
#define CMD_BSS_STATUS_REPORT "BssStatus"
#define CMD_BSS_REPORT_INFO "BssReportInfo"
#define CMD_STA_REPORT_INFO "StaReportInfo"
#define CMD_STA_MEASUREMENT_ENABLE "mnt_en"
#define CMD_STA_MEASUREMENT_INFO "mnt_info"
#endif /* CFG_CCN7_SAP_EASYMESH */
#define CMD_SET_SW_AMSDU_NUM "SET_SW_AMSDU_NUM"
#define CMD_SET_SW_AMSDU_SIZE "SET_SW_AMSDU_SIZE"
#define CMD_SET_DRV_SER "SET_DRV_SER"
/* Debug for consys */
#define CMD_DBG_SHOW_TR_INFO "show-tr"
#define CMD_DBG_SHOW_PLE_INFO "show-ple"
#define CMD_DBG_SHOW_PSE_INFO "show-pse"
#define CMD_DBG_SHOW_CSR_INFO "show-csr"
#define CMD_DBG_SHOW_DMASCH_INFO "show-dmasch"
#if CFG_SUPPORT_EASY_DEBUG
#define CMD_FW_PARAM "set_fw_param"
#endif /* CFG_SUPPORT_EASY_DEBUG */
#if CFG_SUPPORT_802_11K
#define CMD_NEIGHBOR_REQ "neighbor-request"
#endif
#if CFG_SUPPORT_802_11V_BSS_TRANSITION_MGT
#define CMD_BTM_QUERY "bss-transition-query"
#endif
#define CMD_GET_BSS_TABLE "BSSTABLE_RSSI"
#if CFG_SUPPORT_GET_MCS_INFO
#define CMD_GET_MCS_INFO "GET_MCS_INFO"
#endif
#ifdef CFG_SUPPORT_TIME_MEASURE
#define CMD_START_FTM "START_FTM"
#define CMD_GET_TMR_DISTANCE "GET_TMR_DISTANCE"
#define CMD_GET_TMR_AUDIOSYNC "GET_TMR_AUDIOSYNC"
#define CMD_START_FTM_NON_BLOCK "START_FTM_NON_BLOCK"
#define CMD_ENABLE_TMR "ENABLE_TMR"
#endif
#if CFG_SUPPORT_SCHED_SCAN
#define INFINITE_PNO_INTERVAL 99
#define CMD_SET_PNO_INTERVAL "SET_PNO_INTERVAL"
#define CMD_GET_PNO_INTERVAL "GET_PNO_INTERVAL"
#define CMD_SET_DWELL_TIME "SET_DWELL_TIME"
#define CMD_GET_DWELL_TIME "GET_DWELL_TIME"
#define CMD_SET_PNO_PASSIVE_DWELL "SET_PNO_PASSIVE_DWELL"
#define CMD_GET_PNO_PASSIVE_DWELL "GET_PNO_PASSIVE_DWELL"
#define CMD_SET_PNO_WAKE_RSSI "SET_PNO_WAKE_RSSI"
#define CMD_GET_PNO_WAKE_RSSI "GET_PNO_WAKE_RSSI"
#endif
#if CFG_SUPPORT_WAC
#define CMD_SET_WAC_IE_ENABLE "SET_WAC_IE_ENABLE"
#endif
#if CFG_SUPPORT_ADVANCE_CONTROL
#define CMD_GET_SNR "GET_SNR"
#endif
#if IS_ENABLED(CFG_AP_80211K_SUPPORT)
#define CMD_STA_BEACON_REQUEST "BeaconRequest"
#endif /* CFG_AP_80211K_SUPPORT */
#if IS_ENABLED(CFG_AP_80211V_SUPPORT)
#define CMD_STA_BTM_REQUEST "BTMRequest"
#endif /* CFG_AP_80211V_SUPPORT */
#if (CFG_SUPPORT_TSF_SYNC == 1)
#define CMD_GET_TSF_VALUE "GET_TSF"
#endif
static uint8_t g_ucMiracastMode = MIRACAST_MODE_OFF;
struct cmd_tlv {
char prefix;
char version;
char subver;
char reserved;
};
struct priv_driver_cmd_s {
char buf[PRIV_CMD_SIZE];
int used_len;
int total_len;
};
#ifdef CFG_ANDROID_AOSP_PRIV_CMD
struct android_wifi_priv_cmd {
char *buf;
int used_len;
int total_len;
};
#endif /* CFG_ANDROID_AOSP_PRIV_CMD */
void CoexGetArbMode(char *pcCommand,
uint32_t *pu4Offset,
uint8_t **ppucData)
{
uint8_t *pucRegValue = *ppucData;
uint32_t u4RegValue = *pucRegValue |
*(pucRegValue+1) << 8 |
*(pucRegValue+2) << 16 |
*(pucRegValue+3) << 24;
pucRegValue += 4;
*ppucData = pucRegValue;
/* In-Band ARB Mode */
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "%-20s : ",
"InBand ARB mode");
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"WF Rx BT Tx %s common action\n",
((u4RegValue & BIT(12))) ? "all" : "no");
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"%-20s : WF Wx BT Rx %s common action\n",
" ",
((u4RegValue & BIT(13))) ? "all" : "no");
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"%-20s : WF Rx BT Rx %s common action\n",
" ",
((u4RegValue & BIT(14))) ? "all" : "no");
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"%-20s : WF Tx BT Tx %s common action\n",
" ",
((u4RegValue & BIT(15))) ? "all" : "no");
/* Out-Band ARB Mode */
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "%-20s : ",
"OutBand ARB mode");
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"WF Rx BT Tx %s common action\n",
((u4RegValue & BIT(28))) ? "all" : "no");
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"%-20s : WF Tx BT Rx %s common action\n",
" ",
((u4RegValue & BIT(29))) ? "all" : "no");
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"%-20s : WF Rx BT Rx %s common action\n",
" ",
((u4RegValue & BIT(30))) ? "all" : "no");
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"%-20s : WF Tx BT Tx %s common action\n",
" ",
((u4RegValue & BIT(31))) ? "all" : "no");
}
void CoexGetBtProfile(char *pcCommand,
uint32_t *pu4Offset,
uint8_t **ppucData)
{
uint8_t *pucRegValue = *ppucData;
uint32_t u4RegValue = *pucRegValue |
*(pucRegValue+1) << 8 |
*(pucRegValue+2) << 16 |
*(pucRegValue+3) << 24;
pucRegValue += 4;
*ppucData = pucRegValue;
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "%-20s : ",
"BT Profile");
if (COEX_BCM_IS_BT_NONE(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"none\n");
return;
}
if (COEX_BCM_IS_BT_SCO(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"SCO\n");
}
if (COEX_BCM_IS_BT_A2DP(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"A2DP\n");
}
if (COEX_BCM_IS_BT_LINK_CONNECTED(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"LINK_CONNECTED\n");
}
if (COEX_BCM_IS_BT_HID(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"HID\n");
}
if (COEX_BCM_IS_BT_PAGE(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"PAGE\n");
}
if (COEX_BCM_IS_BT_INQUIRY(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"INQUIRY\n");
}
if (COEX_BCM_IS_BT_ESCO(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"ESCO\n");
}
if (COEX_BCM_IS_BT_MULTI_HID(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"MULTI_HID\n");
}
if (COEX_BCM_IS_BT_BLE_SCAN(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"BLE_SCAN\n");
}
if (COEX_BCM_IS_BT_ADV(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"ADV\n");
}
if (COEX_BCM_IS_BT_ADV_DIRECT(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"ADV_DIRECT\n");
}
if (COEX_BCM_IS_BT_A2DP_SINK(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"A2DP_SINK\n");
}
if (COEX_BCM_IS_BT_PAN(u4RegValue)) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset,
"PAN\n");
}
}
void CoexGetProtFrmType(char *pcCommand,
uint32_t *pu4Offset,
uint8_t **ppucData)
{
uint8_t *pucRegValue = *ppucData;
uint32_t u4RegValue = *pucRegValue |
*(pucRegValue+1) << 8 |
*(pucRegValue+2) << 16 |
*(pucRegValue+3) << 24;
pucRegValue += 4;
*ppucData = pucRegValue;
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "%-20s : %s\n",
"Protection Type",
u4RegValue ? "PS-NULL" : "CTS");
}
void CoexGetRxBaSize(char *pcCommand,
uint32_t *pu4Offset,
uint8_t **ppucData)
{
uint8_t *pucRegValue = *ppucData;
/* BA Size */
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "%-20s : %d\n",
"Rx BA Size",
*pucRegValue);
*ppucData = ++pucRegValue;
}
void CoexGetCfgCoexIsoCtrl(char *pcCommand,
uint32_t *pu4Offset,
uint8_t **ppucData)
{
uint8_t *pucRegValue = *ppucData;
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "%-20s : %d\n",
"CFG CoexIsoCtrl",
*pucRegValue);
*ppucData = ++pucRegValue;
}
void CoexGetCfgCoexModeCtrl(char *pcCommand,
uint32_t *pu4Offset,
uint8_t **ppucData)
{
uint8_t *pucRegValue = *ppucData;
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "%-20s : %d\n",
"CFG CoexModeCtrl",
*pucRegValue);
*ppucData = ++pucRegValue;
}
void CoexGetCfgFddPerPkt(char *pcCommand,
uint32_t *pu4Offset,
uint8_t **ppucData)
{
uint8_t *pucRegValue = *ppucData;
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "%-20s : %d\n",
"CFG FddPerPkt",
*pucRegValue);
*ppucData = ++pucRegValue;
}
/* Coex Ctrl Cmd - Coex Info Content */
struct COEX_REF_TABLE {
uint16_t ucCoexInfoId;
char *cContent;
void (*pCoexRefHandle)(char *pcCommand,
uint32_t *pu4Offset,
uint8_t **ppucData);
};
const struct COEX_REF_TABLE coex_ref_table[] = {
{COEX_REF_TABLE_ID_ISO_DETECTION_VALUE,
"Isolation Detection Value", NULL},
{COEX_REF_TABLE_ID_COEX_BT_PROFILE,
"Coex BT Profile", CoexGetBtProfile},
{COEX_REF_TABLE_ID_RX_BASIZE,
"Rx Ba Size", CoexGetRxBaSize},
{COEX_REF_TABLE_ID_ARB_MODE,
"ARB Mode", CoexGetArbMode},
{COEX_REF_TABLE_ID_PROT_FRM_TYPE,
"Prot Frame Type", CoexGetProtFrmType},
{COEX_REF_TABLE_ID_CFG_COEXISOCTRL,
"CFG CoexIsoCtrl", CoexGetCfgCoexIsoCtrl},
{COEX_REF_TABLE_ID_CFG_COEXMODECTRL,
"CFG CoexModeCtrl", CoexGetCfgCoexModeCtrl},
{COEX_REF_TABLE_ID_CFG_FDDPERPKT,
"CFG FddPerPkt", CoexGetCfgFddPerPkt},
{COEX_REF_TABLE_ID_CFG_BT_FIX_POWER,
"CFG BT FIX POWER", NULL},
{COEX_REF_TABLE_ID_CFG_BT_FDD_GAIN,
"CFG BT FDD GAIN", NULL},
{COEX_REF_TABLE_ID_CFG_BT_FDD_POWER,
"CFG BT FDD POWER", NULL},
{COEX_REF_TABLE_ID_CFG_WF_FDD_POWER,
"CFG WF FDD POWER", NULL}
};
int priv_driver_get_dbg_level(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4DbgIdx, u4DbgMask;
u_int8_t fgIsCmdAccept = FALSE;
int32_t u4Ret = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= 2) {
/* u4DbgIdx = kalStrtoul(apcArgv[1], NULL, 0); */
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4DbgIdx);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse apcArgv error u4Ret=%d\n",
u4Ret);
if (wlanGetDriverDbgLevel(u4DbgIdx, &u4DbgMask) ==
WLAN_STATUS_SUCCESS) {
fgIsCmdAccept = TRUE;
i4BytesWritten =
snprintf(pcCommand, i4TotalLen,
"Get DBG module[%u] log level => [0x%02x]!",
u4DbgIdx,
(uint8_t) u4DbgMask);
}
}
if (!fgIsCmdAccept)
i4BytesWritten = snprintf(pcCommand, i4TotalLen,
"Get DBG module log level failed!");
return i4BytesWritten;
} /* priv_driver_get_sw_ctrl */
static int priv_cmd_not_support(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
DBGLOG(REQ, WARN, "not support priv command: %s\n", pcCommand);
return -EOPNOTSUPP;
}
#if CFG_SUPPORT_QA_TOOL
#if CFG_SUPPORT_BUFFER_MODE
static int priv_driver_set_efuse_buffer_mode(
IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int32_t i4BytesWritten = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct PARAM_CUSTOM_EFUSE_BUFFER_MODE
*prSetEfuseBufModeInfo = NULL;
#if (CFG_EFUSE_BUFFER_MODE_DELAY_CAL == 0)
struct BIN_CONTENT *pBinContent;
int i = 0;
#endif
uint8_t *pucConfigBuf = NULL;
uint32_t u4ConfigReadLen;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
pucConfigBuf = (uint8_t *) kalMemAlloc(2048, VIR_MEM_TYPE);
if (!pucConfigBuf) {
DBGLOG(INIT, INFO, "allocate pucConfigBuf failed\n");
i4BytesWritten = -1;
goto out;
}
kalMemZero(pucConfigBuf, 2048);
u4ConfigReadLen = 0;
if (kalReadToFile("/MT6632_eFuse_usage_table.xlsm.bin",
pucConfigBuf, 2048, &u4ConfigReadLen) == 0) {
/* ToDo:: Nothing */
} else {
DBGLOG(INIT, INFO, "can't find file\n");
i4BytesWritten = -1;
goto out;
}
/* pucConfigBuf */
prSetEfuseBufModeInfo =
(struct PARAM_CUSTOM_EFUSE_BUFFER_MODE *) kalMemAlloc(
sizeof(struct PARAM_CUSTOM_EFUSE_BUFFER_MODE),
VIR_MEM_TYPE);
if (prSetEfuseBufModeInfo == NULL) {
DBGLOG(INIT, INFO,
"allocate prSetEfuseBufModeInfo failed\n");
i4BytesWritten = -1;
goto out;
}
kalMemZero(prSetEfuseBufModeInfo,
sizeof(struct PARAM_CUSTOM_EFUSE_BUFFER_MODE));
prSetEfuseBufModeInfo->ucSourceMode = 1;
prSetEfuseBufModeInfo->ucCount = (uint8_t)
EFUSE_CONTENT_SIZE;
#if (CFG_EFUSE_BUFFER_MODE_DELAY_CAL == 0)
pBinContent = (struct BIN_CONTENT *)
prSetEfuseBufModeInfo->aBinContent;
for (i = 0; i < EFUSE_CONTENT_SIZE; i++) {
pBinContent->u2Addr = i;
pBinContent->ucValue = *(pucConfigBuf + i);
pBinContent++;
}
for (i = 0; i < 20; i++)
DBGLOG(INIT, INFO, "%x\n",
prSetEfuseBufModeInfo->aBinContent[i].ucValue);
#endif
rStatus = kalIoctl(prGlueInfo, wlanoidSetEfusBufferMode,
prSetEfuseBufModeInfo,
sizeof(struct PARAM_CUSTOM_EFUSE_BUFFER_MODE),
FALSE, FALSE, TRUE, &u4BufLen);
i4BytesWritten =
snprintf(pcCommand, i4TotalLen, "set buffer mode %s",
(rStatus == WLAN_STATUS_SUCCESS) ? "success" : "fail");
out:
if (pucConfigBuf)
kalMemFree(pucConfigBuf, VIR_MEM_TYPE, 2048);
if (prSetEfuseBufModeInfo)
kalMemFree(prSetEfuseBufModeInfo, VIR_MEM_TYPE,
sizeof(truct PARAM_CUSTOM_EFUSE_BUFFER_MODE));
return i4BytesWritten;
}
#endif /* CFG_SUPPORT_BUFFER_MODE */
static int priv_driver_get_rx_statistics(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t u4Ret = 0;
struct PARAM_CUSTOM_ACCESS_RX_STAT rRxStatisticsTest;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
DBGLOG(INIT, ERROR,
"MT6632 : priv_driver_get_rx_statistics\n");
if (i4Argc >= 2) {
u4Ret = kalkStrtou32(apcArgv[1], 0,
&(rRxStatisticsTest.u4SeqNum));
rRxStatisticsTest.u4TotalNum = sizeof(struct
PARAM_RX_STAT) / 4;
rStatus = kalIoctl(prGlueInfo, wlanoidQueryRxStatistics,
&rRxStatisticsTest, sizeof(rRxStatisticsTest),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
return i4BytesWritten;
}
#endif /* CFG_SUPPORT_QA_TOOL */
#if CFG_SUPPORT_MSP
#if 0
static int priv_driver_get_stat(IN struct net_device
*prNetDev, IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t i4ArgNum = 2;
struct PARAM_GET_STA_STATISTICS rQueryStaStatistics;
int32_t rRssi;
uint16_t u2LinkSpeed;
uint32_t u4Per;
UINTT_8 i;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
kalMemZero(&rQueryStaStatistics,
sizeof(rQueryStaStatistics));
if (i4Argc >= i4ArgNum) {
wlanHwAddrToBin(apcArgv[1],
&rQueryStaStatistics.aucMacAddr[0]);
rQueryStaStatistics.ucReadClear = TRUE;
rStatus = kalIoctl(prGlueInfo, wlanoidQueryStaStatistics,
&rQueryStaStatistics,
sizeof(rQueryStaStatistics),
TRUE, FALSE, TRUE, &u4BufLen);
if (rStatus == WLAN_STATUS_SUCCESS) {
rRssi = RCPI_TO_dBm(rQueryStaStatistics.ucRcpi);
u2LinkSpeed = rQueryStaStatistics.u2LinkSpeed == 0 ? 0 :
rQueryStaStatistics.u2LinkSpeed / 2;
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen,
"%s", "\n\nSTA Stat:\n");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"CurrentTemperature = %d\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx success = %lu\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx fail count = %ld, PER=%ld.%1ld%%\n",
0, 0, 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx success = %lu\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx with CRC = %ld, PER=%ld.%1ld%%\n",
0, 0, 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx with PhyErr = %lu\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx with PlcpErr = %lu\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx drop due to out of resource= %lu\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx duplicate frame = %lu\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"False CCA = %lu\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"RSSI = %d %d %d %d\n",
0, 0, 0, 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Last TX Rate = %s, %s, %s, %s, %s\n",
"NA", "NA", "NA", "NA", "NA");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Last RX Rate = %s, %s, %s, %s, %s\n",
"NA", "NA", "NA", "NA", "NA");
for (i = 0; i < 2 /* band num */; i++) {
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"BandIdx: = %d\n", i);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s",
"\tRange: 1 2~5 6~15 16~22 23~33 34~49 50~57 58~64\n"
);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\t\t%d \t%d \t%d \t%d \t%d \t%d \t%d \t%d\n",
0, 0, 0, 0, 0, 0, 0, 0);
}
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx success = %ld\n",
rQueryStaStatistics.u4TransmitCount -
rQueryStaStatistics.u4TransmitFailCount);
u4Per = rQueryStaStatistics.u4TransmitFailCount == 0 ?
0 :
(1000 * (rQueryStaStatistics.u4TransmitFailCount))
/ rQueryStaStatistics.u4TransmitCount;
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx fail count = %ld, PER=%ld.%1ld%%\n",
rQueryStaStatistics.u4TransmitFailCount,
u4Per / 10, u4Per % 10);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"RSSI = %d\n", rRssi);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"LinkSpeed = %d\n", u2LinkSpeed);
}
} else
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "%s",
"\n\nNo STA Stat:\n");
return i4BytesWritten;
}
#endif
static int priv_driver_get_sta_statistics(
IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t i4ArgNum = 3;
struct PARAM_GET_STA_STATISTICS rQueryStaStatistics;
int32_t rRssi;
uint16_t u2LinkSpeed;
uint32_t u4Per;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
kalMemZero(&rQueryStaStatistics,
sizeof(rQueryStaStatistics));
rQueryStaStatistics.ucReadClear = TRUE;
if (i4Argc >= i4ArgNum) {
if (strnicmp(apcArgv[1], CMD_GET_STA_KEEP_CNT,
strlen(CMD_GET_STA_KEEP_CNT)) == 0) {
wlanHwAddrToBin(apcArgv[2],
&rQueryStaStatistics.aucMacAddr[0]);
rQueryStaStatistics.ucReadClear = FALSE;
} else if (strnicmp(apcArgv[2], CMD_GET_STA_KEEP_CNT,
strlen(CMD_GET_STA_KEEP_CNT)) == 0) {
wlanHwAddrToBin(apcArgv[1],
&rQueryStaStatistics.aucMacAddr[0]);
rQueryStaStatistics.ucReadClear = FALSE;
}
} else {
/* Get AIS AP address for no argument */
if (prGlueInfo->prAdapter->prAisBssInfo->prStaRecOfAP) {
COPY_MAC_ADDR(rQueryStaStatistics.aucMacAddr,
prGlueInfo->prAdapter->prAisBssInfo
->prStaRecOfAP->aucMacAddr);
DBGLOG(RSN, INFO, "use ais ap "MACSTR"\n",
MAC2STR(prGlueInfo->prAdapter->prAisBssInfo
->prStaRecOfAP->aucMacAddr));
} else {
DBGLOG(RSN, INFO, "not connect to ais ap %lx\n",
prGlueInfo->prAdapter->prAisBssInfo
->prStaRecOfAP);
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen,
"%s", "\n\nNo STA Stat:\n");
return i4BytesWritten;
}
if (i4Argc == 2) {
if (strnicmp(apcArgv[1], CMD_GET_STA_KEEP_CNT,
strlen(CMD_GET_STA_KEEP_CNT)) == 0)
rQueryStaStatistics.ucReadClear = FALSE;
}
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryStaStatistics,
&rQueryStaStatistics, sizeof(rQueryStaStatistics),
TRUE, FALSE, TRUE, &u4BufLen);
if (rStatus == WLAN_STATUS_SUCCESS) {
rRssi = RCPI_TO_dBm(rQueryStaStatistics.ucRcpi);
u2LinkSpeed = rQueryStaStatistics.u2LinkSpeed == 0 ? 0 :
rQueryStaStatistics.u2LinkSpeed / 2;
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "%s",
"\n\nSTA Stat:\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx total cnt = %d\n",
rQueryStaStatistics.u4TransmitCount);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx success = %d\n",
rQueryStaStatistics.u4TransmitCount -
rQueryStaStatistics.u4TransmitFailCount);
u4Per = rQueryStaStatistics.u4TransmitCount == 0 ? 0 :
(1000 * (rQueryStaStatistics.u4TransmitFailCount)) /
rQueryStaStatistics.u4TransmitCount;
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx fail count = %d, PER=%d.%d%%\n",
rQueryStaStatistics.u4TransmitFailCount, u4Per / 10,
u4Per % 10);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"RSSI = %d\n", rRssi);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"LinkSpeed = %d\n", u2LinkSpeed);
} else
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "%s",
"\n\nNo STA Stat:\n");
return i4BytesWritten;
}
static int priv_driver_get_bss_statistics(
IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus;
uint8_t arBssid[PARAM_MAC_ADDR_LEN];
uint32_t u4BufLen;
int32_t i4Rssi;
struct PARAM_GET_BSS_STATISTICS rQueryBssStatistics;
struct NETDEV_PRIVATE_GLUE_INFO *prNetDevPrivate =
(struct NETDEV_PRIVATE_GLUE_INFO *) NULL;
uint8_t ucBssIndex;
int32_t i4BytesWritten = 0;
#if 0
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Argc = 0;
uint32_t u4Index;
#endif
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
kalMemZero(arBssid, MAC_ADDR_LEN);
wlanQueryInformation(prGlueInfo->prAdapter, wlanoidQueryBssid,
&arBssid[0], sizeof(arBssid), &u4BufLen);
#if 0 /* Todo:: Get the none-AIS statistics */
if (i4Argc >= 2)
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Index);
#endif
/* 2. fill RSSI */
if (prGlueInfo->eParamMediaStateIndicated !=
PARAM_MEDIA_STATE_CONNECTED) {
/* not connected */
DBGLOG(REQ, WARN, "not yet connected\n");
return WLAN_STATUS_SUCCESS;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryRssi, &i4Rssi,
sizeof(i4Rssi), TRUE, FALSE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
DBGLOG(REQ, WARN, "unable to retrieve rssi\n");
/* 3 get per-BSS link statistics */
if (rStatus == WLAN_STATUS_SUCCESS) {
/* get Bss Index from ndev */
prNetDevPrivate = (struct NETDEV_PRIVATE_GLUE_INFO *)
netdev_priv(prNetDev);
ASSERT(prNetDevPrivate->prGlueInfo == prGlueInfo);
ucBssIndex = prNetDevPrivate->ucBssIdx;
kalMemZero(&rQueryBssStatistics,
sizeof(rQueryBssStatistics));
rQueryBssStatistics.ucBssIndex = ucBssIndex;
rQueryBssStatistics.ucReadClear = TRUE;
rStatus = kalIoctl(prGlueInfo, wlanoidQueryBssStatistics,
&rQueryBssStatistics,
sizeof(rQueryBssStatistics),
TRUE, FALSE, TRUE, &u4BufLen);
if (rStatus == WLAN_STATUS_SUCCESS) {
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen,
"%s", "\n\nStat:\n");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "CurrentTemperature = -\n");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx success = %d\n",
rQueryBssStatistics.u4TransmitCount -
rQueryBssStatistics.u4TransmitFailCount);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx fail count = %d\n",
rQueryBssStatistics.u4TransmitFailCount);
#if 0
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx success = %ld\n", 0);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx with CRC = %ld\n",
prStatistics->rFCSErrorCount.QuadPart);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "Rx with PhyErr = 0\n");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
"%s", "Rx with PlcpErr = 0\n");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "Rx drop due to out of resource = 0\n");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rx duplicate frame = %ld\n",
prStatistics->rFrameDuplicateCount.QuadPart);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "False CCA = 0\n");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"RSSI = %d\n", i4Rssi);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Last TX Rate = %s, %s, %s, %s, %s\n",
"NA", "NA", "NA", "NA", "NA");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Last RX Rate = %s, %s, %s, %s, %s\n",
"NA", "NA", "NA", "NA", "NA");
#endif
}
} else {
DBGLOG(REQ, WARN,
"unable to retrieve per-BSS link statistics\n");
}
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__,
pcCommand);
return i4BytesWritten;
}
#if CFG_SUPPORT_GET_MCS_INFO
#define GET_TX_MCS_BW(_x) (((_x) & (0x3 << 12)) >> 12)
#define GET_TX_MCS_SGI(_x) (((_x) & (0x1 << 14)) >> 14)
#define GET_TX_MCS_LDPC(_x) (((_x) & (0x1 << 15)) >> 15)
#endif
char *HW_TX_MODE_STR[] = {"CCK", "OFDM", "MM", "GF", "VHT", "N/A"};
char *HW_TX_RATE_CCK_STR[] = {"1M", "2M", "5.5M", "11M", "N/A"};
char *HW_TX_RATE_OFDM_STR[] = {"6M", "9M", "12M", "18M", "24M", "36M",
"48M", "54M", "N/A"};
char *HW_TX_RATE_BW[] = {"BW20", "BW40", "BW80", "BW160/BW8080", "N/A"};
#if (CFG_SUPPORT_RA_GEN == 0)
static char *RATE_TBLE[] = {"B", "G", "N", "N_2SS", "AC", "AC_2SS", "N/A"};
#else
static char *RATE_TBLE[] = {"B", "G", "N", "N_2SS", "AC", "AC_2SS", "BG",
"N/A"};
static char *RA_STATUS_TBLE[] = {"INVALID", "POWER_SAVING", "SLEEP", "STANDBY",
"RUNNING", "N/A"};
#if 0
static char *LT_MODE_TBLE[] = {"RSSI", "LAST_RATE", "TRACKING", "N/A"};
static char *SGI_UNSP_STATE_TBLE[] = {"INITIAL", "PROBING", "SUCCESS",
"FAILURE", "N/A"};
static char *BW_STATE_TBLE[] = {"UNCHANGED", "DOWN", "N/A"};
#endif
#endif
#if 0
static char *AR_STATE[] = {"NULL", "STEADY", "PROBE", "N/A"};
static char *AR_ACTION[] = {"NULL", "INDEX", "RATE_UP", "RATE_DOWN", "RATE_GRP",
"RATE_BACK", "GI", "SGI_EN", "SGI_DIS", "PWR",
"PWR_UP", "PWR_DOWN", "PWR_RESET_UP", "BF", "BF_EN",
"BF_DIS", "N/A"};
#endif
#define BW_20 0
#define BW_40 1
#define BW_80 2
#define BW_160 3
#define BW_10 4
#define BW_5 6
#define BW_8080 7
#define BW_ALL 0xFF
char *hw_rate_ofdm_str(uint16_t ofdm_idx)
{
switch (ofdm_idx) {
case 11: /* 6M */
return HW_TX_RATE_OFDM_STR[0];
case 15: /* 9M */
return HW_TX_RATE_OFDM_STR[1];
case 10: /* 12M */
return HW_TX_RATE_OFDM_STR[2];
case 14: /* 18M */
return HW_TX_RATE_OFDM_STR[3];
case 9: /* 24M */
return HW_TX_RATE_OFDM_STR[4];
case 13: /* 36M */
return HW_TX_RATE_OFDM_STR[5];
case 8: /* 48M */
return HW_TX_RATE_OFDM_STR[6];
case 12: /* 54M */
return HW_TX_RATE_OFDM_STR[7];
default:
return HW_TX_RATE_OFDM_STR[8];
}
}
static u_int8_t priv_driver_get_sgi_info(
IN struct PARAM_PEER_CAP *prWtblPeerCap)
{
if (!prWtblPeerCap)
return FALSE;
switch (prWtblPeerCap->ucFrequencyCapability) {
case BW_20:
return prWtblPeerCap->fgG2;
case BW_40:
return prWtblPeerCap->fgG4;
case BW_80:
return prWtblPeerCap->fgG8;
case BW_160:
return prWtblPeerCap->fgG16;
default:
return FALSE;
}
}
static u_int8_t priv_driver_get_ldpc_info(
IN struct PARAM_TX_CONFIG *prWtblTxConfig)
{
if (!prWtblTxConfig)
return FALSE;
if (prWtblTxConfig->fgIsVHT)
return prWtblTxConfig->fgVhtLDPC;
else
return prWtblTxConfig->fgLDPC;
}
int32_t priv_driver_rate_to_string(IN char *pcCommand,
IN int i4TotalLen, uint8_t TxRx,
struct PARAM_HW_WLAN_INFO *prHwWlanInfo)
{
uint8_t i, txmode, rate, stbc;
uint8_t nss;
int32_t i4BytesWritten = 0;
for (i = 0; i < AUTO_RATE_NUM; i++) {
txmode = HW_TX_RATE_TO_MODE(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i]);
if (txmode >= MAX_TX_MODE)
txmode = MAX_TX_MODE;
rate = HW_TX_RATE_TO_MCS(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i],
txmode);
nss = HW_TX_RATE_TO_NSS(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i]) + 1;
stbc = HW_TX_RATE_TO_STBC(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i]);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRate index[%d] ", i);
if (prHwWlanInfo->rWtblRateInfo.ucRateIdx == i) {
if (TxRx == 0)
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "[Last RX Rate] ");
else
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "[Last TX Rate] ");
} else
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", " ");
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
rate < 4 ? HW_TX_RATE_CCK_STR[rate] :
HW_TX_RATE_CCK_STR[4]);
else if (txmode == TX_RATE_MODE_OFDM)
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
hw_rate_ofdm_str(rate));
else {
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"NSS%d_MCS%d, ", nss, rate);
}
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ", HW_TX_RATE_BW[
prHwWlanInfo->rWtblPeerCap.ucFrequencyCapability]);
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
rate < 4 ? "LP" : "SP");
else if (txmode == TX_RATE_MODE_OFDM)
;
else
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
priv_driver_get_sgi_info(
&prHwWlanInfo->rWtblPeerCap) == 0 ?
"LGI" : "SGI");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s%s %s\n",
HW_TX_MODE_STR[txmode], stbc ? "STBC" : " ",
priv_driver_get_ldpc_info(&prHwWlanInfo->rWtblTxConfig)
== 0 ? "BCC" : "LDPC");
}
return i4BytesWritten;
}
static int32_t priv_driver_dump_helper_wtbl_info(IN char *pcCommand,
IN int i4TotalLen, struct PARAM_HW_WLAN_INFO *prHwWlanInfo)
{
uint8_t i;
int32_t i4BytesWritten = 0;
ASSERT(pcCommand);
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "%s",
"\n\nwtbl:\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Dump WTBL info of WLAN_IDX = %d\n",
prHwWlanInfo->u4Index);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tAddr="MACSTR"\n",
MAC2STR(prHwWlanInfo->rWtblTxConfig.aucPA));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tMUAR_Idx = %d\n",
prHwWlanInfo->rWtblSecConfig.ucMUARIdx);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\trc_a1/rc_a2:%d/%d\n",
prHwWlanInfo->rWtblSecConfig.fgRCA1,
prHwWlanInfo->rWtblSecConfig.fgRCA2);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tKID:%d/RCID:%d/RKV:%d/RV:%d/IKV:%d/WPI_FLAG:%d\n",
prHwWlanInfo->rWtblSecConfig.ucKeyID,
prHwWlanInfo->rWtblSecConfig.fgRCID,
prHwWlanInfo->rWtblSecConfig.fgRKV,
prHwWlanInfo->rWtblSecConfig.fgRV,
prHwWlanInfo->rWtblSecConfig.fgIKV,
prHwWlanInfo->rWtblSecConfig.fgEvenPN);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s", "\tGID_SU:NA");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tsw/DIS_RHTR:%d/%d\n",
prHwWlanInfo->rWtblTxConfig.fgSW,
prHwWlanInfo->rWtblTxConfig.fgDisRxHdrTran);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tHT/VHT/HT-LDPC/VHT-LDPC/DYN_BW/MMSS:%d/%d/%d/%d/%d/%d\n",
prHwWlanInfo->rWtblTxConfig.fgIsHT,
prHwWlanInfo->rWtblTxConfig.fgIsVHT,
prHwWlanInfo->rWtblTxConfig.fgLDPC,
prHwWlanInfo->rWtblTxConfig.fgVhtLDPC,
prHwWlanInfo->rWtblTxConfig.fgDynBw,
prHwWlanInfo->rWtblPeerCap.ucMMSS);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tFCAP/G2/G4/G8/G16/CBRN:%d/%d/%d/%d/%d/%d\n",
prHwWlanInfo->rWtblPeerCap.ucFrequencyCapability,
prHwWlanInfo->rWtblPeerCap.fgG2,
prHwWlanInfo->rWtblPeerCap.fgG4,
prHwWlanInfo->rWtblPeerCap.fgG8,
prHwWlanInfo->rWtblPeerCap.fgG16,
prHwWlanInfo->rWtblPeerCap.ucChangeBWAfterRateN);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tHT-TxBF(tibf/tebf):%d/%d, VHT-TxBF(tibf/tebf):%d/%d, PFMU_IDX=%d\n",
prHwWlanInfo->rWtblTxConfig.fgTIBF,
prHwWlanInfo->rWtblTxConfig.fgTEBF,
prHwWlanInfo->rWtblTxConfig.fgVhtTIBF,
prHwWlanInfo->rWtblTxConfig.fgVhtTEBF,
prHwWlanInfo->rWtblTxConfig.ucPFMUIdx);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s", "\tSPE_IDX=NA\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tBA Enable:0x%x, BAFail Enable:%d\n",
prHwWlanInfo->rWtblBaConfig.ucBaEn,
prHwWlanInfo->rWtblTxConfig.fgBAFEn);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tQoS Enable:%d\n", prHwWlanInfo->rWtblTxConfig.fgIsQoS);
if (prHwWlanInfo->rWtblTxConfig.fgIsQoS) {
for (i = 0; i < 8; i += 2) {
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\t\tBA WinSize: TID 0 - %d, TID 1 - %d\n",
(uint32_t)
((prHwWlanInfo->rWtblBaConfig.u4BaWinSize >>
(i * 3)) & BITS(0, 2)),
(uint32_t)
((prHwWlanInfo->rWtblBaConfig.u4BaWinSize >>
((i + 1) * 3)) & BITS(0, 2)));
}
}
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tpartial_aid:%d\n",
prHwWlanInfo->rWtblTxConfig.u2PartialAID);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\twpi_even:%d\n",
prHwWlanInfo->rWtblSecConfig.fgEvenPN);
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tAAD_OM/CipherSuit:%d/%d\n",
prHwWlanInfo->rWtblTxConfig.fgAADOM,
prHwWlanInfo->rWtblSecConfig.ucCipherSuit);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\taf:%d\n",
prHwWlanInfo->rWtblPeerCap.ucAmpduFactor);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\trdg_ba:%d/rdg capability:%d\n",
prHwWlanInfo->rWtblTxConfig.fgRdgBA,
prHwWlanInfo->rWtblTxConfig.fgRDG);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tcipher_suit:%d\n",
prHwWlanInfo->rWtblSecConfig.ucCipherSuit);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tFromDS:%d\n",
prHwWlanInfo->rWtblTxConfig.fgIsFromDS);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tToDS:%d\n",
prHwWlanInfo->rWtblTxConfig.fgIsToDS);
#if 0
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRCPI = %d %d %d %d\n",
prHwWlanInfo->rWtblRxCounter.ucRxRcpi0,
prHwWlanInfo->rWtblRxCounter.ucRxRcpi1,
prHwWlanInfo->rWtblRxCounter.ucRxRcpi2,
prHwWlanInfo->rWtblRxCounter.ucRxRcpi3);
#endif
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRSSI = %d %d %d %d\n",
RCPI_TO_dBm(prHwWlanInfo->rWtblRxCounter.ucRxRcpi0),
RCPI_TO_dBm(prHwWlanInfo->rWtblRxCounter.ucRxRcpi1),
RCPI_TO_dBm(prHwWlanInfo->rWtblRxCounter.ucRxRcpi2),
RCPI_TO_dBm(prHwWlanInfo->rWtblRxCounter.ucRxRcpi3));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s", "\tRate Info\n");
i4BytesWritten += priv_driver_rate_to_string(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, 1, prHwWlanInfo);
#if 0
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"%s", "\t===Key======\n");
for (i = 0; i < 32; i += 8) {
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\t0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
prHwWlanInfo->rWtblKeyConfig.aucKey[i + 0],
prHwWlanInfo->rWtblKeyConfig.aucKey[i + 1],
prHwWlanInfo->rWtblKeyConfig.aucKey[i + 2],
prHwWlanInfo->rWtblKeyConfig.aucKey[i + 3],
prHwWlanInfo->rWtblKeyConfig.aucKey[i + 4],
prHwWlanInfo->rWtblKeyConfig.aucKey[i + 5],
prHwWlanInfo->rWtblKeyConfig.aucKey[i + 6],
prHwWlanInfo->rWtblKeyConfig.aucKey[i + 7]);
}
#endif
return i4BytesWritten;
}
static int priv_driver_get_wtbl_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int32_t u4Ret = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct PARAM_HW_WLAN_INFO *prHwWlanInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
/* DBGLOG(RSN, INFO, "MT6632 : priv_driver_get_wtbl_info\n"); */
prHwWlanInfo = (struct PARAM_HW_WLAN_INFO *)kalMemAlloc(
sizeof(struct PARAM_HW_WLAN_INFO), VIR_MEM_TYPE);
if (!prHwWlanInfo)
return -1;
if (i4Argc >= 2) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &prHwWlanInfo->u4Index);
DBGLOG(REQ, INFO, "MT6632 : index = %d\n",
prHwWlanInfo->u4Index);
rStatus = kalIoctl(prGlueInfo, wlanoidQueryWlanInfo,
prHwWlanInfo,
sizeof(struct PARAM_HW_WLAN_INFO),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, INFO, "rStatus %u u4BufLen = %d\n", rStatus,
u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
kalMemFree(prHwWlanInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_HW_WLAN_INFO));
return -1;
}
i4BytesWritten = priv_driver_dump_helper_wtbl_info(pcCommand,
i4TotalLen, prHwWlanInfo);
}
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
kalMemFree(prHwWlanInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_HW_WLAN_INFO));
return i4BytesWritten;
}
/* Private Coex Ctrl Subcmd for Getting Coex Info */
static int priv_driver_get_coex_info(IN struct GLUE_INFO *prGlueInfo,
IN struct CMD_COEX_HANDLER *prCmdCoexHandler,
IN signed char *argv[])
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
uint32_t u4Ret = 0;
struct CMD_COEX_GET_INFO rCmdCoexGetInfo;
kalMemSet(&rCmdCoexGetInfo,
0,
sizeof(struct CMD_COEX_GET_INFO));
/* Copy Memory */
kalMemCopy(prCmdCoexHandler->aucBuffer,
&rCmdCoexGetInfo,
sizeof(struct CMD_COEX_GET_INFO));
DBGLOG(INIT, INFO, "priv_driver_get_coex_info end\n");
/* Ioctl Get Coex Info */
rStatus = kalIoctl(prGlueInfo,
wlanoidQueryCoexGetInfo,
prCmdCoexHandler,
sizeof(struct CMD_COEX_HANDLER),
TRUE,
TRUE,
TRUE,
&u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
/* If all pass, return u4Ret to 0 */
return u4Ret;
}
static void priv_coex_get_info(IN char *pcCommand,
IN int i4TotalLen,
IN uint32_t *pu4Offset,
IN struct CMD_COEX_HANDLER *prCmdCoexHandler)
{
#define CMD_DEFAULT_LEN 2
#define DEFAULT_LEN_BYTE 2
struct CMD_COEX_GET_INFO *prCmdCoexGetInfo;
uint8_t ucIdx = 0;
uint16_t u2TotLen;
uint8_t ucCoexId;
uint8_t ucCoexLen;
uint8_t *pucCoexInfo;
prCmdCoexGetInfo =
(struct CMD_COEX_GET_INFO *) prCmdCoexHandler->aucBuffer;
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "\n");
pucCoexInfo = &prCmdCoexGetInfo->ucCoexInfo[0];
u2TotLen = *pucCoexInfo | (*(pucCoexInfo+1) << 8);
pucCoexInfo += DEFAULT_LEN_BYTE;
while (ucIdx < u2TotLen) {
ucCoexId = *pucCoexInfo++;
ucCoexLen = *pucCoexInfo++;
ucIdx += ucCoexLen + CMD_DEFAULT_LEN;
if (ucCoexId >= COEX_REF_TABLE_ID_NUM) {
*pu4Offset += snprintf(pcCommand + *pu4Offset,
PRIV_CMD_SIZE - *pu4Offset, "Wrong coex info id...\n");
return;
}
if (coex_ref_table[ucCoexId].pCoexRefHandle) {
coex_ref_table[ucCoexId].pCoexRefHandle(pcCommand,
pu4Offset,
&pucCoexInfo);
} else{
pucCoexInfo += ucCoexLen;
}
}
}
/* Private Coex Ctrl Subcmd for Isolation Detection */
static int priv_driver_iso_detect(IN struct GLUE_INFO *prGlueInfo,
IN struct CMD_COEX_HANDLER *prCmdCoexHandler,
IN signed char *argv[])
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
uint32_t u4Ret = 0;
struct CMD_COEX_ISO_DETECT rCmdCoexIsoDetect;
rCmdCoexIsoDetect.u4Isolation = 0;
u4Ret = kalkStrtou32(argv[2], 0, &(rCmdCoexIsoDetect.u4IsoPath));
if (u4Ret) {
DBGLOG(REQ, LOUD,
"Parse Iso Path failed u4Ret=%d\n", u4Ret);
return -1;
}
u4Ret = kalkStrtou32(argv[3], 0, &(rCmdCoexIsoDetect.u4Channel));
if (u4Ret) {
DBGLOG(REQ, LOUD,
"Parse channel failed u4Ret = %d\n", u4Ret);
return -1;
}
/* Copy Memory */
kalMemCopy(prCmdCoexHandler->aucBuffer,
&rCmdCoexIsoDetect,
sizeof(struct CMD_COEX_ISO_DETECT));
DBGLOG(REQ, INFO, "priv_driver_get_coex_info end\n");
/* Ioctl Isolation Detect */
rStatus = kalIoctl(prGlueInfo,
wlanoidQueryCoexIso,
prCmdCoexHandler,
sizeof(struct CMD_COEX_HANDLER),
TRUE,
TRUE,
TRUE,
&u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
/* If all pass, return u4Ret to 0 */
return u4Ret;
}
/* Private Command for Coex Ctrl */
static int priv_driver_coex_ctrl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int32_t i4ArgNum = 2;
signed char *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret = 0;
uint32_t u4Offset = 0;
int32_t i4SubArgNum;
enum ENUM_COEX_CMD_CTRL CoexCmdCtrl;
struct CMD_COEX_HANDLER rCmdCoexHandler;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
/* Prevent Kernel Panic, set default i4ArgNum to 2 */
if (i4Argc >= i4ArgNum) {
/* Parse Coex SubCmd */
u4Ret = kalkStrtou32(apcArgv[1], 0, &rCmdCoexHandler.u4SubCmd);
if (u4Ret)
return -1;
CoexCmdCtrl =
(enum ENUM_COEX_CMD_CTRL)rCmdCoexHandler.u4SubCmd;
switch (CoexCmdCtrl) {
case COEX_CMD_GET_INFO:
{
u4Ret = priv_driver_get_coex_info(prGlueInfo,
&rCmdCoexHandler,
apcArgv);
if (u4Ret)
return -1;
priv_coex_get_info(pcCommand,
i4TotalLen,
&u4Offset,
&rCmdCoexHandler);
break;
}
case COEX_CMD_GET_ISO_DETECT:
{
struct CMD_COEX_ISO_DETECT *prCmdCoexIsoDetect;
i4SubArgNum = 3;
/* Safely dereference "argv[3]".*/
if (i4Argc < i4SubArgNum)
break;
/* Isolation Detection Method */
u4Ret = priv_driver_iso_detect(prGlueInfo,
&rCmdCoexHandler,
apcArgv);
if (u4Ret)
return -1;
/* Get Isolation value */
prCmdCoexIsoDetect =
(struct CMD_COEX_ISO_DETECT *)rCmdCoexHandler.aucBuffer;
/* Set Return i4BytesWritten Value */
u4Offset = snprintf(pcCommand, i4TotalLen, "%d",
(prCmdCoexIsoDetect->u4Isolation/2));
DBGLOG(REQ, INFO, "Isolation: %d\n",
(prCmdCoexIsoDetect->u4Isolation/2));
break;
}
/* Default Coex Cmd */
default:
break;
}
/* Set Return i4BytesWritten Value */
i4BytesWritten = (int32_t)u4Offset;
}
return i4BytesWritten;
}
static int priv_driver_get_sta_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint8_t aucMacAddr[MAC_ADDR_LEN];
uint8_t ucWlanIndex;
uint8_t *pucMacAddr = NULL;
struct PARAM_HW_WLAN_INFO *prHwWlanInfo;
struct PARAM_GET_STA_STATISTICS rQueryStaStatistics;
int32_t rRssi;
uint16_t u2LinkSpeed;
uint32_t u4Per;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
kalMemZero(&rQueryStaStatistics, sizeof(rQueryStaStatistics));
rQueryStaStatistics.ucReadClear = TRUE;
/* DBGLOG(RSN, INFO, "MT6632 : priv_driver_get_sta_info\n"); */
if (i4Argc >= 3) {
if (strnicmp(apcArgv[1], CMD_GET_STA_KEEP_CNT,
strlen(CMD_GET_STA_KEEP_CNT)) == 0) {
wlanHwAddrToBin(apcArgv[2], &aucMacAddr[0]);
rQueryStaStatistics.ucReadClear = FALSE;
} else if (strnicmp(apcArgv[2], CMD_GET_STA_KEEP_CNT,
strlen(CMD_GET_STA_KEEP_CNT)) == 0) {
wlanHwAddrToBin(apcArgv[1], &aucMacAddr[0]);
rQueryStaStatistics.ucReadClear = FALSE;
}
if (!wlanGetWlanIdxByAddress(prGlueInfo->prAdapter,
&aucMacAddr[0], &ucWlanIndex))
return i4BytesWritten;
} else {
/* Get AIS AP address for no argument */
if (prGlueInfo->prAdapter->prAisBssInfo->prStaRecOfAP)
ucWlanIndex = prGlueInfo->prAdapter->prAisBssInfo
->prStaRecOfAP->ucWlanIndex;
else if (!wlanGetWlanIdxByAddress(prGlueInfo->prAdapter, NULL,
&ucWlanIndex)) /* try get a peer */
return i4BytesWritten;
if (i4Argc == 2) {
if (strnicmp(apcArgv[1], CMD_GET_STA_KEEP_CNT,
strlen(CMD_GET_STA_KEEP_CNT)) == 0)
rQueryStaStatistics.ucReadClear = FALSE;
}
}
prHwWlanInfo = (struct PARAM_HW_WLAN_INFO *)kalMemAlloc(
sizeof(struct PARAM_HW_WLAN_INFO), VIR_MEM_TYPE);
prHwWlanInfo->u4Index = ucWlanIndex;
DBGLOG(REQ, INFO, "MT6632 : index = %d i4TotalLen = %d\n",
prHwWlanInfo->u4Index, i4TotalLen);
rStatus = kalIoctl(prGlueInfo, wlanoidQueryWlanInfo, prHwWlanInfo,
sizeof(struct PARAM_HW_WLAN_INFO),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
kalMemFree(prHwWlanInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_HW_WLAN_INFO));
return -1;
}
i4BytesWritten = priv_driver_dump_helper_wtbl_info(pcCommand,
i4TotalLen, prHwWlanInfo);
pucMacAddr = wlanGetStaAddrByWlanIdx(prGlueInfo->prAdapter,
ucWlanIndex);
if (pucMacAddr) {
COPY_MAC_ADDR(rQueryStaStatistics.aucMacAddr, pucMacAddr);
/* i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
* i4TotalLen - i4BytesWritten,
* "\tAddr="MACSTR"\n",
* MAC2STR(rQueryStaStatistics.aucMacAddr));
*/
rStatus = kalIoctl(prGlueInfo, wlanoidQueryStaStatistics,
&rQueryStaStatistics,
sizeof(rQueryStaStatistics),
TRUE, FALSE, TRUE, &u4BufLen);
if (rStatus == WLAN_STATUS_SUCCESS) {
rRssi = RCPI_TO_dBm(rQueryStaStatistics.ucRcpi);
u2LinkSpeed = rQueryStaStatistics.u2LinkSpeed == 0 ?
0 : rQueryStaStatistics.u2LinkSpeed/2;
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n\nSTA Stat:\n");
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx total cnt = %d\n",
rQueryStaStatistics.u4TransmitCount);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx success = %d\n",
rQueryStaStatistics.u4TransmitCount -
rQueryStaStatistics.u4TransmitFailCount);
u4Per = rQueryStaStatistics.u4TransmitCount == 0 ? 0 :
(1000 *
(rQueryStaStatistics.u4TransmitFailCount)) /
rQueryStaStatistics.u4TransmitCount;
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Tx fail count = %d, PER=%d.%1d%%\n",
rQueryStaStatistics.u4TransmitFailCount,
u4Per/10, u4Per%10);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"RSSI = %d\n", rRssi);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"LinkSpeed = %d\n", u2LinkSpeed);
}
}
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
kalMemFree(prHwWlanInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_HW_WLAN_INFO));
return i4BytesWritten;
}
static int priv_driver_get_mib_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
uint8_t i;
uint32_t u4Per;
int32_t u4Ret = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct PARAM_HW_MIB_INFO *prHwMibInfo;
struct RX_CTRL *prRxCtrl;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prRxCtrl = &prGlueInfo->prAdapter->rRxCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
DBGLOG(REQ, INFO, "MT6632 : priv_driver_get_mib_info\n");
prHwMibInfo = (struct PARAM_HW_MIB_INFO *)kalMemAlloc(
sizeof(struct PARAM_HW_MIB_INFO), VIR_MEM_TYPE);
if (!prHwMibInfo)
return -1;
if (i4Argc == 1)
prHwMibInfo->u4Index = 0;
if (i4Argc >= 2)
u4Ret = kalkStrtou32(apcArgv[1], 0, &prHwMibInfo->u4Index);
DBGLOG(REQ, INFO, "MT6632 : index = %d\n", prHwMibInfo->u4Index);
rStatus = kalIoctl(prGlueInfo, wlanoidQueryMibInfo, prHwMibInfo,
sizeof(struct PARAM_HW_MIB_INFO),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS) {
kalMemFree(prHwMibInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_HW_MIB_INFO));
return -1;
}
if (prHwMibInfo->u4Index < 2) {
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "%s",
"\n\nmib state:\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Dump MIB info of IDX = %d\n",
prHwMibInfo->u4Index);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "===Rx Related Counters===\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx with CRC=%d\n",
prHwMibInfo->rHwMibCnt.u4RxFcsErrCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx drop due to out of resource=%d\n",
prHwMibInfo->rHwMibCnt.u4RxFifoFullCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx Mpdu=%d\n",
prHwMibInfo->rHwMibCnt.u4RxMpduCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx AMpdu=%d\n",
prHwMibInfo->rHwMibCnt.u4RxAMPDUCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx PF Drop=%d\n",
prHwMibInfo->rHwMibCnt.u4PFDropCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx Len Mismatch=%d\n",
prHwMibInfo->rHwMibCnt.u4RxLenMismatchCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx data indicate total=%ld\n",
RX_GET_CNT(prRxCtrl, RX_DATA_INDICATION_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx data retain total=%ld\n",
RX_GET_CNT(prRxCtrl, RX_DATA_RETAINED_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx drop by SW total=%ld\n",
RX_GET_CNT(prRxCtrl, RX_DROP_TOTAL_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx reorder miss=%ld\n",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_MISS_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx reorder within=%ld\n",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_WITHIN_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx reorder ahead=%ld\n",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_AHEAD_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx reorder behind=%ld\n", RX_GET_CNT(prRxCtrl,
RX_DATA_REORDER_BEHIND_COUNT));
do {
uint32_t u4AmsduCntx100 = 0;
if (RX_GET_CNT(prRxCtrl, RX_DATA_AMSDU_COUNT))
u4AmsduCntx100 =
(uint32_t)div64_u64(RX_GET_CNT(prRxCtrl,
RX_DATA_MSDU_IN_AMSDU_COUNT) * 100,
RX_GET_CNT(prRxCtrl,
RX_DATA_AMSDU_COUNT));
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx avg MSDU in AMSDU=%1d.%02d\n",
u4AmsduCntx100 / 100, u4AmsduCntx100 % 100);
} while (FALSE);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx total MSDU in AMSDU=%ld\n", RX_GET_CNT(prRxCtrl,
RX_DATA_MSDU_IN_AMSDU_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx AMSDU=%ld\n", RX_GET_CNT(prRxCtrl,
RX_DATA_AMSDU_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx AMSDU miss=%ld\n",
RX_GET_CNT(prRxCtrl, RX_DATA_AMSDU_MISS_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx no StaRec drop=%ld\n",
RX_GET_CNT(prRxCtrl, RX_NO_STA_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx inactive BSS drop=%ld\n",
RX_GET_CNT(prRxCtrl, RX_INACTIVE_BSS_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx HS20 drop=%ld\n",
RX_GET_CNT(prRxCtrl, RX_HS20_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx low SwRfb drop=%ld\n", RX_GET_CNT(prRxCtrl,
RX_LESS_SW_RFB_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx dupicate drop=%ld\n",
RX_GET_CNT(prRxCtrl, RX_DUPICATE_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx MIC err drop=%ld\n",
RX_GET_CNT(prRxCtrl, RX_MIC_ERROR_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx BAR handle=%ld\n",
RX_GET_CNT(prRxCtrl, RX_BAR_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx non-interest drop=%ld\n", RX_GET_CNT(prRxCtrl,
RX_NO_INTEREST_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx type err drop=%ld\n",
RX_GET_CNT(prRxCtrl, RX_TYPE_ERR_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRx class err drop=%ld\n", RX_GET_CNT(prRxCtrl,
RX_CLASS_ERR_DROP_COUNT));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "===Phy/Timing Related Counters===\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tChannelIdleCnt=%d\n",
prHwMibInfo->rHwMibCnt.u4ChannelIdleCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tCCA_NAV_Tx_Time=%d\n",
prHwMibInfo->rHwMibCnt.u4CcaNavTx);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tRx_MDRDY_CNT=%d\n",
prHwMibInfo->rHwMibCnt.u4MdrdyCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tCCK_MDRDY=%d, OFDM_MDRDY=0x%x, OFDM_GREEN_MDRDY=0x%x\n",
prHwMibInfo->rHwMibCnt.u4CCKMdrdyCnt,
prHwMibInfo->rHwMibCnt.u4OFDMLGMixMdrdy,
prHwMibInfo->rHwMibCnt.u4OFDMGreenMdrdy);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tPrim CCA Time=%d\n",
prHwMibInfo->rHwMibCnt.u4PCcaTime);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tSec CCA Time=%d\n",
prHwMibInfo->rHwMibCnt.u4SCcaTime);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tPrim ED Time=%d\n",
prHwMibInfo->rHwMibCnt.u4PEDTime);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s",
"===Tx Related Counters(Generic)===\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tBeaconTxCnt=%d\n",
prHwMibInfo->rHwMibCnt.u4BeaconTxCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tTx 40MHz Cnt=%d\n",
prHwMibInfo->rHwMib2Cnt.u4Tx40MHzCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tTx 80MHz Cnt=%d\n",
prHwMibInfo->rHwMib2Cnt.u4Tx80MHzCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tTx 160MHz Cnt=%d\n",
prHwMibInfo->rHwMib2Cnt.u4Tx160MHzCnt);
for (i = 0; i < BSSID_NUM; i++) {
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\t===BSSID[%d] Related Counters===\n", i);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tBA Miss Cnt=%d\n",
prHwMibInfo->rHwMibCnt.au4BaMissedCnt[i]);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRTS Tx Cnt=%d\n",
prHwMibInfo->rHwMibCnt.au4RtsTxCnt[i]);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tFrame Retry Cnt=%d\n",
prHwMibInfo->rHwMibCnt.au4FrameRetryCnt[i]);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tFrame Retry 2 Cnt=%d\n",
prHwMibInfo->rHwMibCnt.au4FrameRetry2Cnt[i]);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tRTS Retry Cnt=%d\n",
prHwMibInfo->rHwMibCnt.au4RtsRetryCnt[i]);
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tAck Failed Cnt=%d\n",
prHwMibInfo->rHwMibCnt.au4AckFailedCnt[i]);
}
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "===AMPDU Related Counters===\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tTx AMPDU_Pkt_Cnt=%d\n",
prHwMibInfo->rHwTxAmpduMts.u2TxAmpduCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tTx AMPDU_MPDU_Pkt_Cnt=%d\n",
prHwMibInfo->rHwTxAmpduMts.u4TxSfCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\tAMPDU SuccessCnt=%d\n",
prHwMibInfo->rHwTxAmpduMts.u4TxAckSfCnt);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tAMPDU Tx success = %d\n",
prHwMibInfo->rHwTxAmpduMts.u4TxAckSfCnt);
u4Per = prHwMibInfo->rHwTxAmpduMts.u4TxSfCnt == 0 ? 0 :
(1000 * (prHwMibInfo->rHwTxAmpduMts.u4TxSfCnt -
prHwMibInfo->rHwTxAmpduMts.u4TxAckSfCnt)) /
prHwMibInfo->rHwTxAmpduMts.u4TxSfCnt;
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tAMPDU Tx fail count = %d, PER=%d.%1d%%\n",
prHwMibInfo->rHwTxAmpduMts.u4TxSfCnt -
prHwMibInfo->rHwTxAmpduMts.u4TxAckSfCnt,
u4Per/10, u4Per%10);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s", "\tTx Agg\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s",
"\tRange: 1 2~5 6~15 16~22 23~33 34~49 50~57 58~64\n"
);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\t\t%d \t%d \t%d \t%d \t%d \t%d \t%d \t%d\n",
prHwMibInfo->rHwTxAmpduMts.u2TxRange1AmpduCnt,
prHwMibInfo->rHwTxAmpduMts.u2TxRange2AmpduCnt,
prHwMibInfo->rHwTxAmpduMts.u2TxRange3AmpduCnt,
prHwMibInfo->rHwTxAmpduMts.u2TxRange4AmpduCnt,
prHwMibInfo->rHwTxAmpduMts.u2TxRange5AmpduCnt,
prHwMibInfo->rHwTxAmpduMts.u2TxRange6AmpduCnt,
prHwMibInfo->rHwTxAmpduMts.u2TxRange7AmpduCnt,
prHwMibInfo->rHwTxAmpduMts.u2TxRange8AmpduCnt);
} else
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "%s",
"\nClear All Statistics\n");
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
kalMemFree(prHwMibInfo, VIR_MEM_TYPE, sizeof(struct PARAM_HW_MIB_INFO));
nicRxClearStatistics(prGlueInfo->prAdapter);
return i4BytesWritten;
}
static int priv_driver_set_fw_log(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4McuDest = 0;
uint32_t u4LogType = 0;
struct CMD_FW_LOG_2_HOST_CTRL *prFwLog2HostCtrl;
uint32_t u4Ret = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(RSN, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
DBGLOG(RSN, INFO, "MT6632 : priv_driver_set_fw_log\n");
prFwLog2HostCtrl = (struct CMD_FW_LOG_2_HOST_CTRL *)kalMemAlloc(
sizeof(struct CMD_FW_LOG_2_HOST_CTRL), VIR_MEM_TYPE);
if (!prFwLog2HostCtrl)
return -1;
if (i4Argc == 3) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4McuDest);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse u4McuDest error u4Ret=%d\n",
u4Ret);
u4Ret = kalkStrtou32(apcArgv[2], 0, &u4LogType);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse u4LogType error u4Ret=%d\n",
u4Ret);
prFwLog2HostCtrl->ucMcuDest = (uint8_t)u4McuDest;
prFwLog2HostCtrl->ucFwLog2HostCtrl = (uint8_t)u4LogType;
rStatus = kalIoctl(prGlueInfo, wlanoidSetFwLog2Host,
prFwLog2HostCtrl,
sizeof(struct CMD_FW_LOG_2_HOST_CTRL),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, INFO, "%s: command result is %s (%d %d)\n",
__func__, pcCommand, u4McuDest, u4LogType);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS) {
kalMemFree(prFwLog2HostCtrl, VIR_MEM_TYPE,
sizeof(struct CMD_FW_LOG_2_HOST_CTRL));
return -1;
}
} else {
DBGLOG(REQ, ERROR, "argc %i is not equal to 3\n", i4Argc);
i4BytesWritten = -1;
}
kalMemFree(prFwLog2HostCtrl, VIR_MEM_TYPE,
sizeof(struct CMD_FW_LOG_2_HOST_CTRL));
return i4BytesWritten;
}
#endif
static int priv_driver_get_mcr(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret;
int32_t i4ArgNum = 2;
struct CMD_ACCESS_REG rCmdAccessReg;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rCmdAccessReg.u4Address));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_mcr error (Address) u4Ret=%d\n",
u4Ret);
/* rCmdAccessReg.u4Address = kalStrtoul(apcArgv[1], NULL, 0); */
rCmdAccessReg.u4Data = 0;
DBGLOG(REQ, LOUD, "address is %x\n", rCmdAccessReg.u4Address);
rStatus = kalIoctl(prGlueInfo, wlanoidQueryMcrRead,
&rCmdAccessReg, sizeof(rCmdAccessReg),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "0x%08x",
(unsigned int)rCmdAccessReg.u4Data);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__,
pcCommand);
}
return i4BytesWritten;
} /* priv_driver_get_mcr */
static int priv_driver_get_dongle_type(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct mt66xx_chip_info *prChipInfo = NULL;
int32_t i4BytesWritten = 0;
if (prNetDev == NULL) {
DBGLOG(REQ, ERROR, " prNetDev is NULL\n");
return -1;
}
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE) {
DBGLOG(REQ, ERROR, " prNetDev is NULL\n");
return -1;
}
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
prGlueInfo = *((struct GLUE_INFO **)
netdev_priv(prNetDev));
if (prGlueInfo == NULL) {
DBGLOG(REQ, ERROR, " prGlueInfo is NULL\n");
return -1;
}
prAdapter = prGlueInfo->prAdapter;
if (prAdapter == NULL) {
DBGLOG(REQ, ERROR, " prAdapter is NULL\n");
return -1;
}
prChipInfo = prAdapter->chip_info;
if (prChipInfo == NULL) {
DBGLOG(REQ, ERROR, " prChipInfo is NULL\n");
return -1;
}
if (prChipInfo->getDongleType) {
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "0x%08x",
(unsigned int)prChipInfo->getDongleType(prAdapter));
} else {
DBGLOG(REQ, ERROR, " This chip not support get chip type.\n");
return -1;
}
DBGLOG(REQ, INFO, "command result is %s\n", pcCommand);
return i4BytesWritten;
}
int priv_driver_set_mcr(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret;
int32_t i4ArgNum = 3;
struct CMD_ACCESS_REG rCmdAccessReg;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rCmdAccessReg.u4Address));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_mcr error (Address) u4Ret=%d\n",
u4Ret);
u4Ret = kalkStrtou32(apcArgv[2], 0, &(rCmdAccessReg.u4Data));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_mcr error (Data) u4Ret=%d\n", u4Ret);
/* rCmdAccessReg.u4Address = kalStrtoul(apcArgv[1], NULL, 0); */
/* rCmdAccessReg.u4Data = kalStrtoul(apcArgv[2], NULL, 0); */
rStatus = kalIoctl(prGlueInfo, wlanoidSetMcrWrite,
&rCmdAccessReg, sizeof(rCmdAccessReg),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
return i4BytesWritten;
}
static int priv_driver_set_test_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret;
int32_t i4ArgNum = 2, u4MagicKey;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &(u4MagicKey));
if (u4Ret)
DBGLOG(REQ, LOUD, "parse Magic Key error u4Ret=%d\n",
u4Ret);
DBGLOG(REQ, LOUD, "The Set Test Mode Magic Key is %d\n",
u4MagicKey);
if (u4MagicKey == PRIV_CMD_TEST_MAGIC_KEY) {
rStatus = kalIoctl(prGlueInfo,
wlanoidRftestSetTestMode,
NULL, 0, FALSE, FALSE, TRUE,
&u4BufLen);
} else if (u4MagicKey == 0) {
rStatus = kalIoctl(prGlueInfo,
wlanoidRftestSetAbortTestMode,
NULL, 0, FALSE, FALSE, TRUE,
&u4BufLen);
}
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
return i4BytesWritten;
} /* priv_driver_set_test_mode */
static int priv_driver_set_test_cmd(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret;
int32_t i4ArgNum = 3;
struct PARAM_MTK_WIFI_TEST_STRUCT rRfATInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rRfATInfo.u4FuncIndex));
if (u4Ret)
DBGLOG(REQ, LOUD,
"Parse Test CMD Index error u4Ret=%d\n", u4Ret);
u4Ret = kalkStrtou32(apcArgv[2], 0, &(rRfATInfo.u4FuncData));
if (u4Ret)
DBGLOG(REQ, LOUD,
"Parse Test CMD Data error u4Ret=%d\n", u4Ret);
DBGLOG(REQ, LOUD,
"Set Test CMD FuncIndex = %d, FuncData = %d\n",
rRfATInfo.u4FuncIndex, rRfATInfo.u4FuncData);
rStatus = kalIoctl(prGlueInfo, wlanoidRftestSetAutoTest,
&rRfATInfo, sizeof(rRfATInfo),
FALSE, FALSE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
return i4BytesWritten;
} /* priv_driver_set_test_cmd */
static int priv_driver_get_test_result(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret;
uint32_t u4Data = 0;
int32_t i4ArgNum = 3;
struct PARAM_MTK_WIFI_TEST_STRUCT rRfATInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rRfATInfo.u4FuncIndex));
if (u4Ret)
DBGLOG(REQ, LOUD,
"Parse Test CMD Index error u4Ret=%d\n", u4Ret);
u4Ret = kalkStrtou32(apcArgv[2], 0, &(rRfATInfo.u4FuncData));
if (u4Ret)
DBGLOG(REQ, LOUD,
"Parse Test CMD Data error u4Ret=%d\n",
u4Ret);
DBGLOG(REQ, LOUD,
"Get Test CMD FuncIndex = %d, FuncData = %d\n",
rRfATInfo.u4FuncIndex, rRfATInfo.u4FuncData);
rStatus = kalIoctl(prGlueInfo, wlanoidRftestQueryAutoTest,
&rRfATInfo, sizeof(rRfATInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
u4Data = (unsigned int)rRfATInfo.u4FuncData;
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%d[0x%08x]",
u4Data, u4Data);
DBGLOG(REQ, INFO, "command result is %s\n", pcCommand);
}
return i4BytesWritten;
} /* priv_driver_get_test_result */
int32_t priv_driver_tx_rate_info(IN char *pcCommand, IN int i4TotalLen,
u_int8_t fgDumpAll,
struct PARAM_HW_WLAN_INFO *prHwWlanInfo,
struct PARAM_GET_STA_STATISTICS *prQueryStaStatistics)
{
uint8_t i, txmode, rate, stbc;
uint8_t nsts;
int32_t i4BytesWritten = 0;
for (i = 0; i < AUTO_RATE_NUM; i++) {
txmode = HW_TX_RATE_TO_MODE(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i]);
if (txmode >= MAX_TX_MODE)
txmode = MAX_TX_MODE;
rate = HW_TX_RATE_TO_MCS(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i], txmode);
nsts = HW_TX_RATE_TO_NSS(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i]) + 1;
stbc = HW_TX_RATE_TO_STBC(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i]);
if (fgDumpAll) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Rate index - %d ", i);
if (prHwWlanInfo->rWtblRateInfo.ucRateIdx == i) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "--> ");
} else {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", " ");
}
}
if (!fgDumpAll) {
if (prHwWlanInfo->rWtblRateInfo.ucRateIdx != i)
continue;
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s", "Auto TX Rate", " = ");
}
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", HW_TX_RATE_CCK_STR[rate & 0x3]);
else if (txmode == TX_RATE_MODE_OFDM)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", hw_rate_ofdm_str(rate));
else if ((txmode == TX_RATE_MODE_HTMIX) ||
(txmode == TX_RATE_MODE_HTGF))
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"MCS%d, ", rate);
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"NSS%d_MCS%d, ", nsts, rate);
if (prQueryStaStatistics->ucSkipAr) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
prHwWlanInfo->rWtblPeerCap.ucFrequencyCapability
< 4 ? HW_TX_RATE_BW[
prHwWlanInfo->rWtblPeerCap.ucFrequencyCapability]
: HW_TX_RATE_BW[4]);
} else {
if ((txmode == TX_RATE_MODE_CCK) ||
(txmode == TX_RATE_MODE_OFDM))
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", HW_TX_RATE_BW[0]);
else
if (i > prHwWlanInfo->rWtblPeerCap
.ucChangeBWAfterRateN)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
prHwWlanInfo->rWtblPeerCap.
ucFrequencyCapability < 4 ?
(prHwWlanInfo->rWtblPeerCap.
ucFrequencyCapability > BW_20 ?
HW_TX_RATE_BW[prHwWlanInfo->
rWtblPeerCap
.ucFrequencyCapability - 1] :
HW_TX_RATE_BW[prHwWlanInfo->rWtblPeerCap
.ucFrequencyCapability]) :
HW_TX_RATE_BW[4]);
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ",
prHwWlanInfo->rWtblPeerCap.
ucFrequencyCapability < 4 ?
HW_TX_RATE_BW[
prHwWlanInfo->rWtblPeerCap
.ucFrequencyCapability] :
HW_TX_RATE_BW[4]);
}
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", rate < 4 ? "LP" : "SP");
else if (txmode == TX_RATE_MODE_OFDM)
;
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ",
priv_driver_get_sgi_info(
&prHwWlanInfo->rWtblPeerCap) == 0 ?
"LGI" : "SGI");
if (prQueryStaStatistics->ucSkipAr) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s%s%s\n",
txmode < 5 ?
HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[5],
stbc ? ", STBC, " : ", ",
priv_driver_get_ldpc_info(
&prHwWlanInfo->rWtblTxConfig) == 0 ?
"BCC" : "LDPC");
} else {
#if (CFG_SUPPORT_RA_GEN == 0)
if (prQueryStaStatistics->aucArRatePer[
prQueryStaStatistics->aucRateEntryIndex[i]] == 0xFF)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s%s%s (--)\n",
txmode < 5 ?
HW_TX_MODE_STR[txmode] :
HW_TX_MODE_STR[5],
stbc ? ", STBC, " : ", ",
((priv_driver_get_ldpc_info(
&prHwWlanInfo->rWtblTxConfig) == 0)
|| (txmode == TX_RATE_MODE_CCK)
|| (txmode == TX_RATE_MODE_OFDM)) ?
"BCC" : "LDPC");
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s%s%s (%d)\n",
txmode < 5 ?
HW_TX_MODE_STR[txmode] :
HW_TX_MODE_STR[5],
stbc ? ", STBC, " : ", ",
((priv_driver_get_ldpc_info(
&prHwWlanInfo->rWtblTxConfig) == 0)
|| (txmode == TX_RATE_MODE_CCK)
|| (txmode == TX_RATE_MODE_OFDM))
? "BCC" : "LDPC",
prQueryStaStatistics->aucArRatePer[
prQueryStaStatistics
->aucRateEntryIndex[i]]);
#else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s%s%s\n",
txmode < 5 ?
HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[5],
stbc ? ", STBC, " : ", ",
((priv_driver_get_ldpc_info(
&prHwWlanInfo->rWtblTxConfig) == 0) ||
(txmode == TX_RATE_MODE_CCK) ||
(txmode == TX_RATE_MODE_OFDM)) ?
"BCC" : "LDPC");
#endif
}
if (!fgDumpAll)
break;
}
return i4BytesWritten;
}
int32_t priv_driver_last_rx_rssi(struct ADAPTER *prAdapter, IN char *pcCommand,
IN int i4TotalLen, IN uint8_t ucWlanIdx)
{
int32_t i4RSSI0 = 0, i4RSSI1 = 0, i4RSSI2 = 0, i4RSSI3 = 0;
int32_t i4BytesWritten = 0;
uint32_t u4RxVector3 = 0;
uint8_t ucStaIdx;
if (wlanGetStaIdxByWlanIdx(prAdapter, ucWlanIdx, &ucStaIdx) ==
WLAN_STATUS_SUCCESS) {
u4RxVector3 = prAdapter->arStaRec[ucStaIdx].u4RxVector3;
DBGLOG(REQ, LOUD, "****** RX Vector3 = 0x%08x ******\n",
u4RxVector3);
} else {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s", "Last RX RSSI", " = NOT SUPPORT");
return i4BytesWritten;
}
i4RSSI0 = RCPI_TO_dBm((u4RxVector3 & RX_VT_RCPI0_MASK) >>
RX_VT_RCPI0_OFFSET);
i4RSSI1 = RCPI_TO_dBm((u4RxVector3 & RX_VT_RCPI1_MASK) >>
RX_VT_RCPI1_OFFSET);
if (prAdapter->rWifiVar.ucNSS > 2) {
i4RSSI2 = RCPI_TO_dBm((u4RxVector3 & RX_VT_RCPI2_MASK) >>
RX_VT_RCPI2_OFFSET);
i4RSSI3 = RCPI_TO_dBm((u4RxVector3 & RX_VT_RCPI3_MASK) >>
RX_VT_RCPI3_OFFSET);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%-20s%s%d %d %d %d\n",
"Last RX Data RSSI", " = ",
i4RSSI0, i4RSSI1, i4RSSI2, i4RSSI3);
} else
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%-20s%s%d %d\n",
"Last RX Data RSSI", " = ", i4RSSI0, i4RSSI1);
return i4BytesWritten;
}
#if CFG_SUPPORT_ADVANCE_CONTROL
static int32_t priv_driver_get_snr(IN struct GLUE_INFO *prGlueInfo,
IN char *pcCommand, IN int i4TotalLen)
{
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
int32_t i4BytesWritten = 0;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int8_t iSnrR0Phase1 = 0, iSnrR1Phase1 = 0;
int8_t iSnrR0Phase2 = 0, iSnrR1Phase2 = 0;
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_SNR_ID;
rStatus = kalIoctl(prGlueInfo, wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(HAL, ERROR, "CMD_ADVCTL_SNR_ID rStatus %u\n", rStatus);
return -1;
}
iSnrR1Phase2 = rSwCtrlInfo.u4Data & 0xFF;
iSnrR0Phase2 = (rSwCtrlInfo.u4Data >> 8) & 0xFF;
iSnrR1Phase1 = (rSwCtrlInfo.u4Data >> 16) & 0xFF;
iSnrR0Phase1 = (rSwCtrlInfo.u4Data >> 24) & 0xFF;
i4BytesWritten +=
kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s %-d %-d\n", "SNR", " = ",
iSnrR0Phase2, iSnrR1Phase2);
DBGLOG(HAL, INFO, "SNR: R0P1:0x%02x R1P1:0x%02x\n",
iSnrR0Phase1, iSnrR1Phase1);
DBGLOG(HAL, INFO, "SNR: R0P2:0x%02x R1P2:0x%02x u4Data:0x%08x\n",
iSnrR0Phase2, iSnrR1Phase2, rSwCtrlInfo.u4Data);
return i4BytesWritten;
}
#endif
int32_t priv_driver_rx_rate_info(struct ADAPTER *prAdapter, IN char *pcCommand,
IN int i4TotalLen, IN uint8_t ucWlanIdx)
{
uint32_t txmode, rate, frmode, sgi, nsts, ldpc, stbc, groupid, mu;
int32_t i4BytesWritten = 0;
uint32_t u4RxVector0 = 0, u4RxVector1 = 0;
uint8_t ucStaIdx;
if (wlanGetStaIdxByWlanIdx(prAdapter, ucWlanIdx, &ucStaIdx) ==
WLAN_STATUS_SUCCESS) {
u4RxVector0 = prAdapter->arStaRec[ucStaIdx].u4RxVector0;
u4RxVector1 = prAdapter->arStaRec[ucStaIdx].u4RxVector1;
DBGLOG(REQ, LOUD, "****** RX Vector0 = 0x%08x ******\n",
u4RxVector0);
DBGLOG(REQ, LOUD, "****** RX Vector1 = 0x%08x ******\n",
u4RxVector1);
} else {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s", "Last RX Rate", " = NOT SUPPORT");
return i4BytesWritten;
}
txmode = (u4RxVector0 & RX_VT_RX_MODE_MASK) >> RX_VT_RX_MODE_OFFSET;
rate = (u4RxVector0 & RX_VT_RX_RATE_MASK) >> RX_VT_RX_RATE_OFFSET;
frmode = (u4RxVector0 & RX_VT_FR_MODE_MASK) >> RX_VT_FR_MODE_OFFSET;
nsts = ((u4RxVector1 & RX_VT_NSTS_MASK) >> RX_VT_NSTS_OFFSET);
stbc = (u4RxVector0 & RX_VT_STBC_MASK) >> RX_VT_STBC_OFFSET;
sgi = u4RxVector0 & RX_VT_SHORT_GI;
ldpc = u4RxVector0 & RX_VT_LDPC;
groupid = (u4RxVector1 & RX_VT_GROUP_ID_MASK) >> RX_VT_GROUP_ID_OFFSET;
if (groupid && groupid != 63) {
mu = 1;
} else {
mu = 0;
nsts += 1;
}
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%-20s%s", "Last RX Rate", " = ");
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
rate < 4 ? HW_TX_RATE_CCK_STR[rate] :
HW_TX_RATE_CCK_STR[4]);
else if (txmode == TX_RATE_MODE_OFDM)
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
hw_rate_ofdm_str(rate));
else if ((txmode == TX_RATE_MODE_HTMIX) ||
(txmode == TX_RATE_MODE_HTGF))
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "MCS%d, ", rate);
else
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "NSS%d_MCS%d, ",
nsts, rate);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
frmode < 4 ? HW_TX_RATE_BW[frmode] : HW_TX_RATE_BW[4]);
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
rate < 4 ? "LP" : "SP");
else if (txmode == TX_RATE_MODE_OFDM)
;
else
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
sgi == 0 ? "LGI" : "SGI");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s", stbc == 0 ? "" : "STBC, ");
if (mu) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, %s, %s (%d)\n",
txmode < 5 ? HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[5],
ldpc == 0 ? "BCC" : "LDPC", "MU", groupid);
} else {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, %s\n",
txmode < 5 ? HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[5],
ldpc == 0 ? "BCC" : "LDPC");
}
return i4BytesWritten;
}
int32_t priv_driver_tx_vector_info(IN char *pcCommand, IN int i4TotalLen,
IN struct TX_VECTOR_BBP_LATCH *prTxV)
{
uint8_t rate, txmode, frmode, sgi, ldpc, nsts, stbc;
int8_t txpwr;
int32_t i4BytesWritten = 0;
rate = TX_VECTOR_GET_TX_RATE(prTxV);
txmode = TX_VECTOR_GET_TX_MODE(prTxV);
frmode = TX_VECTOR_GET_TX_FRMODE(prTxV);
nsts = TX_VECTOR_GET_TX_NSTS(prTxV) + 1;
sgi = TX_VECTOR_GET_TX_SGI(prTxV);
ldpc = TX_VECTOR_GET_TX_LDPC(prTxV);
stbc = TX_VECTOR_GET_TX_STBC(prTxV);
txpwr = TX_VECTOR_GET_TX_PWR(prTxV);
if (prTxV->u4TxVector1 == 0xFFFFFFFF) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Last TX Rate", " = ", "N/A");
} else {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s", "Last TX Rate", " = ");
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", rate < 4 ? HW_TX_RATE_CCK_STR[rate] :
HW_TX_RATE_CCK_STR[4]);
else if (txmode == TX_RATE_MODE_OFDM)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", hw_rate_ofdm_str(rate));
else if ((txmode == TX_RATE_MODE_HTMIX) ||
(txmode == TX_RATE_MODE_HTGF))
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"MCS%d, ", rate);
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"NSS%d_MCS%d, ", nsts, rate);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
frmode < 4 ? HW_TX_RATE_BW[frmode] : HW_TX_RATE_BW[4]);
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", rate < 4 ? "LP" : "SP");
else if (txmode == TX_RATE_MODE_OFDM)
;
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", sgi == 0 ? "LGI" : "SGI");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s%s%s\n",
txmode < 5 ? HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[5],
stbc ? ", STBC, " : ", ", ldpc == 0 ? "BCC" : "LDPC");
}
return i4BytesWritten;
}
uint16_t priv_driver_get_idx_info(IN struct ADAPTER *prAdapter,
IN uint8_t ucWlanIdx)
{
static uint8_t aucWlanIdxArray[CFG_STAT_DBG_PEER_NUM] = {0};
static uint16_t u2ValidBitMask; /* support max 16 peers */
uint8_t ucIdx, ucStaIdx, ucCnt = 0;
uint8_t ucWlanIdxExist;
/* check every wlanIdx and unmask no longer used wlanIdx */
for (ucIdx = 0; ucIdx < CFG_STAT_DBG_PEER_NUM; ucIdx++) {
if (u2ValidBitMask & BIT(ucIdx)) {
ucWlanIdxExist = aucWlanIdxArray[ucIdx];
if (wlanGetStaIdxByWlanIdx(prAdapter, ucWlanIdxExist,
&ucStaIdx) != WLAN_STATUS_SUCCESS)
u2ValidBitMask &= ~BIT(ucIdx);
}
}
/* Search matched WlanIdx */
for (ucIdx = 0; ucIdx < CFG_STAT_DBG_PEER_NUM; ucIdx++) {
if (u2ValidBitMask & BIT(ucIdx)) {
ucCnt++;
ucWlanIdxExist = aucWlanIdxArray[ucIdx];
if (ucWlanIdxExist == ucWlanIdx) {
DBGLOG(REQ, INFO,
"=== Matched, Mask=0x%x, ucIdx=%d ===\n",
u2ValidBitMask, ucIdx);
return ucIdx;
}
}
}
/* No matched WlanIdx, add new one */
if (ucCnt < CFG_STAT_DBG_PEER_NUM) {
for (ucIdx = 0; ucIdx < CFG_STAT_DBG_PEER_NUM; ucIdx++) {
if (~u2ValidBitMask & BIT(ucIdx)) {
u2ValidBitMask |= BIT(ucIdx);
aucWlanIdxArray[ucIdx] = ucWlanIdx;
DBGLOG(REQ, INFO,
"=== New Add, Mask=0x%x, ucIdx=%d ===\n",
u2ValidBitMask, ucIdx);
return ucIdx;
}
}
}
return 0xFFFF;
}
#if (CFG_SUPPORT_RA_GEN == 0)
static int32_t priv_driver_dump_stat_info(struct ADAPTER *prAdapter,
IN char *pcCommand, IN int i4TotalLen,
struct PARAM_HW_WLAN_INFO *prHwWlanInfo,
struct PARAM_GET_STA_STATISTICS *prQueryStaStatistics,
u_int8_t fgResetCnt, uint32_t u4StatGroup)
{
int32_t i4BytesWritten = 0;
int32_t rRssi;
uint16_t u2LinkSpeed;
uint32_t u4Per, u4RxPer[ENUM_BAND_NUM], u4AmpduPer[ENUM_BAND_NUM],
u4InstantPer;
uint8_t ucDbdcIdx, ucStaIdx, ucNss;
uint8_t ucSkipAr;
static uint32_t u4TotalTxCnt, u4TotalFailCnt;
static uint32_t u4Rate1TxCnt, u4Rate1FailCnt;
static uint32_t au4RxMpduCnt[ENUM_BAND_NUM] = {0};
static uint32_t au4FcsError[ENUM_BAND_NUM] = {0};
static uint32_t au4RxFifoCnt[ENUM_BAND_NUM] = {0};
static uint32_t au4AmpduTxSfCnt[ENUM_BAND_NUM] = {0};
static uint32_t au4AmpduTxAckSfCnt[ENUM_BAND_NUM] = {0};
struct RX_CTRL *prRxCtrl;
uint32_t u4InstantRxPer[ENUM_BAND_NUM];
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
int16_t i2Wf0AvgPwr;
int16_t i2Wf1AvgPwr;
uint32_t u4BufLen = 0;
ucSkipAr = prQueryStaStatistics->ucSkipAr;
prRxCtrl = &prAdapter->rRxCtrl;
ucNss = prAdapter->rWifiVar.ucNSS;
if (ucSkipAr) {
u4TotalTxCnt += prHwWlanInfo->rWtblTxCounter.u2CurBwTxCnt +
prHwWlanInfo->rWtblTxCounter.u2OtherBwTxCnt;
u4TotalFailCnt += prHwWlanInfo->rWtblTxCounter.u2CurBwFailCnt +
prHwWlanInfo->rWtblTxCounter.u2OtherBwFailCnt;
u4Rate1TxCnt += prHwWlanInfo->rWtblTxCounter.u2Rate1TxCnt;
u4Rate1FailCnt += prHwWlanInfo->rWtblTxCounter.u2Rate1FailCnt;
}
if (ucSkipAr) {
u4Per = (prHwWlanInfo->rWtblTxCounter.u2Rate1TxCnt == 0) ?
(0) : (1000 * u4Rate1FailCnt / u4Rate1TxCnt);
u4InstantPer =
(prHwWlanInfo->rWtblTxCounter.u2Rate1TxCnt == 0) ? (0) :
(1000 * (prHwWlanInfo->rWtblTxCounter.u2Rate1FailCnt) /
(prHwWlanInfo->rWtblTxCounter.u2Rate1TxCnt));
} else {
u4Per = (prQueryStaStatistics->u4Rate1TxCnt == 0) ?
(0) : (1000 * (prQueryStaStatistics->u4Rate1FailCnt) /
(prQueryStaStatistics->u4Rate1TxCnt));
u4InstantPer = (prQueryStaStatistics->ucPer == 0) ?
(0) : (prQueryStaStatistics->ucPer);
}
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM; ucDbdcIdx++) {
au4RxMpduCnt[ucDbdcIdx] +=
prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4RxMpduCnt;
au4FcsError[ucDbdcIdx] +=
prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4FcsError;
au4RxFifoCnt[ucDbdcIdx] +=
prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4RxFifoFull;
au4AmpduTxSfCnt[ucDbdcIdx] +=
prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4AmpduTxSfCnt;
au4AmpduTxAckSfCnt[ucDbdcIdx] +=
prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4AmpduTxAckSfCnt;
u4RxPer[ucDbdcIdx] = ((au4RxMpduCnt[ucDbdcIdx] +
au4FcsError[ucDbdcIdx]) == 0) ? (0) :
(1000 * au4FcsError[ucDbdcIdx] /
(au4RxMpduCnt[ucDbdcIdx] + au4FcsError[ucDbdcIdx]));
u4AmpduPer[ucDbdcIdx] =
(au4AmpduTxSfCnt[ucDbdcIdx] == 0) ? (0) :
(1000 * (au4AmpduTxSfCnt[ucDbdcIdx] -
au4AmpduTxAckSfCnt[ucDbdcIdx]) /
au4AmpduTxSfCnt[ucDbdcIdx]);
u4InstantRxPer[ucDbdcIdx] =
((prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4RxMpduCnt +
prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4FcsError) == 0)
? (0) :
(1000 * prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4FcsError
/ (prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4RxMpduCnt +
prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4FcsError));
}
/* get Beacon RSSI */
rStatus = kalIoctl(prAdapter->prGlueInfo, wlanoidQueryRssi, &rRssi,
sizeof(rRssi), TRUE, FALSE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
DBGLOG(REQ, WARN, "unable to retrieve rssi\n");
u2LinkSpeed = (prQueryStaStatistics->u2LinkSpeed == 0) ?
0 : prQueryStaStatistics->u2LinkSpeed / 2;
/* =========== Group 0x0001 =========== */
if (u4StatGroup & 0x0001) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n----- STA Stat (Group 0x01) -----\n");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CurrTemperature", " = ",
prQueryStaStatistics->ucTemperature);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Tx Total cnt", " = ",
ucSkipAr ? (u4TotalTxCnt) :
(prQueryStaStatistics->u4TransmitCount));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Tx Fail Cnt", " = ",
ucSkipAr ? (u4TotalFailCnt) :
(prQueryStaStatistics->u4TransmitFailCount));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Rate1 Tx Cnt", " = ",
ucSkipAr ? (u4Rate1TxCnt) :
(prQueryStaStatistics->u4Rate1TxCnt));
if (ucSkipAr)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d, PER = %d.%1d%%, instant PER = %d.%1d%%\n",
"Rate1 Fail Cnt", " = ",
u4Rate1FailCnt, u4Per/10, u4Per%10,
u4InstantPer/10, u4InstantPer%10);
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d, PER = %d.%1d%%, instant PER = %d%%\n",
"Rate1 Fail Cnt", " = ",
prQueryStaStatistics->u4Rate1FailCnt,
u4Per/10, u4Per%10, u4InstantPer);
if ((ucSkipAr) && (fgResetCnt)) {
u4TotalTxCnt = 0;
u4TotalFailCnt = 0;
u4Rate1TxCnt = 0;
u4Rate1FailCnt = 0;
}
}
/* =========== Group 0x0002 =========== */
if (u4StatGroup & 0x0002) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- MIB Info (Group 0x02) -----\n");
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM; ucDbdcIdx++) {
if (prAdapter->rWifiVar.fgDbDcModeEn)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"[DBDC_%d] :\n", ucDbdcIdx);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "RX Success", " = ",
au4RxMpduCnt[ucDbdcIdx]);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d, PER = %d.%1d%%, instant PER = %d.%1d%%\n",
"RX with CRC", " = ",
au4FcsError[ucDbdcIdx], u4RxPer[ucDbdcIdx]/10,
u4RxPer[ucDbdcIdx] % 10,
u4InstantRxPer[ucDbdcIdx] / 10,
u4InstantRxPer[ucDbdcIdx]%10);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "RX drop FIFO full", " = ",
au4RxFifoCnt[ucDbdcIdx]);
if (!prAdapter->rWifiVar.fgDbDcModeEn)
break;
}
if (fgResetCnt) {
kalMemZero(au4RxMpduCnt, sizeof(au4RxMpduCnt));
kalMemZero(au4FcsError, sizeof(au4RxMpduCnt));
kalMemZero(au4RxFifoCnt, sizeof(au4RxMpduCnt));
kalMemZero(au4AmpduTxSfCnt, sizeof(au4RxMpduCnt));
kalMemZero(au4AmpduTxAckSfCnt, sizeof(au4RxMpduCnt));
}
}
/* =========== Group 0x0004 =========== */
if (u4StatGroup & 0x0004) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- Last Rx Info (Group 0x04) -----\n");
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + 1;
rStatus = kalIoctl(prAdapter->prGlueInfo,
wlanoidQuerySwCtrlRead, &rSwCtrlInfo,
sizeof(rSwCtrlInfo), TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u, rSwCtrlInfo.u4Data 0x%x\n",
rStatus, rSwCtrlInfo.u4Data);
if (rStatus == WLAN_STATUS_SUCCESS) {
i2Wf0AvgPwr = rSwCtrlInfo.u4Data & 0xFFFF;
i2Wf1AvgPwr = (rSwCtrlInfo.u4Data >> 16) & 0xFFFF;
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d %d\n", "NOISE", " = ",
i2Wf0AvgPwr, i2Wf1AvgPwr);
}
/* Last RX Rate */
i4BytesWritten += priv_driver_rx_rate_info(prAdapter,
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
(uint8_t)(prHwWlanInfo->u4Index));
#if CFG_SUPPORT_ADVANCE_CONTROL
/* Last RX SNR */
i4BytesWritten += priv_driver_get_snr(prAdapter->prGlueInfo,
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten);
#endif
/* Last RX RSSI */
i4BytesWritten += priv_driver_last_rx_rssi(prAdapter,
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
(uint8_t)(prHwWlanInfo->u4Index));
/* Last TX Resp RSSI */
if (ucNss > 2)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d %d %d %d\n", "Tx Response RSSI",
" = ",
RCPI_TO_dBm(prHwWlanInfo->
rWtblRxCounter.ucRxRcpi0),
RCPI_TO_dBm(prHwWlanInfo->
rWtblRxCounter.ucRxRcpi1),
RCPI_TO_dBm(prHwWlanInfo->
rWtblRxCounter.ucRxRcpi2),
RCPI_TO_dBm(prHwWlanInfo->
rWtblRxCounter.ucRxRcpi3));
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d %d\n", "Tx Response RSSI", " = ",
RCPI_TO_dBm(
prHwWlanInfo->rWtblRxCounter.ucRxRcpi0),
RCPI_TO_dBm(
prHwWlanInfo->rWtblRxCounter.ucRxRcpi1));
/* Last Beacon RSSI */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Beacon RSSI", " = ", rRssi);
}
/* =========== Group 0x0008 =========== */
if (u4StatGroup & 0x0008) {
/* TxV */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- Last TX Info (Group 0x08) -----\n");
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM; ucDbdcIdx++) {
int8_t txpwr;
txpwr = TX_VECTOR_GET_TX_PWR(
&prQueryStaStatistics->rTxVector[ucDbdcIdx]);
if (prAdapter->rWifiVar.fgDbDcModeEn)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"[DBDC_%d] :\n", ucDbdcIdx);
i4BytesWritten += priv_driver_tx_vector_info(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
&prQueryStaStatistics->rTxVector[ucDbdcIdx]);
if (prQueryStaStatistics->
rTxVector[ucDbdcIdx].u4TxVector1 == 0xFFFFFFFF)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Chip Out TX Power",
" = ", "N/A");
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%c%d.%1d dBm\n",
"Chip Out TX Power", " = ",
(txpwr < 0) ? '-' : '+',
abs(txpwr / 2),
5 * abs(txpwr % 2));
if (!prAdapter->rWifiVar.fgDbDcModeEn)
break;
}
}
/* =========== Group 0x0010 =========== */
if (u4StatGroup & 0x0010) {
/* RX Reorder */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- RX Reorder (Group 0x10) -----\n");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%ld\n", "Rx reorder miss", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_MISS_COUNT));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%ld\n", "Rx reorder within", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_WITHIN_COUNT));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%ld\n", "Rx reorder ahead", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_AHEAD_COUNT));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%ld\n", "Rx reorder behind", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_BEHIND_COUNT));
#if CFG_SUPPORT_RX_DYNAMIC_MCC_PRIORITY
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Rx reorder STA", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_WITHIN_COUNT_STA));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Rx reorder P2P", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_WITHIN_COUNT_P2P));
#endif
}
/* =========== Group 0x0020 =========== */
if (u4StatGroup & 0x0020) {
/* AR info */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- AR Info (Group 0x20) -----\n");
/* Last TX Rate */
i4BytesWritten += priv_driver_tx_rate_info(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, FALSE,
prHwWlanInfo, prQueryStaStatistics);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "LinkSpeed", " = ", u2LinkSpeed);
if (!prQueryStaStatistics->ucSkipAr) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "RateTable", " = ",
prQueryStaStatistics->ucArTableIdx < 6 ?
RATE_TBLE[
prQueryStaStatistics->ucArTableIdx] :
RATE_TBLE[6]);
if (wlanGetStaIdxByWlanIdx(prAdapter,
(uint8_t)(prHwWlanInfo->u4Index), &ucStaIdx) ==
WLAN_STATUS_SUCCESS){
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "2G Support 256QAM TX",
" = ",
(prAdapter->arStaRec[ucStaIdx].u4Flags &
MTK_SYNERGY_CAP_SUPPORT_24G_MCS89) ?
1 : 0);
}
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d%%\n", "Rate1 instantPer", " = ",
u4InstantPer);
if (prQueryStaStatistics->ucAvePer == 0xFF) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Train Down", " = ",
"N/A");
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Train Up", " = ",
"N/A");
} else {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d -> %hd\n", "Train Down",
" = ",
(uint16_t)((prQueryStaStatistics
->u2TrainDown) & BITS(0, 7)),
(uint16_t)(((prQueryStaStatistics
->u2TrainDown) >> 8) & BITS(0, 7)));
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d -> %hd\n", "Train Up", " = ",
(uint16_t)((prQueryStaStatistics->
u2TrainUp) & BITS(0, 7)),
(uint16_t)(((prQueryStaStatistics->
u2TrainUp) >> 8) & BITS(0, 7)));
}
if (prQueryStaStatistics->fgIsForceTxStream == 0)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Force Tx Stream", " = ",
"N/A");
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Force Tx Stream", " = ",
prQueryStaStatistics->fgIsForceTxStream);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Force SE off", " = ",
prQueryStaStatistics->fgIsForceSeOff);
}
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CBRN", " = ",
prHwWlanInfo->rWtblPeerCap.ucChangeBWAfterRateN);
/* Rate1~Rate8 */
i4BytesWritten += priv_driver_tx_rate_info(
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
TRUE, prHwWlanInfo, prQueryStaStatistics);
}
/* =========== Group 0x0040 =========== */
if (u4StatGroup & 0x0040) {
/* Tx Agg */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "------ TX AGG (Group 0x40) -----\n");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-12s%s", "Range:",
"1 2~5 6~15 16~22 23~33 34~49 50~57 58~64\n");
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM; ucDbdcIdx++) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"DBDC%d:", ucDbdcIdx);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%7d%8d%9d%9d%9d%9d%9d%9d\n",
prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u2TxRange1AmpduCnt,
prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u2TxRange2AmpduCnt,
prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u2TxRange3AmpduCnt,
prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u2TxRange4AmpduCnt,
prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u2TxRange5AmpduCnt,
prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u2TxRange6AmpduCnt,
prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u2TxRange7AmpduCnt,
prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u2TxRange8AmpduCnt);
if (!prAdapter->rWifiVar.fgDbDcModeEn)
break;
}
}
return i4BytesWritten;
}
#else
static int32_t priv_driver_dump_stat_info(struct ADAPTER *prAdapter,
IN char *pcCommand, IN int i4TotalLen,
struct PARAM_HW_WLAN_INFO *prHwWlanInfo,
struct PARAM_GET_STA_STATISTICS *prQueryStaStatistics,
u_int8_t fgResetCnt, uint32_t u4StatGroup)
{
int32_t i4BytesWritten = 0;
int32_t rRssi;
uint16_t u2LinkSpeed;
uint32_t u4Per, u4RxPer[ENUM_BAND_NUM], u4AmpduPer[ENUM_BAND_NUM],
u4InstantPer;
uint8_t ucDbdcIdx, ucSkipAr, ucStaIdx, ucNss;
static uint32_t u4TotalTxCnt[CFG_STAT_DBG_PEER_NUM] = {0};
static uint32_t u4TotalFailCnt[CFG_STAT_DBG_PEER_NUM] = {0};
static uint32_t u4Rate1TxCnt[CFG_STAT_DBG_PEER_NUM] = {0};
static uint32_t u4Rate1FailCnt[CFG_STAT_DBG_PEER_NUM] = {0};
static uint32_t au4RxMpduCnt[ENUM_BAND_NUM] = {0};
static uint32_t au4FcsError[ENUM_BAND_NUM] = {0};
static uint32_t au4RxFifoCnt[ENUM_BAND_NUM] = {0};
static uint32_t au4AmpduTxSfCnt[ENUM_BAND_NUM] = {0};
static uint32_t au4AmpduTxAckSfCnt[ENUM_BAND_NUM] = {0};
struct RX_CTRL *prRxCtrl;
uint32_t u4InstantRxPer[ENUM_BAND_NUM];
#if CFG_SUPPORT_ADVANCE_CONTROL
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
#endif
uint32_t rStatus = WLAN_STATUS_SUCCESS;
int16_t i2Wf0AvgPwr = 0, i2Wf1AvgPwr = 0;
uint32_t u4BufLen = 0;
uint8_t ucRaTableNum = sizeof(RATE_TBLE) / sizeof(char *);
uint8_t ucRaStatusNum = sizeof(RA_STATUS_TBLE) / sizeof(char *);
#if 0
uint8_t ucRaLtModeNum = sizeof(LT_MODE_TBLE) / sizeof(char *);
uint8_t ucRaSgiUnSpStateNum = sizeof(SGI_UNSP_STATE_TBLE) /
sizeof(char *);
uint8_t ucRaBwStateNum = sizeof(BW_STATE_TBLE) / sizeof(char *);
#endif
uint8_t ucAggRange[AGG_RANGE_SEL_NUM] = {0};
uint32_t u4RangeCtrl_0, u4RangeCtrl_1;
enum AGG_RANGE_TYPE_T eRangeType = ENUM_AGG_RANGE_TYPE_TX;
uint16_t u2Idx = 0;
uint8_t ucRcpi0 = 0, ucRcpi1 = 0, ucRcpi2 = 0, ucRcpi3 = 0;
ucSkipAr = prQueryStaStatistics->ucSkipAr;
prRxCtrl = &prAdapter->rRxCtrl;
ucNss = prAdapter->rWifiVar.ucNSS;
if (ucSkipAr) {
u2Idx = priv_driver_get_idx_info(prAdapter,
(uint8_t)(prHwWlanInfo->u4Index));
if (u2Idx == 0xFFFF)
return i4BytesWritten;
}
if (ucSkipAr) {
u4TotalTxCnt[u2Idx] += prQueryStaStatistics->u4TransmitCount;
u4TotalFailCnt[u2Idx] += prQueryStaStatistics->
u4TransmitFailCount;
u4Rate1TxCnt[u2Idx] += prQueryStaStatistics->u4Rate1TxCnt;
u4Rate1FailCnt[u2Idx] += prQueryStaStatistics->u4Rate1FailCnt;
}
if (ucSkipAr) {
u4Per = (u4Rate1TxCnt[u2Idx] == 0) ?
(0) : (1000 * (u4Rate1FailCnt[u2Idx]) /
(u4Rate1TxCnt[u2Idx]));
u4InstantPer = (prQueryStaStatistics->u4Rate1TxCnt == 0) ?
(0) : (1000 * (prQueryStaStatistics->u4Rate1FailCnt) /
(prQueryStaStatistics->u4Rate1TxCnt));
} else {
u4Per = (prQueryStaStatistics->u4Rate1TxCnt == 0) ?
(0) : (1000 * (prQueryStaStatistics->u4Rate1FailCnt) /
(prQueryStaStatistics->u4Rate1TxCnt));
u4InstantPer = (prQueryStaStatistics->ucPer == 0) ?
(0) : (prQueryStaStatistics->ucPer);
}
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM; ucDbdcIdx++) {
au4RxMpduCnt[ucDbdcIdx] += g_arMibInfo[ucDbdcIdx].u4RxMpduCnt;
au4FcsError[ucDbdcIdx] += g_arMibInfo[ucDbdcIdx].u4FcsError;
au4RxFifoCnt[ucDbdcIdx] += g_arMibInfo[ucDbdcIdx].u4RxFifoFull;
au4AmpduTxSfCnt[ucDbdcIdx] +=
g_arMibInfo[ucDbdcIdx].u4AmpduTxSfCnt;
au4AmpduTxAckSfCnt[ucDbdcIdx] +=
g_arMibInfo[ucDbdcIdx].u4AmpduTxAckSfCnt;
u4RxPer[ucDbdcIdx] =
((au4RxMpduCnt[ucDbdcIdx] + au4FcsError[ucDbdcIdx]) == 0) ?
(0) : (1000 * au4FcsError[ucDbdcIdx] /
(au4RxMpduCnt[ucDbdcIdx] +
au4FcsError[ucDbdcIdx]));
u4AmpduPer[ucDbdcIdx] =
(au4AmpduTxSfCnt[ucDbdcIdx] == 0) ?
(0) : (1000 * (au4AmpduTxSfCnt[ucDbdcIdx] -
au4AmpduTxAckSfCnt[ucDbdcIdx]) /
au4AmpduTxSfCnt[ucDbdcIdx]);
u4InstantRxPer[ucDbdcIdx] =
((prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4RxMpduCnt
+ prQueryStaStatistics->rMibInfo[ucDbdcIdx].u4FcsError)
== 0) ?
(0) : (1000 * prQueryStaStatistics->
rMibInfo[ucDbdcIdx].u4FcsError /
(prQueryStaStatistics->rMibInfo[ucDbdcIdx].
u4RxMpduCnt +
prQueryStaStatistics->rMibInfo[ucDbdcIdx].
u4FcsError));
}
rRssi = RCPI_TO_dBm(prQueryStaStatistics->ucRcpi);
u2LinkSpeed = (prQueryStaStatistics->u2LinkSpeed == 0) ? 0 :
prQueryStaStatistics->u2LinkSpeed / 2;
if (ucSkipAr) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d(%d)\n", "\nWlanIdx(BackupIdx)", " = ",
prHwWlanInfo->u4Index, u2Idx);
} else {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "\nWlanIdx", " = ",
prHwWlanInfo->u4Index);
}
/* =========== Group 0x0001 =========== */
if (u4StatGroup & 0x0001) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- STA Stat (Group 0x01) -----\n");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CurrTemperature", " = ",
prQueryStaStatistics->ucTemperature);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Tx Total cnt", " = ",
ucSkipAr ? (u4TotalTxCnt[u2Idx]) :
(prQueryStaStatistics->u4TransmitCount));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Tx Fail Cnt", " = ",
ucSkipAr ? (u4TotalFailCnt[u2Idx]) :
(prQueryStaStatistics->u4TransmitFailCount));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Rate1 Tx Cnt", " = ",
ucSkipAr ? (u4Rate1TxCnt[u2Idx]) :
(prQueryStaStatistics->u4Rate1TxCnt));
if (ucSkipAr)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d, PER = %d.%1d%%, instant PER = %d.%1d%%\n",
"Rate1 Fail Cnt", " = ",
u4Rate1FailCnt[u2Idx], u4Per/10, u4Per%10,
u4InstantPer/10, u4InstantPer%10);
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d, PER = %d.%1d%%, instant PER = %d%%\n",
"Rate1 Fail Cnt", " = ",
prQueryStaStatistics->u4Rate1FailCnt,
u4Per/10, u4Per%10, u4InstantPer);
if ((ucSkipAr) && (fgResetCnt)) {
u4TotalTxCnt[u2Idx] = 0;
u4TotalFailCnt[u2Idx] = 0;
u4Rate1TxCnt[u2Idx] = 0;
u4Rate1FailCnt[u2Idx] = 0;
}
}
/* =========== Group 0x0002 =========== */
if (u4StatGroup & 0x0002) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- MIB Info (Group 0x02) -----\n");
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM; ucDbdcIdx++) {
if (prAdapter->rWifiVar.fgDbDcModeEn)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"[DBDC_%d] :\n", ucDbdcIdx);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "RX Success", " = ",
au4RxMpduCnt[ucDbdcIdx]);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d, PER = %d.%1d%%, instant PER = %d.%1d%%\n",
"RX with CRC", " = ", au4FcsError[ucDbdcIdx],
u4RxPer[ucDbdcIdx]/10, u4RxPer[ucDbdcIdx]%10,
u4InstantRxPer[ucDbdcIdx]/10,
u4InstantRxPer[ucDbdcIdx]%10);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "RX drop FIFO full", " = ",
au4RxFifoCnt[ucDbdcIdx]);
if (!prAdapter->rWifiVar.fgDbDcModeEn)
break;
}
if (fgResetCnt) {
kalMemZero(au4RxMpduCnt, sizeof(au4RxMpduCnt));
kalMemZero(au4FcsError, sizeof(au4RxMpduCnt));
kalMemZero(au4RxFifoCnt, sizeof(au4RxMpduCnt));
kalMemZero(au4AmpduTxSfCnt, sizeof(au4RxMpduCnt));
kalMemZero(au4AmpduTxAckSfCnt, sizeof(au4RxMpduCnt));
}
}
/* =========== Group 0x0004 =========== */
if (u4StatGroup & 0x0004) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- Last Rx Info (Group 0x04) -----\n");
/* get Beacon RSSI */
rStatus = kalIoctl(prAdapter->prGlueInfo,
wlanoidQueryRssi, &rRssi,
sizeof(rRssi), TRUE, TRUE, TRUE,
&u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
DBGLOG(REQ, WARN, "unable to retrieve rssi\n");
#if CFG_SUPPORT_ADVANCE_CONTROL
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID
+ CMD_ADVCTL_NOISE_ID;
rStatus = kalIoctl(prAdapter->prGlueInfo,
wlanoidQuerySwCtrlRead, &rSwCtrlInfo,
sizeof(rSwCtrlInfo), TRUE, TRUE, TRUE,
&u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u, rSwCtrlInfo.u4Data 0x%x\n",
rStatus, rSwCtrlInfo.u4Data);
if (rStatus == WLAN_STATUS_SUCCESS) {
i2Wf0AvgPwr = rSwCtrlInfo.u4Data & 0xFFFF;
i2Wf1AvgPwr = (rSwCtrlInfo.u4Data >> 16) & 0xFFFF;
}
#endif /* CFG_SUPPORT_ADVANCE_CONTROL */
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d %d\n", "NOISE", " = ",
i2Wf0AvgPwr, i2Wf1AvgPwr);
/* Last RX Rate */
i4BytesWritten += priv_driver_rx_rate_info(prAdapter,
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
(uint8_t)(prHwWlanInfo->u4Index));
#if CFG_SUPPORT_ADVANCE_CONTROL
/* Last RX SNR */
i4BytesWritten += priv_driver_get_snr(prAdapter->prGlueInfo,
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten);
#endif
/* Last RX RSSI */
i4BytesWritten += priv_driver_last_rx_rssi(prAdapter,
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
(uint8_t)(prHwWlanInfo->u4Index));
ucRcpi0 = prHwWlanInfo->rWtblRxCounter.ucRxRcpi0;
ucRcpi1 = prHwWlanInfo->rWtblRxCounter.ucRxRcpi1;
if (ucNss > 2) {
ucRcpi2 = prHwWlanInfo->rWtblRxCounter.ucRxRcpi2;
ucRcpi3 = prHwWlanInfo->rWtblRxCounter.ucRxRcpi3;
}
#if CFG_RCPI_COMPENSATION
if (wlanGetStaIdxByWlanIdx(prAdapter,
(uint8_t)(prHwWlanInfo->u4Index), &ucStaIdx) ==
WLAN_STATUS_SUCCESS){
ucRcpi0 = (ucRcpi0 >= RCPI_MEASUREMENT_NOT_AVAILABLE) ?
ucRcpi0 : (ucRcpi0 +
wlanGetCurrChRxFELoss(prAdapter, ucStaIdx, 0));
ucRcpi1 = (ucRcpi1 >= RCPI_MEASUREMENT_NOT_AVAILABLE) ?
ucRcpi1 : (ucRcpi1 +
wlanGetCurrChRxFELoss(prAdapter, ucStaIdx, 1));
}
DBGLOG(REQ, LOUD, "ucRcpi0:%d ucRcpi1:%d\n", ucRcpi0, ucRcpi1);
#endif /* CFG_RCPI_COMPENSATION */
/* Last TX Resp RSSI */
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d %d", "Tx Response RSSI", " = ",
RCPI_TO_dBm(ucRcpi0), RCPI_TO_dBm(ucRcpi1));
if (ucNss > 2)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
" %d %d\n",
RCPI_TO_dBm(ucRcpi2), RCPI_TO_dBm(ucRcpi3));
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n");
/* Last Beacon RSSI */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Beacon RSSI", " = ", rRssi);
}
/* =========== Group 0x0008 =========== */
if (u4StatGroup & 0x0008) {
/* TxV */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- Last TX Info (Group 0x08) -----\n");
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM; ucDbdcIdx++) {
int8_t txpwr;
txpwr = TX_VECTOR_GET_TX_PWR(
&prQueryStaStatistics->rTxVector[ucDbdcIdx]);
if (prAdapter->rWifiVar.fgDbDcModeEn)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"[DBDC_%d] :\n", ucDbdcIdx);
i4BytesWritten += priv_driver_tx_vector_info(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
&prQueryStaStatistics->rTxVector[ucDbdcIdx]);
if (prQueryStaStatistics->rTxVector[ucDbdcIdx]
.u4TxVector1 == 0xFFFFFFFF)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Chip Out TX Power",
" = ", "N/A");
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%c%d.%1d dBm\n",
"Chip Out TX Power", " = ",
(txpwr < 0) ? '-' : '+',
abs(txpwr / 2),
5 * abs(txpwr % 2));
if (!prAdapter->rWifiVar.fgDbDcModeEn)
break;
}
}
/* =========== Group 0x0010 =========== */
if (u4StatGroup & 0x0010) {
/* RX Reorder */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- RX Reorder (Group 0x10) -----\n");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%ld\n", "Rx reorder miss", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_MISS_COUNT));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%ld\n", "Rx reorder within", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_WITHIN_COUNT));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%ld\n", "Rx reorder ahead", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_AHEAD_COUNT));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%ld\n", "Rx reorder behind", " = ",
RX_GET_CNT(prRxCtrl, RX_DATA_REORDER_BEHIND_COUNT));
}
/* =========== Group 0x0020 =========== */
if (u4StatGroup & 0x0020) {
/* RA info */
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "----- RA Info (Group 0x20) -----\n");
#if 0
/* Last TX Rate */
i4BytesWritten += priv_driver_tx_rate_info(
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
FALSE, prHwWlanInfo, prQueryStaStatistics);
#endif
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%-20s%s%d\n", "LinkSpeed",
" = ", u2LinkSpeed);
if (!prQueryStaStatistics->ucSkipAr) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "RateTable", " = ",
prQueryStaStatistics->ucArTableIdx <
(ucRaTableNum - 1) ?
RATE_TBLE[
prQueryStaStatistics->ucArTableIdx] :
RATE_TBLE[ucRaTableNum - 1]);
if (wlanGetStaIdxByWlanIdx(prAdapter,
(uint8_t)(prHwWlanInfo->u4Index), &ucStaIdx) ==
WLAN_STATUS_SUCCESS){
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "2G Support 256QAM TX",
" = ",
((prAdapter->arStaRec[ucStaIdx].u4Flags
& MTK_SYNERGY_CAP_SUPPORT_24G_MCS89) ||
(prQueryStaStatistics->
ucDynamicGband256QAMState == 2)) ?
1 : 0);
}
#if 0
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d%%\n", "Rate1 instantPer", " = ",
u4InstantPer);
#endif
if (prQueryStaStatistics->ucAvePer == 0xFF) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Train Down", " = ",
"N/A");
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Train Up", " = ",
"N/A");
} else {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d -> %d\n", "Train Down",
" = ",
(uint16_t)
(prQueryStaStatistics->u2TrainDown
& BITS(0, 7)),
(uint16_t)
((prQueryStaStatistics->u2TrainDown >>
8) & BITS(0, 7)));
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d -> %d\n", "Train Up", " = ",
(uint16_t)
(prQueryStaStatistics->u2TrainUp
& BITS(0, 7)),
(uint16_t)
((prQueryStaStatistics->u2TrainUp >> 8)
& BITS(0, 7)));
}
if (prQueryStaStatistics->fgIsForceTxStream == 0)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Force Tx Stream",
" = ", "N/A");
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Force Tx Stream", " = ",
prQueryStaStatistics->
fgIsForceTxStream);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Force SE off", " = ",
prQueryStaStatistics->fgIsForceSeOff);
#if 0
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s%d%s%d%s%d%s%d\n", "TxQuality", " = ",
"KEEP_", prQueryStaStatistics->aucTxQuality[0],
", UP_", prQueryStaStatistics->aucTxQuality[1],
", DOWN_", prQueryStaStatistics->
aucTxQuality[2],
", BWUP_", prQueryStaStatistics->
aucTxQuality[3]);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "UpPenalty", " = ",
prQueryStaStatistics->ucTxRateUpPenalty);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "LtMode", " = ",
prQueryStaStatistics->ucLowTrafficMode <
(ucRaLtModeNum - 1) ?
LT_MODE_TBLE[prQueryStaStatistics->
ucLowTrafficMode] :
LT_MODE_TBLE[ucRaLtModeNum - 1]);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "LtCnt", " = ",
prQueryStaStatistics->ucLowTrafficCount);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "LtDashBoard", " = ",
prQueryStaStatistics->ucLowTrafficDashBoard);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "SgiState", " = ",
prQueryStaStatistics->ucDynamicSGIState <
(ucRaSgiUnSpStateNum - 1) ?
SGI_UNSP_STATE_TBLE[prQueryStaStatistics->
ucDynamicSGIState] :
SGI_UNSP_STATE_TBLE[ucRaSgiUnSpStateNum - 1]);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "SgiScore", " = ",
prQueryStaStatistics->ucDynamicSGIScore);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "BwState", " = ",
prQueryStaStatistics->ucDynamicBWState <
(ucRaBwStateNum - 1) ?
BW_STATE_TBLE[prQueryStaStatistics->
ucDynamicBWState] :
BW_STATE_TBLE[ucRaBwStateNum - 1]);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "NonSpState", " = ",
prQueryStaStatistics->ucDynamicSGIState <
(ucRaSgiUnSpStateNum - 1) ?
SGI_UNSP_STATE_TBLE[prQueryStaStatistics->
ucVhtNonSpRateState] :
SGI_UNSP_STATE_TBLE[ucRaSgiUnSpStateNum - 1]);
#endif
}
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "RunningCnt", " = ",
prQueryStaStatistics->u2RaRunningCnt);
prQueryStaStatistics->ucRaStatus &= ~0x80;
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Status", " = ",
prQueryStaStatistics->ucRaStatus < (ucRaStatusNum - 1) ?
RA_STATUS_TBLE[prQueryStaStatistics->ucRaStatus] :
RA_STATUS_TBLE[ucRaStatusNum - 1]);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "MaxAF", " = ",
prHwWlanInfo->rWtblPeerCap.ucAmpduFactor);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s0x%x\n", "SpeIdx", " = ",
prHwWlanInfo->rWtblPeerCap.ucSpatialExtensionIndex);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CBRN", " = ",
prHwWlanInfo->rWtblPeerCap.ucChangeBWAfterRateN);
/* Rate1~Rate8 */
i4BytesWritten += priv_driver_tx_rate_info(
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
TRUE, prHwWlanInfo, prQueryStaStatistics);
}
/* =========== Group 0x0040 =========== */
if (u4StatGroup & 0x0040) {
u4RangeCtrl_0 = prQueryStaStatistics->u4AggRangeCtrl_0;
u4RangeCtrl_1 = prQueryStaStatistics->u4AggRangeCtrl_1;
eRangeType = (enum AGG_RANGE_TYPE_T)
prQueryStaStatistics->ucRangeType;
ucAggRange[0] = (((u4RangeCtrl_0) & AGG_RANGE_SEL_0_MASK) >>
AGG_RANGE_SEL_0_OFFSET);
ucAggRange[1] = (((u4RangeCtrl_0) & AGG_RANGE_SEL_1_MASK) >>
AGG_RANGE_SEL_1_OFFSET);
ucAggRange[2] = (((u4RangeCtrl_0) & AGG_RANGE_SEL_2_MASK) >>
AGG_RANGE_SEL_2_OFFSET);
ucAggRange[3] = (((u4RangeCtrl_0) & AGG_RANGE_SEL_3_MASK) >>
AGG_RANGE_SEL_3_OFFSET);
ucAggRange[4] = (((u4RangeCtrl_1) & AGG_RANGE_SEL_4_MASK) >>
AGG_RANGE_SEL_4_OFFSET);
ucAggRange[5] = (((u4RangeCtrl_1) & AGG_RANGE_SEL_5_MASK) >>
AGG_RANGE_SEL_5_OFFSET);
ucAggRange[6] = (((u4RangeCtrl_1) & AGG_RANGE_SEL_6_MASK) >>
AGG_RANGE_SEL_6_OFFSET);
/* Tx Agg */
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s%s%s", "------ ",
(eRangeType > ENUM_AGG_RANGE_TYPE_TX) ? (
(eRangeType == ENUM_AGG_RANGE_TYPE_TRX) ?
("TRX") : ("RX")) : ("TX"),
" AGG (Group 0x40) -----\n");
if (eRangeType == ENUM_AGG_RANGE_TYPE_TRX) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-6s%8d%5d%1s%2d%5d%1s%2d%5d%3s",
" TX :", ucAggRange[0] + 1,
ucAggRange[0] + 2, "~", ucAggRange[1] + 1,
ucAggRange[1] + 2, "~", ucAggRange[2] + 1,
ucAggRange[2] + 2, "~64\n");
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM;
ucDbdcIdx++) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"DBDC%d:", ucDbdcIdx);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%8d%8d%8d%8d\n",
g_arMibInfo[ucDbdcIdx].
u2TxRange1AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange2AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange3AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange4AmpduCnt);
if (!prAdapter->rWifiVar.fgDbDcModeEn)
break;
}
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-6s%8d%5d%1s%2d%5d%1s%2d%5d%3s",
" RX :", ucAggRange[3] + 1,
ucAggRange[3] + 2, "~", ucAggRange[4] + 1,
ucAggRange[4] + 2, "~", ucAggRange[5] + 1,
ucAggRange[5] + 2, "~64\n");
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM;
ucDbdcIdx++) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"DBDC%d:", ucDbdcIdx);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%8d%8d%8d%8d\n",
g_arMibInfo[ucDbdcIdx].
u2TxRange5AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange6AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange7AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange8AmpduCnt);
if (!prAdapter->rWifiVar.fgDbDcModeEn)
break;
}
} else {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
"%-6s%8d%5d%1s%2d%5d%1s%2d%5d%1s%2d%5d%1s%2d%5d%1s%2d%5d%1s%2d%5d%3s",
"Range:", ucAggRange[0] + 1,
ucAggRange[0] + 2, "~", ucAggRange[1] + 1,
ucAggRange[1] + 2, "~", ucAggRange[2] + 1,
ucAggRange[2] + 2, "~", ucAggRange[3] + 1,
ucAggRange[3] + 2, "~", ucAggRange[4] + 1,
ucAggRange[4] + 2, "~", ucAggRange[5] + 1,
ucAggRange[5] + 2, "~", ucAggRange[6] + 1,
ucAggRange[6] + 2, "~64\n");
for (ucDbdcIdx = 0; ucDbdcIdx < ENUM_BAND_NUM;
ucDbdcIdx++) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"DBDC%d:", ucDbdcIdx);
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%8d%8d%8d%8d%8d%8d%8d%8d\n",
g_arMibInfo[ucDbdcIdx].
u2TxRange1AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange2AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange3AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange4AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange5AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange6AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange7AmpduCnt,
g_arMibInfo[ucDbdcIdx].
u2TxRange8AmpduCnt);
if (!prAdapter->rWifiVar.fgDbDcModeEn)
break;
}
}
}
kalMemZero(g_arMibInfo, sizeof(g_arMibInfo));
return i4BytesWritten;
}
static int32_t priv_driver_set_ra_debug_proc(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
int32_t i4Recv = 0;
uint32_t u4WCID = 0, u4DebugType = 0;
uint32_t u4Id = 0xa0650000;
struct PARAM_CUSTOM_SW_CTRL_STRUCT *prSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
this_char = kalStrStr(*apcArgv, "=");
if (!this_char)
return -1;
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
i4Recv = sscanf(this_char, "%d:%d", &(u4WCID), &(u4DebugType));
prSwCtrlInfo =
(struct PARAM_CUSTOM_SW_CTRL_STRUCT *)kalMemAlloc(
sizeof(struct PARAM_CUSTOM_SW_CTRL_STRUCT),
VIR_MEM_TYPE);
if (!prSwCtrlInfo)
return -1;
if (i4Recv == 2) {
prSwCtrlInfo->u4Id = u4Id;
prSwCtrlInfo->u4Data = u4WCID |
((u4DebugType & BITS(0, 15)) << 16);
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite,
prSwCtrlInfo,
sizeof(struct PARAM_CUSTOM_SW_CTRL_STRUCT),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
kalMemFree(prSwCtrlInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_CUSTOM_SW_CTRL_STRUCT));
return -1;
}
DBGLOG(REQ, LOUD, "WlanIdx=%d\nDebugType=%d\nu4Data=0x%08x\n",
u4WCID, u4DebugType, prSwCtrlInfo->u4Data);
} else {
DBGLOG(INIT, ERROR,
"iwpriv wlanXX driver RaDebug=[wlanIdx]:[debugType]\n");
}
kalMemFree(prSwCtrlInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_CUSTOM_SW_CTRL_STRUCT));
return i4BytesWritten;
}
int priv_driver_set_fixed_fallback(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
/* INT_32 u4Ret = 0; */
uint32_t u4WCID = 0;
uint32_t u4Mode = 0, u4Bw = 0, u4Mcs = 0, u4VhtNss = 0, u4Band = 0;
uint32_t u4SGI = 0, u4Preamble = 0, u4STBC = 0, u4LDPC = 0, u4SpeEn = 0;
int32_t i4Recv = 0;
int8_t *this_char = NULL;
uint32_t u4Id = 0xa0660000;
uint32_t u4Data = 0x80000000;
uint32_t u4Id2 = 0xa0600000;
uint8_t u4Nsts = 1;
u_int8_t fgStatus = TRUE;
static uint8_t fgIsUseWCID = FALSE;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
this_char = kalStrStr(*apcArgv, "=");
if (!this_char)
return -1;
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
if (strnicmp(this_char, "auto", strlen("auto")) == 0) {
i4Recv = 1;
} else if (strnicmp(this_char, "UseWCID", strlen("UseWCID")) == 0) {
i4Recv = 2;
fgIsUseWCID = TRUE;
} else if (strnicmp(this_char, "ApplyAll", strlen("ApplyAll")) == 0) {
i4Recv = 3;
fgIsUseWCID = FALSE;
} else {
i4Recv = sscanf(this_char, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d",
&(u4WCID), &(u4Mode), &(u4Bw), &(u4Mcs),
&(u4VhtNss), &(u4SGI), &(u4Preamble), &(u4STBC),
&(u4LDPC), &(u4SpeEn), &(u4Band));
DBGLOG(REQ, LOUD, "u4WCID=%d\nu4Mode=%d\nu4Bw=%d\n",
u4WCID, u4Mode, u4Bw);
DBGLOG(REQ, LOUD, "u4Mcs=%d\nu4VhtNss=%d\nu4SGI=%d\n",
u4Mcs, u4VhtNss, u4SGI);
DBGLOG(REQ, LOUD, "u4Preamble=%d\nu4STBC=%d\n",
u4Preamble, u4STBC);
DBGLOG(REQ, LOUD, "u4LDPC=%d\nu4SpeEn=%d\nu4Band=%d\n",
u4LDPC, u4SpeEn, u4Band);
DBGLOG(REQ, LOUD, "fgIsUseWCID=%d\n\n",
fgIsUseWCID);
}
if (i4Recv == 1) {
rSwCtrlInfo.u4Id = u4Id2;
rSwCtrlInfo.u4Data = 0;
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
} else if (i4Recv == 2 || i4Recv == 3) {
i4BytesWritten = snprintf(pcCommand, i4TotalLen,
"Update fgIsUseWCID %d\n", fgIsUseWCID);
} else if (i4Recv == 11) {
rSwCtrlInfo.u4Id = u4Id;
rSwCtrlInfo.u4Data = u4Data;
if (fgIsUseWCID && u4WCID < WTBL_SIZE &&
prAdapter->rWifiVar.arWtbl[u4WCID].ucUsed) {
rSwCtrlInfo.u4Id |= u4WCID;
rSwCtrlInfo.u4Id |= BIT(8);
i4BytesWritten = snprintf(
pcCommand, i4TotalLen,
"Apply WCID %d\n", u4WCID);
} else {
i4BytesWritten = snprintf(
pcCommand, i4TotalLen, "Apply All\n");
}
if (u4SGI)
rSwCtrlInfo.u4Data |= BIT(30);
if (u4LDPC)
rSwCtrlInfo.u4Data |= BIT(29);
if (u4SpeEn)
rSwCtrlInfo.u4Data |= BIT(28);
if (u4Band)
rSwCtrlInfo.u4Data |= BIT(25);
if (u4STBC)
rSwCtrlInfo.u4Data |= BIT(11);
if (u4Bw <= 3)
rSwCtrlInfo.u4Data |= ((u4Bw << 26) & BITS(26, 27));
else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"Wrong BW! BW20=0, BW40=1, BW80=2,BW160=3\n");
}
if (u4Mode <= 4) {
rSwCtrlInfo.u4Data |= ((u4Mode << 6) & BITS(6, 8));
switch (u4Mode) {
case 0:
if (u4Mcs <= 3)
rSwCtrlInfo.u4Data |= u4Mcs;
else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"CCK mode but wrong MCS!\n");
}
if (u4Preamble)
rSwCtrlInfo.u4Data |= BIT(2);
else
rSwCtrlInfo.u4Data &= ~BIT(2);
break;
case 1:
switch (u4Mcs) {
case 0:
/* 6'b001011 */
rSwCtrlInfo.u4Data |= 11;
break;
case 1:
/* 6'b001111 */
rSwCtrlInfo.u4Data |= 15;
break;
case 2:
/* 6'b001010 */
rSwCtrlInfo.u4Data |= 10;
break;
case 3:
/* 6'b001110 */
rSwCtrlInfo.u4Data |= 14;
break;
case 4:
/* 6'b001001 */
rSwCtrlInfo.u4Data |= 9;
break;
case 5:
/* 6'b001101 */
rSwCtrlInfo.u4Data |= 13;
break;
case 6:
/* 6'b001000 */
rSwCtrlInfo.u4Data |= 8;
break;
case 7:
/* 6'b001100 */
rSwCtrlInfo.u4Data |= 12;
break;
default:
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"OFDM mode but wrong MCS!\n");
break;
}
break;
case 2:
case 3:
if (u4Mcs <= 32)
rSwCtrlInfo.u4Data |= u4Mcs;
else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"HT mode but wrong MCS!\n");
}
if (u4Mcs != 32) {
u4Nsts += (u4Mcs >> 3);
if (u4STBC && (u4Nsts == 1))
u4Nsts++;
}
break;
case 4:
if (u4Mcs <= 9)
rSwCtrlInfo.u4Data |= u4Mcs;
else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"VHT mode but wrong MCS!\n");
}
if (u4STBC && (u4VhtNss == 1))
u4Nsts++;
else
u4Nsts = u4VhtNss;
break;
default:
break;
}
} else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"Wrong TxMode! CCK=0, OFDM=1, HT=2, GF=3, VHT=4\n");
}
rSwCtrlInfo.u4Data |= (((u4Nsts - 1) << 9) & BITS(9, 10));
if (fgStatus) {
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
}
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
} else {
DBGLOG(INIT, ERROR, "iwpriv wlanXX driver FixedRate=Option\n");
DBGLOG(INIT, ERROR,
"Option:[WCID]-[Mode]-[BW]-[MCS]-[VhtNss]-[SGI]-[Preamble]-[STBC]-[LDPC]-[SPE_EN]-[BAND]\n");
DBGLOG(INIT, ERROR, "[WCID]Wireless Client ID\n");
DBGLOG(INIT, ERROR, "[Mode]CCK=0, OFDM=1, HT=2, GF=3, VHT=4\n");
DBGLOG(INIT, ERROR, "[BW]BW20=0, BW40=1, BW80=2,BW160=3\n");
DBGLOG(INIT, ERROR,
"[MCS]CCK=0~3, OFDM=0~7, HT=0~32, VHT=0~9\n");
DBGLOG(INIT, ERROR, "[VhtNss]VHT=1~4, Other=ignore\n");
DBGLOG(INIT, ERROR, "[Preamble]Long=0, Other=Short\n");
DBGLOG(INIT, ERROR, "[BAND]2G=0, Other=5G\n");
}
return i4BytesWritten;
}
#endif
#if (CFG_SUPPORT_TXPOWER_INFO == 1)
static int32_t priv_driver_dump_txpower_info(struct ADAPTER *prAdapter,
IN char *pcCommand, IN int i4TotalLen,
struct PARAM_TXPOWER_ALL_RATE_POWER_INFO_T *prTxPowerInfo)
{
int32_t i4BytesWritten = 0;
if (prTxPowerInfo->ucTxPowerCategory ==
TXPOWER_EVENT_SHOW_ALL_RATE_TXPOWER_INFO) {
#define CCK_IDX 0
#define OFDM_IDX 1
#define HT20_IDX 2
#define HT40_IDX 3
#define VHT20_IDX 4
#define VHT40_IDX 5
#define VHT80_IDX 6
#define VHT160_IDX 7
uint8_t ucTxPwrIdx = 0, ucTxPwrType = 0, ucIdx = 0,
ucIdxOffset = 0;
u_int8_t fgIsHt = TRUE;
uint8_t *pucTxPwrRate = NULL;
struct FRAME_POWER_CONFIG_INFO_T rRatePowerInfo;
uint8_t ucTxPwrCckRate[MODULATION_SYSTEM_CCK_NUM] = {
1, 2, 5, 11};
uint8_t ucTxPwrOfdmRate[MODULATION_SYSTEM_OFDM_NUM] = {
6, 9, 12, 18, 24, 36, 48, 54 };
uint8_t ucTxPwrHt20Rate[MODULATION_SYSTEM_HT20_NUM] = {
0, 1, 2, 3, 4, 5, 6, 7 };
uint8_t ucTxPwrHt40Rate[MODULATION_SYSTEM_HT40_NUM] = {
0, 1, 2, 3, 4, 5, 6, 7, 32 };
uint8_t *POWER_TYPE_STR[] = {
[CCK_IDX] = "CCK",
[OFDM_IDX] = "OFDM",
[HT20_IDX] = "HT20",
[HT40_IDX] = "HT40",
[VHT20_IDX] = "VHT20",
[VHT40_IDX] = "VHT40",
[VHT80_IDX] = "VHT80",
[VHT160_IDX] = "VHT160"};
uint8_t ucPwrIdxLen[] = {
MODULATION_SYSTEM_CCK_NUM, MODULATION_SYSTEM_OFDM_NUM,
MODULATION_SYSTEM_HT20_NUM, MODULATION_SYSTEM_HT40_NUM,
MODULATION_SYSTEM_VHT20_NUM, MODULATION_SYSTEM_VHT40_NUM,
MODULATION_SYSTEM_VHT80_NUM, MODULATION_SYSTEM_VHT160_NUM };
if ((sizeof(POWER_TYPE_STR)/sizeof(uint8_t *)) !=
(sizeof(ucPwrIdxLen)/sizeof(uint8_t)))
return i4BytesWritten;
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s",
"\n====== TX POWER INFO ======\n");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s",
"------\n");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"DBDC Index: %d, Channel Band: %s\n",
prTxPowerInfo->ucBandIdx,
(prTxPowerInfo->ucChBand) ?
("5G") : ("2G"));
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "------\n");
for (ucTxPwrType = 0;
ucTxPwrType < sizeof(POWER_TYPE_STR)/sizeof(uint8_t *);
ucTxPwrType++) {
for (ucTxPwrIdx = 0;
ucTxPwrIdx < ucPwrIdxLen[ucTxPwrType];
ucTxPwrIdx++) {
if ((ucTxPwrType == CCK_IDX) ||
(ucTxPwrType == OFDM_IDX)) {
pucTxPwrRate =
(ucTxPwrType == CCK_IDX) ?
(ucTxPwrCckRate) :
(ucTxPwrOfdmRate);
ucIdx = ucTxPwrIdx + ucIdxOffset;
rRatePowerInfo =
prTxPowerInfo->rRatePowerInfo;
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"[%s_%02dM]: 0x%02x (%03d)\n",
POWER_TYPE_STR[ucTxPwrType],
pucTxPwrRate[ucTxPwrIdx],
rRatePowerInfo.
aicFramePowerConfig[ucIdx].
icFramePowerDbm,
rRatePowerInfo.
aicFramePowerConfig[ucIdx].
icFramePowerDbm);
} else {
if (ucTxPwrType == HT20_IDX) {
pucTxPwrRate = ucTxPwrHt20Rate;
fgIsHt = TRUE;
} else if (ucTxPwrType == HT40_IDX) {
pucTxPwrRate = ucTxPwrHt40Rate;
fgIsHt = TRUE;
} else {
fgIsHt = FALSE;
}
rRatePowerInfo =
prTxPowerInfo->rRatePowerInfo;
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"[%s_M%02d]: 0x%02x (%03d)\n",
POWER_TYPE_STR[ucTxPwrType],
((fgIsHt) ?
(pucTxPwrRate[ucTxPwrIdx]) :
(ucTxPwrIdx)),
rRatePowerInfo.
aicFramePowerConfig[ucIdx]
.icFramePowerDbm,
rRatePowerInfo.
aicFramePowerConfig[ucIdx]
.icFramePowerDbm);
}
}
if ((ucTxPwrType == OFDM_IDX) ||
(ucTxPwrType == HT40_IDX) ||
(ucTxPwrType == VHT160_IDX))
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "------\n");
ucIdxOffset += ucPwrIdxLen[ucTxPwrType];
}
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"[MAX][Bound]: 0x%02x (%03d)\n",
prTxPowerInfo->icPwrMaxBnd,
prTxPowerInfo->icPwrMaxBnd);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"[MIN][Bound]: 0x%02x (%03d)\n",
prTxPowerInfo->icPwrMinBnd,
prTxPowerInfo->icPwrMinBnd);
}
return i4BytesWritten;
}
static int32_t priv_driver_get_txpower_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0, u4Size = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
uint32_t u4Ret = 0;
uint8_t ucParam = 0;
struct PARAM_TXPOWER_ALL_RATE_POWER_INFO_T *prTxPowerInfo = NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
this_char = kalStrStr(*apcArgv, "=");
if (!this_char)
return -1;
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
u4Ret = kalkStrtou8(this_char, 0, &ucParam);
DBGLOG(REQ, LOUD, "u4Ret = %d, ucParam = %d\n", u4Ret, ucParam);
u4Size = sizeof(struct PARAM_TXPOWER_ALL_RATE_POWER_INFO_T);
prTxPowerInfo =
(struct PARAM_TXPOWER_ALL_RATE_POWER_INFO_T *)kalMemAlloc(
u4Size, VIR_MEM_TYPE);
if (!prTxPowerInfo)
return -1;
if (u4Ret == 0) {
prTxPowerInfo->ucTxPowerCategory = ucParam;
/*
* FIX ME: Mobile driver can't get correct band,
* so assigned Band_0 as temp solution.
* Remember to fix it when needed to use this command on Band_1.
*/
prTxPowerInfo->ucBandIdx = ENUM_BAND_0;
rStatus = kalIoctl(prGlueInfo, wlanoidQueryTxPowerInfo,
prTxPowerInfo,
sizeof(struct PARAM_TXPOWER_ALL_RATE_POWER_INFO_T),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
kalMemFree(prTxPowerInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_TXPOWER_ALL_RATE_POWER_INFO_T));
return -1;
}
i4BytesWritten = priv_driver_dump_txpower_info(prAdapter,
pcCommand, i4TotalLen, prTxPowerInfo);
} else {
DBGLOG(INIT, ERROR,
"iwpriv wlanXX driver TxPowerInfo=[Param]\n");
}
kalMemFree(prTxPowerInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_TXPOWER_ALL_RATE_POWER_INFO_T));
return i4BytesWritten;
}
#endif
static int priv_driver_get_sta_stat(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0, u4Ret, u4StatGroup = 0xFFFFFFFF;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint8_t aucMacAddr[MAC_ADDR_LEN];
uint8_t ucWlanIndex = WTBL_RESERVED_ENTRY;
uint8_t *pucMacAddr = NULL;
struct PARAM_HW_WLAN_INFO *prHwWlanInfo = NULL;
struct PARAM_GET_STA_STATISTICS *prQueryStaStatistics = NULL;
u_int8_t fgResetCnt = FALSE;
u_int8_t fgRxCCSel = FALSE;
u_int8_t fgSearchMacAddr = FALSE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= 4) {
if (strnicmp(apcArgv[2], CMD_STAT_GROUP_SEL,
strlen(CMD_STAT_GROUP_SEL)) == 0) {
u4Ret = kalkStrtou32(apcArgv[3], 0, &(u4StatGroup));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_sta_stat error (Group) u4Ret=%d\n",
u4Ret);
if (u4StatGroup == 0)
u4StatGroup = 0xFFFFFFFF;
wlanHwAddrToBin(apcArgv[1], &aucMacAddr[0]);
if (!wlanGetWlanIdxByAddress(prGlueInfo->prAdapter,
&aucMacAddr[0], &ucWlanIndex)) {
DBGLOG(REQ, INFO,
"wlan index of %pM is not found!\n",
aucMacAddr);
goto out;
}
} else {
goto out;
}
} else if (i4Argc >= 3) {
if (strnicmp(apcArgv[1], CMD_STAT_GROUP_SEL,
strlen(CMD_STAT_GROUP_SEL)) == 0) {
u4Ret = kalkStrtou32(apcArgv[2], 0, &(u4StatGroup));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_sta_stat error (Group) u4Ret=%d\n",
u4Ret);
if (u4StatGroup == 0)
u4StatGroup = 0xFFFFFFFF;
if (prGlueInfo->prAdapter->prAisBssInfo->prStaRecOfAP) {
ucWlanIndex = prGlueInfo->prAdapter
->prAisBssInfo->prStaRecOfAP
->ucWlanIndex;
} else if (!wlanGetWlanIdxByAddress(
prGlueInfo->prAdapter, NULL,
&ucWlanIndex)) {
DBGLOG(REQ, INFO,
"wlan index of %pM is not found!\n",
aucMacAddr);
goto out;
}
} else {
if (strnicmp(apcArgv[1], CMD_STAT_RESET_CNT,
strlen(CMD_STAT_RESET_CNT)) == 0) {
wlanHwAddrToBin(apcArgv[2], &aucMacAddr[0]);
fgResetCnt = TRUE;
} else if (strnicmp(apcArgv[2], CMD_STAT_RESET_CNT,
strlen(CMD_STAT_RESET_CNT)) == 0) {
wlanHwAddrToBin(apcArgv[1], &aucMacAddr[0]);
fgResetCnt = TRUE;
} else {
wlanHwAddrToBin(apcArgv[1], &aucMacAddr[0]);
fgResetCnt = FALSE;
}
if (!wlanGetWlanIdxByAddress(prGlueInfo->prAdapter,
&aucMacAddr[0], &ucWlanIndex)) {
DBGLOG(REQ, INFO,
"wlan index of %pM is not found!\n",
aucMacAddr);
goto out;
}
}
} else {
if (i4Argc == 1) {
fgSearchMacAddr = TRUE;
} else if (i4Argc == 2) {
if (strnicmp(apcArgv[1], CMD_STAT_RESET_CNT,
strlen(CMD_STAT_RESET_CNT)) == 0) {
fgResetCnt = TRUE;
fgSearchMacAddr = TRUE;
} else if (strnicmp(apcArgv[1], CMD_STAT_NOISE_SEL,
strlen(CMD_STAT_NOISE_SEL)) == 0) {
fgRxCCSel = TRUE;
fgSearchMacAddr = TRUE;
} else {
wlanHwAddrToBin(apcArgv[1], &aucMacAddr[0]);
if (!wlanGetWlanIdxByAddress(prGlueInfo->
prAdapter, &aucMacAddr[0], &ucWlanIndex)) {
DBGLOG(REQ, INFO,
"No connected peer found!\n");
goto out;
}
}
}
if (fgSearchMacAddr) {
/* Get AIS AP address for no argument */
if (prGlueInfo->prAdapter->prAisBssInfo->prStaRecOfAP) {
ucWlanIndex = prGlueInfo->prAdapter->
prAisBssInfo->prStaRecOfAP->ucWlanIndex;
} else if (!wlanGetWlanIdxByAddress(prGlueInfo->
prAdapter, NULL, &ucWlanIndex)) {
DBGLOG(REQ, INFO, "No connected peer found!\n");
goto out;
}
}
}
prHwWlanInfo = (struct PARAM_HW_WLAN_INFO *)kalMemAlloc(
sizeof(struct PARAM_HW_WLAN_INFO), VIR_MEM_TYPE);
if (!prHwWlanInfo) {
DBGLOG(REQ, ERROR,
"Allocate prHwWlanInfo failed!\n");
i4BytesWritten = -1;
goto out;
}
prHwWlanInfo->u4Index = ucWlanIndex;
if (fgRxCCSel == TRUE)
prHwWlanInfo->rWtblRxCounter.fgRxCCSel = TRUE;
else
prHwWlanInfo->rWtblRxCounter.fgRxCCSel = FALSE;
DBGLOG(REQ, INFO, "MT6632 : index = %d i4TotalLen = %d\n",
prHwWlanInfo->u4Index, i4TotalLen);
/* Get WTBL info */
rStatus = kalIoctl(prGlueInfo, wlanoidQueryWlanInfo, prHwWlanInfo,
sizeof(struct PARAM_HW_WLAN_INFO),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "Query prHwWlanInfo failed!\n");
i4BytesWritten = -1;
goto out;
}
/* Get Statistics info */
prQueryStaStatistics =
(struct PARAM_GET_STA_STATISTICS *)kalMemAlloc(
sizeof(struct PARAM_GET_STA_STATISTICS), VIR_MEM_TYPE);
if (!prQueryStaStatistics) {
DBGLOG(REQ, ERROR,
"Allocate prQueryStaStatistics failed!\n");
i4BytesWritten = -1;
goto out;
}
prQueryStaStatistics->ucResetCounter = fgResetCnt;
pucMacAddr = wlanGetStaAddrByWlanIdx(prGlueInfo->prAdapter,
ucWlanIndex);
if (!pucMacAddr) {
DBGLOG(REQ, ERROR, "Addr of WlanIndex %d is not found!\n",
ucWlanIndex);
i4BytesWritten = -1;
goto out;
}
COPY_MAC_ADDR(prQueryStaStatistics->aucMacAddr, pucMacAddr);
rStatus = kalIoctl(prGlueInfo, wlanoidQueryStaStatistics,
prQueryStaStatistics,
sizeof(struct PARAM_GET_STA_STATISTICS),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "Query prQueryStaStatistics failed!\n");
i4BytesWritten = -1;
goto out;
}
if (pucMacAddr) {
i4BytesWritten = priv_driver_dump_stat_info(prAdapter,
pcCommand, i4TotalLen, prHwWlanInfo,
prQueryStaStatistics, fgResetCnt, u4StatGroup);
}
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
out:
if (prHwWlanInfo)
kalMemFree(prHwWlanInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_HW_WLAN_INFO));
if (prQueryStaStatistics)
kalMemFree(prQueryStaStatistics, VIR_MEM_TYPE,
sizeof(struct PARAM_GET_STA_STATISTICS));
if (fgResetCnt)
nicRxClearStatistics(prGlueInfo->prAdapter);
return i4BytesWritten;
}
static int32_t priv_driver_dump_stat2_info(struct ADAPTER *prAdapter,
IN char *pcCommand, IN int i4TotalLen,
struct UMAC_STAT2_GET *prUmacStat2GetInfo,
struct PARAM_GET_DRV_STATISTICS *prQueryDrvStatistics)
{
int32_t i4BytesWritten = 0;
uint16_t u2PleTotalRevPage = 0;
uint16_t u2PleTotalSrcPage = 0;
uint16_t u2PseTotalRevPage = 0;
uint16_t u2PseTotalSrcPage = 0;
u2PleTotalRevPage = prUmacStat2GetInfo->u2PleRevPgHif0Group0 +
prUmacStat2GetInfo->u2PleRevPgCpuGroup2;
u2PleTotalSrcPage = prUmacStat2GetInfo->u2PleSrvPgHif0Group0 +
prUmacStat2GetInfo->u2PleSrvPgCpuGroup2;
u2PseTotalRevPage = prUmacStat2GetInfo->u2PseRevPgHif0Group0 +
prUmacStat2GetInfo->u2PseRevPgHif1Group1 +
prUmacStat2GetInfo->u2PseRevPgCpuGroup2 +
prUmacStat2GetInfo->u2PseRevPgLmac0Group3 +
prUmacStat2GetInfo->u2PseRevPgLmac1Group4 +
prUmacStat2GetInfo->u2PseRevPgLmac2Group5 +
prUmacStat2GetInfo->u2PseRevPgPleGroup6;
u2PseTotalSrcPage = prUmacStat2GetInfo->u2PseSrvPgHif0Group0 +
prUmacStat2GetInfo->u2PseSrvPgHif1Group1 +
prUmacStat2GetInfo->u2PseSrvPgCpuGroup2 +
prUmacStat2GetInfo->u2PseSrvPgLmac0Group3 +
prUmacStat2GetInfo->u2PseSrvPgLmac1Group4 +
prUmacStat2GetInfo->u2PseSrvPgLmac2Group5 +
prUmacStat2GetInfo->u2PseSrvPgPleGroup6;
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n----- Stat2 Info -----\n");
/* Rev Page number Info. */
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n----- PLE Reservation Page Info. -----\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Ple Hif0 Group0 RevPage", " = ",
prUmacStat2GetInfo->u2PleRevPgHif0Group0);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Ple Cpu Group2 RevPage", " = ",
prUmacStat2GetInfo->u2PleRevPgCpuGroup2);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Ple Total RevPage", " = ",
u2PleTotalRevPage);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n----- PLE Source Page Info. ----------\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Ple Hif0 Group0 SrcPage", " = ",
prUmacStat2GetInfo->u2PleSrvPgHif0Group0);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Ple Cpu Group2 SrcPage", " = ",
prUmacStat2GetInfo->u2PleSrvPgCpuGroup2);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Ple Total SrcPage", " = ",
u2PleTotalSrcPage);
/* umac MISC Info. */
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n----- PLE Misc Info. -----------------\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "ple Total Page Number", " = ",
prUmacStat2GetInfo->u2PleTotalPageNum);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "ple Free Page Number", " = ",
prUmacStat2GetInfo->u2PleFreePageNum);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "ple FFA Page Number", " = ",
prUmacStat2GetInfo->u2PleFfaNum);
/* PSE Info. */
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n----- PSE Reservation Page Info. -----\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Hif0 Group0 RevPage", " = ",
prUmacStat2GetInfo->u2PseRevPgHif0Group0);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Hif1 Group1 RevPage", " = ",
prUmacStat2GetInfo->u2PseRevPgHif1Group1);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Cpu Group2 RevPage", " = ",
prUmacStat2GetInfo->u2PseRevPgCpuGroup2);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Lmac0 Group3 RevPage", " = ",
prUmacStat2GetInfo->u2PseRevPgLmac0Group3);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Lmac1 Group4 RevPage", " = ",
prUmacStat2GetInfo->u2PseRevPgLmac1Group4);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Lmac2 Group5 RevPage", " = ",
prUmacStat2GetInfo->u2PseRevPgLmac2Group5);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Ple Group6 RevPage", " = ",
prUmacStat2GetInfo->u2PseRevPgPleGroup6);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Total RevPage", " = ",
u2PseTotalRevPage);
/* PSE Info. */
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n----- PSE Source Page Info. ----------\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Hif0 Group0 SrcPage", " = ",
prUmacStat2GetInfo->u2PseSrvPgHif0Group0);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Hif1 Group1 SrcPage", " = ",
prUmacStat2GetInfo->u2PseSrvPgHif1Group1);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Cpu Group2 SrcPage", " = ",
prUmacStat2GetInfo->u2PseSrvPgCpuGroup2);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Lmac0 Group3 SrcPage", " = ",
prUmacStat2GetInfo->u2PseSrvPgLmac0Group3);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Lmac1 Group4 SrcPage", " = ",
prUmacStat2GetInfo->u2PseSrvPgLmac1Group4);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Lmac2 Group5 SrcPage", " = ",
prUmacStat2GetInfo->u2PseSrvPgLmac2Group5);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Ple Group6 SrcPage", " = ",
prUmacStat2GetInfo->u2PseSrvPgPleGroup6);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pse Total SrcPage", " = ",
u2PseTotalSrcPage);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n----- PSE Misc Info. -----------------\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "pse Total Page Number", " = ",
prUmacStat2GetInfo->u2PseTotalPageNum);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "pse Free Page Number", " = ",
prUmacStat2GetInfo->u2PseFreePageNum);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "pse FFA Page Number", " = ",
prUmacStat2GetInfo->u2PseFfaNum);
/* driver info */
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n\n----- DRV Stat -----------------------\n\n");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pending Data", " = ",
prQueryDrvStatistics->i4TxPendingFrameNum);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Pending Sec", " = ",
prQueryDrvStatistics->i4TxPendingSecurityFrameNum);
#if 0
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%s\n", "Tx Pending Cmd Number", " = ",
prQueryDrvStatistics->i4TxPendingCmdNum);
#endif
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Tx Pending For-pkt Number", " = ",
prQueryDrvStatistics->i4PendingFwdFrameCount);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "MsduInfo Available Number", " = ",
prQueryDrvStatistics->u4MsduNumElem);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "MgmtTxRing Pending Number", " = ",
prQueryDrvStatistics->u4TxMgmtTxringQueueNumElem);
/* Driver Rx Info. */
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Rx Free Sw Rfb Number", " = ",
prQueryDrvStatistics->u4RxFreeSwRfbMsduNumElem);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Rx Received Sw Rfb Number", " = ",
prQueryDrvStatistics->u4RxReceivedRfbNumElem);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-26s%s%d\n", "Rx Indicated Sw Rfb Number", " = ",
prQueryDrvStatistics->u4RxIndicatedNumElem);
return i4BytesWritten;
}
static int priv_driver_get_sta_stat2(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
int32_t i4BytesWritten = 0;
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4ArgNum = 1;
struct UMAC_STAT2_GET *prUmacStat2GetInfo;
struct PARAM_GET_DRV_STATISTICS *prQueryDrvStatistics;
struct QUE *prQueList, *prTxMgmtTxRingQueList;
struct RX_CTRL *prRxCtrl;
KAL_SPIN_LOCK_DECLARATION();
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc < i4ArgNum)
return -1;
prQueList = &prAdapter->rTxCtrl.rFreeMsduInfoList;
prTxMgmtTxRingQueList = &prAdapter->rTxCtrl.rTxMgmtTxingQueue;
prRxCtrl = &prAdapter->rRxCtrl;
ASSERT(prRxCtrl);
/* to do for UMAC Dump */
prUmacStat2GetInfo = (struct UMAC_STAT2_GET *)kalMemAlloc(
sizeof(struct UMAC_STAT2_GET), VIR_MEM_TYPE);
if (prUmacStat2GetInfo == NULL)
return -1;
halUmacInfoGetMiscStatus(prAdapter, prUmacStat2GetInfo);
/* Get Driver stat info */
prQueryDrvStatistics =
(struct PARAM_GET_DRV_STATISTICS *)kalMemAlloc(sizeof(
struct PARAM_GET_DRV_STATISTICS), VIR_MEM_TYPE);
if (prQueryDrvStatistics == NULL) {
kalMemFree(prUmacStat2GetInfo, VIR_MEM_TYPE,
sizeof(struct UMAC_STAT2_GET));
return -1;
}
prQueryDrvStatistics->i4TxPendingFrameNum =
(uint32_t) GLUE_GET_REF_CNT(prGlueInfo->i4TxPendingFrameNum);
prQueryDrvStatistics->i4TxPendingSecurityFrameNum =
(uint32_t) GLUE_GET_REF_CNT(
prGlueInfo->i4TxPendingSecurityFrameNum);
#if 0
prQueryDrvStatistics->i4TxPendingCmdNum =
(uint32_t) GLUE_GET_REF_CNT(prGlueInfo->i4TxPendingCmdNum);
#endif
prQueryDrvStatistics->i4PendingFwdFrameCount =
prAdapter->rTxCtrl.i4PendingFwdFrameCount;
KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
prQueryDrvStatistics->u4MsduNumElem = prQueList->u4NumElem;
KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TX_MSDU_INFO_LIST);
KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_TXING_MGMT_LIST);
prQueryDrvStatistics->u4TxMgmtTxringQueueNumElem =
prTxMgmtTxRingQueList->u4NumElem;
KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_TXING_MGMT_LIST);
KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_FREE_QUE);
prQueryDrvStatistics->u4RxFreeSwRfbMsduNumElem =
prRxCtrl->rFreeSwRfbList.u4NumElem;
KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_FREE_QUE);
KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
prQueryDrvStatistics->u4RxReceivedRfbNumElem =
prRxCtrl->rReceivedRfbList.u4NumElem;
KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_QUE);
KAL_ACQUIRE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_FREE_QUE);
prQueryDrvStatistics->u4RxIndicatedNumElem =
prRxCtrl->rIndicatedRfbList.u4NumElem;
KAL_RELEASE_SPIN_LOCK(prAdapter, SPIN_LOCK_RX_FREE_QUE);
i4BytesWritten = priv_driver_dump_stat2_info(prAdapter, pcCommand,
i4TotalLen, prUmacStat2GetInfo, prQueryDrvStatistics);
kalMemFree(prUmacStat2GetInfo, VIR_MEM_TYPE,
sizeof(struct UMAC_STAT2_GET));
kalMemFree(prQueryDrvStatistics, VIR_MEM_TYPE,
sizeof(struct PARAM_GET_DRV_STATISTICS));
return i4BytesWritten;
}
static int32_t priv_driver_dump_rx_stat_info(struct ADAPTER *prAdapter,
IN char *pcCommand, IN int i4TotalLen,
IN u_int8_t fgResetCnt)
{
int32_t i4BytesWritten = 0;
uint32_t u4RxVector0 = 0, u4RxVector2 = 0, u4RxVector3 = 0,
u4RxVector4 = 0;
uint8_t ucStaIdx, ucWlanIndex, cbw;
u_int8_t fgWlanIdxFound = TRUE, fgSkipRxV = FALSE;
uint32_t u4FAGCRssiWBR0, u4FAGCRssiIBR0;
uint32_t u4Value, u4Foe, foe_const;
static uint32_t au4MacMdrdy[ENUM_BAND_NUM] = {0};
static uint32_t au4FcsError[ENUM_BAND_NUM] = {0};
static uint32_t au4OutOfResource[ENUM_BAND_NUM] = {0};
static uint32_t au4LengthMismatch[ENUM_BAND_NUM] = {0};
au4MacMdrdy[ENUM_BAND_0] += htonl(g_HqaRxStat.MAC_Mdrdy);
au4MacMdrdy[ENUM_BAND_1] += htonl(g_HqaRxStat.MAC_Mdrdy1);
au4FcsError[ENUM_BAND_0] += htonl(g_HqaRxStat.MAC_FCS_Err);
au4FcsError[ENUM_BAND_1] += htonl(g_HqaRxStat.MAC_FCS_Err1);
au4OutOfResource[ENUM_BAND_0] += htonl(g_HqaRxStat.OutOfResource);
au4OutOfResource[ENUM_BAND_1] += htonl(g_HqaRxStat.OutOfResource1);
au4LengthMismatch[ENUM_BAND_0] += htonl(
g_HqaRxStat.LengthMismatchCount_B0);
au4LengthMismatch[ENUM_BAND_1] += htonl(
g_HqaRxStat.LengthMismatchCount_B1);
if (fgResetCnt) {
kalMemZero(au4MacMdrdy, sizeof(au4MacMdrdy));
kalMemZero(au4FcsError, sizeof(au4FcsError));
kalMemZero(au4OutOfResource, sizeof(au4OutOfResource));
kalMemZero(au4LengthMismatch, sizeof(au4LengthMismatch));
}
if (prAdapter->prAisBssInfo->prStaRecOfAP)
ucWlanIndex =
prAdapter->prAisBssInfo->prStaRecOfAP->ucWlanIndex;
else if (!wlanGetWlanIdxByAddress(prAdapter, NULL, &ucWlanIndex))
fgWlanIdxFound = FALSE;
if (fgWlanIdxFound) {
if (wlanGetStaIdxByWlanIdx(prAdapter, ucWlanIndex, &ucStaIdx)
== WLAN_STATUS_SUCCESS) {
u4RxVector0 = prAdapter->arStaRec[ucStaIdx].u4RxVector0;
u4RxVector2 = prAdapter->arStaRec[ucStaIdx].u4RxVector2;
u4RxVector3 = prAdapter->arStaRec[ucStaIdx].u4RxVector3;
u4RxVector4 = prAdapter->arStaRec[ucStaIdx].u4RxVector4;
} else{
fgSkipRxV = TRUE;
}
} else{
fgSkipRxV = TRUE;
}
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s", "\n\nRX Stat:\n");
#if 0
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "PER0", " = ",
g_HqaRxStat.PER0);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "PER1", " = ",
g_HqaRxStat.PER1);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "RX OK0", " = ",
g_HqaRxStat.RXOK0);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "RX OK1", " = ",
g_HqaRxStat.RXOK1);
#endif
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "MAC Mdrdy0", " = ",
au4MacMdrdy[ENUM_BAND_0]);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "MAC Mdrdy1", " = ",
au4MacMdrdy[ENUM_BAND_1]);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "FCS Err0", " = ",
au4FcsError[ENUM_BAND_0]);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "FCS Err1", " = ",
au4FcsError[ENUM_BAND_1]);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK PD Cnt B0", " = ",
htonl(g_HqaRxStat.CCK_PD));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK PD Cnt B1", " = ",
htonl(g_HqaRxStat.CCK_PD_Band1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK SIG Err B0", " = ",
htonl(g_HqaRxStat.CCK_SIG_Err));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK SIG Err B1", " = ",
htonl(g_HqaRxStat.CCK_SIG_Err_Band1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM PD Cnt B0", " = ",
htonl(g_HqaRxStat.OFDM_PD));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM PD Cnt B1", " = ",
htonl(g_HqaRxStat.OFDM_PD_Band1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM TAG Error", " = ",
htonl(g_HqaRxStat.OFDM_TAG_Err));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK SFD Err B0", " = ",
htonl(g_HqaRxStat.CCK_SFD_Err));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK SFD Err B1", " = ",
htonl(g_HqaRxStat.CCK_SFD_Err_Band1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM SIG Err B0", " = ",
htonl(g_HqaRxStat.OFDM_SIG_Err));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM SIG Err B1", " = ",
htonl(g_HqaRxStat.OFDM_SIG_Err_Band1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK FCS Err B0", " = ",
htonl(g_HqaRxStat.FCSErr_CCK));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK FCS Err B1", " = ",
htonl(g_HqaRxStat.CCK_FCS_Err_Band1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM FCS Err B0", " = ",
htonl(g_HqaRxStat.FCSErr_OFDM));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM FCS Err B1", " = ",
htonl(g_HqaRxStat.OFDM_FCS_Err_Band1));
if (!fgSkipRxV) {
u4FAGCRssiIBR0 = (u4RxVector2 & BITS(16, 23)) >> 16;
u4FAGCRssiWBR0 = (u4RxVector2 & BITS(24, 31)) >> 24;
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "FAGC RSSI W", " = ",
(u4FAGCRssiWBR0 >= 128) ? (u4FAGCRssiWBR0 - 256) :
(u4FAGCRssiWBR0));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "FAGC RSSI I", " = ",
(u4FAGCRssiIBR0 >= 128) ? (u4FAGCRssiIBR0 - 256) :
(u4FAGCRssiIBR0));
} else{
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "FAGC RSSI W", " = ", "N/A");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "FAGC RSSI I", " = ", "N/A");
}
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK MDRDY B0", " = ",
htonl(g_HqaRxStat.PhyMdrdyCCK));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "CCK MDRDY B1", " = ",
htonl(g_HqaRxStat.PHY_CCK_MDRDY_Band1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM MDRDY B0", " = ",
htonl(g_HqaRxStat.PhyMdrdyOFDM));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OFDM MDRDY B1", " = ",
htonl(g_HqaRxStat.PHY_OFDM_MDRDY_Band1));
if (!fgSkipRxV) {
#if 0
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Driver RX Cnt0", " = ",
htonl(g_HqaRxStat.DriverRxCount));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Driver RX Cnt1", " = ",
htonl(g_HqaRxStat.DriverRxCount1));
#endif
u4Value = (u4RxVector0 & BITS(12, 14)) >> 12;
if (u4Value == 0) {
u4Foe = (((u4RxVector4 & BITS(7, 31)) >> 7) & 0x7ff);
u4Foe = (u4Foe * 1000)>>11;
} else{
cbw = ((u4RxVector0 & BITS(15, 16)) >> 15);
foe_const = ((1 << (cbw + 1)) & 0xf) * 10000;
u4Foe = (((u4RxVector4 & BITS(7, 31)) >> 7) & 0xfff);
u4Foe = (u4Foe * foe_const) >> 15;
}
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Freq Offset From RX", " = ", u4Foe);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "RX SNR (dB)", " = ",
(uint32_t)(((u4RxVector4 & BITS(26, 31)) >> 26) - 16));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "uint8_t RX0", " = ",
(uint32_t)(u4RxVector3 & BITS(0, 7)));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "uint8_t RX1", " = ",
(uint32_t)((u4RxVector3 & BITS(8, 15)) >> 8));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "uint8_t RX2", " = ",
((u4RxVector3 & BITS(16, 23)) >> 16) == 0xFF ?
(0) : ((uint32_t)(u4RxVector3 & BITS(16, 23)) >> 16));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "uint8_t RX3", " = ",
((u4RxVector3 & BITS(24, 31)) >> 24) == 0xFF ?
(0) : ((uint32_t)(u4RxVector3 & BITS(24, 31)) >> 24));
} else{
#if 0
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Driver RX Cnt0",
" = ", "N/A");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "Driver RX Cnt1",
" = ", "N/A");
#endif
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n",
"Freq Offset From RX",
" = ", "N/A");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "RX SNR (dB)",
" = ", "N/A");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "uint8_t RX0",
" = ", "N/A");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "uint8_t RX1",
" = ", "N/A");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "uint8_t RX2",
" = ", "N/A");
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%s\n", "uint8_t RX3",
" = ", "N/A");
}
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Inst RSSI IB R0", " = ",
htonl(g_HqaRxStat.InstRssiIBR0));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Inst RSSI WB R0", " = ",
htonl(g_HqaRxStat.InstRssiWBR0));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Inst RSSI IB R1", " = ",
htonl(g_HqaRxStat.InstRssiIBR1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Inst RSSI WB R1", " = ",
htonl(g_HqaRxStat.InstRssiWBR1));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Inst RSSI IB R2", " = ",
htonl(g_HqaRxStat.InstRssiIBR2));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Inst RSSI WB R2", " = ",
htonl(g_HqaRxStat.InstRssiWBR2));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Inst RSSI IB R3", " = ",
htonl(g_HqaRxStat.InstRssiIBR3));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Inst RSSI WB R3", " = ",
htonl(g_HqaRxStat.InstRssiWBR3));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "ACI Hit Lower", " = ",
htonl(g_HqaRxStat.ACIHitLower));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "ACI Hit Higher",
" = ", htonl(g_HqaRxStat.ACIHitUpper));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OutOf Resource Pkt0",
" = ", au4OutOfResource[ENUM_BAND_0]);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "OutOf Resource Pkt1",
" = ", au4OutOfResource[ENUM_BAND_1]);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Len Mismatch Cnt B0",
" = ", au4LengthMismatch[ENUM_BAND_0]);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "Len Mismatch Cnt B1",
" = ", au4LengthMismatch[ENUM_BAND_1]);
#if 0
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%-20s%s%d\n", "MU RX Cnt", " = ",
htonl(g_HqaRxStat.MRURxCount));
#endif
return i4BytesWritten;
}
static int priv_driver_show_rx_stat(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct PARAM_CUSTOM_ACCESS_RX_STAT *prRxStatisticsTest;
u_int8_t fgResetCnt = FALSE;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint32_t u4Id = 0x99980000;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
DBGLOG(INIT, ERROR, "MT6632 : priv_driver_show_rx_stat\n");
if (i4Argc >= 2) {
if (strnicmp(apcArgv[1], CMD_STAT_RESET_CNT,
strlen(CMD_STAT_RESET_CNT)) == 0)
fgResetCnt = TRUE;
}
if (i4Argc >= 1) {
if (fgResetCnt) {
rSwCtrlInfo.u4Id = u4Id;
rSwCtrlInfo.u4Data = 0;
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
prRxStatisticsTest =
(struct PARAM_CUSTOM_ACCESS_RX_STAT *)kalMemAlloc(
sizeof(struct PARAM_CUSTOM_ACCESS_RX_STAT),
VIR_MEM_TYPE);
if (!prRxStatisticsTest)
return -1;
prRxStatisticsTest->u4SeqNum = u4RxStatSeqNum;
prRxStatisticsTest->u4TotalNum =
sizeof(struct PARAM_RX_STAT) / 4;
rStatus = kalIoctl(prGlueInfo, wlanoidQueryRxStatistics,
prRxStatisticsTest,
sizeof(struct PARAM_CUSTOM_ACCESS_RX_STAT),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
kalMemFree(prRxStatisticsTest, VIR_MEM_TYPE,
sizeof(struct PARAM_CUSTOM_ACCESS_RX_STAT));
return -1;
}
i4BytesWritten = priv_driver_dump_rx_stat_info(prAdapter,
pcCommand, i4TotalLen, fgResetCnt);
kalMemFree(prRxStatisticsTest, VIR_MEM_TYPE,
sizeof(struct PARAM_CUSTOM_ACCESS_RX_STAT));
}
return i4BytesWritten;
}
static int priv_driver_get_ipi(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int32_t u4Ret = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct PARAM_GET_IPI_INFO_T rCmdGetIpiInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
kalMemZero(&rCmdGetIpiInfo, sizeof(struct PARAM_GET_IPI_INFO_T));
if (i4Argc >= 3) {
u4Ret = kalkStrtou32(apcArgv[1], 0,
&(rCmdGetIpiInfo.u4DurInSec));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_ipi error (DurInSec) u4Ret=%d\n",
u4Ret);
u4Ret = kalkStrtou32(apcArgv[2], 0,
&(rCmdGetIpiInfo.u4Interval));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_ipi error (Interval) u4Ret=%d\n",
u4Ret);
rStatus = kalIoctl(prGlueInfo, wlanoidGetIpiInfo,
&rCmdGetIpiInfo, sizeof(rCmdGetIpiInfo),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
return i4BytesWritten;
}
/*----------------------------------------------------------------------------*/
/*
* @ The function will set policy of ACL.
* 0: disable ACL
* 1: enable accept list
* 2: enable deny list
* example: iwpriv p2p0 driver "set_acl_policy 1"
*/
/*----------------------------------------------------------------------------*/
static int priv_driver_set_acl_policy(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Argc = 0, i4BytesWritten = 0, i4Ret = 0, i4Policy = 0;
uint8_t ucRoleIdx = 0, ucBssIdx = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
return -1;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS)
return -1;
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
DBGLOG(REQ, LOUD, "ucRoleIdx %hhu ucBssIdx %hhu\n", ucRoleIdx,
ucBssIdx);
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc < 2)
return -1;
i4Ret = kalkStrtou32(apcArgv[1], 0, &i4Policy);
if (i4Ret) {
DBGLOG(REQ, ERROR, "integer format error i4Ret=%d\n", i4Ret);
return -1;
}
switch (i4Policy) {
case PARAM_CUSTOM_ACL_POLICY_DISABLE:
case PARAM_CUSTOM_ACL_POLICY_ACCEPT:
case PARAM_CUSTOM_ACL_POLICY_DENY:
prBssInfo->rACL.ePolicy = i4Policy;
break;
default: /*Invalid argument */
DBGLOG(REQ, ERROR, "Invalid ACL Policy=%d\n", i4Policy);
return -1;
}
DBGLOG(REQ, TRACE, "ucBssIdx[%hhu] ACL Policy=%d\n", ucBssIdx,
prBssInfo->rACL.ePolicy);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"ucBssIdx[%hhu] ACL Policy=%d\n",
ucBssIdx, prBssInfo->rACL.ePolicy);
/* check if the change in ACL affects any existent association */
if (prBssInfo->rACL.ePolicy != PARAM_CUSTOM_ACL_POLICY_DISABLE)
p2pRoleUpdateACLEntry(prAdapter, ucBssIdx);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
return i4BytesWritten;
} /* priv_driver_set_acl_policy */
static int32_t priv_driver_inspect_mac_addr(IN char *pcMacAddr)
{
int32_t i = 0;
if (pcMacAddr == NULL)
return -1;
for (i = 0; i < 17; i++) {
if ((i % 3 != 2) && (!kalIsXdigit(pcMacAddr[i]))) {
DBGLOG(REQ, ERROR, "[%c] is not hex digit\n",
pcMacAddr[i]);
return -1;
}
if ((i % 3 == 2) && (pcMacAddr[i] != ':')) {
DBGLOG(REQ, ERROR, "[%c]separate symbol is error\n",
pcMacAddr[i]);
return -1;
}
}
if (pcMacAddr[17] != '\0') {
DBGLOG(REQ, ERROR, "no null-terminated character\n");
return -1;
}
return 0;
}
/*----------------------------------------------------------------------------*/
/*
* @ The function will add entry to ACL for accept or deny list.
* example: iwpriv p2p0 driver "add_acl_entry 01:02:03:04:05:06"
*/
/*----------------------------------------------------------------------------*/
static int priv_driver_add_acl_entry(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint8_t aucMacAddr[MAC_ADDR_LEN] = {0};
int32_t i = 0, i4Argc = 0, i4BytesWritten = 0, i4Ret = 0;
uint8_t ucRoleIdx = 0, ucBssIdx = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
return -1;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS)
return -1;
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
DBGLOG(REQ, LOUD, "ucRoleIdx %hhu ucBssIdx %hhu\n", ucRoleIdx,
ucBssIdx);
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc < 2)
return -1;
i4Ret = priv_driver_inspect_mac_addr(apcArgv[1]);
if (i4Ret) {
DBGLOG(REQ, ERROR, "inspect mac format error u4Ret=%d\n",
i4Ret);
return -1;
}
i4Ret = sscanf(apcArgv[1], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
&aucMacAddr[0], &aucMacAddr[1], &aucMacAddr[2],
&aucMacAddr[3], &aucMacAddr[4], &aucMacAddr[5]);
if (i4Ret != MAC_ADDR_LEN) {
DBGLOG(REQ, ERROR, "sscanf mac format fail u4Ret=%d\n", i4Ret);
return -1;
}
for (i = 0; i <= prBssInfo->rACL.u4Num; i++) {
if (memcmp(prBssInfo->rACL.rEntry[i].aucAddr, &aucMacAddr,
MAC_ADDR_LEN) == 0) {
DBGLOG(REQ, ERROR, "add this mac [" MACSTR
"] is duplicate.\n", MAC2STR(aucMacAddr));
return -1;
}
}
if ((i < 1) || (i > MAX_NUMBER_OF_ACL)) {
DBGLOG(REQ, ERROR, "idx[%d] error or ACL is full.\n", i);
return -1;
}
memcpy(prBssInfo->rACL.rEntry[i-1].aucAddr, &aucMacAddr, MAC_ADDR_LEN);
prBssInfo->rACL.u4Num = i;
DBGLOG(REQ, TRACE, "add mac addr [" MACSTR "] to ACL(%d).\n",
MAC2STR(prBssInfo->rACL.rEntry[i-1].aucAddr), i);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"add mac addr [" MACSTR "] to ACL(%d)\n",
MAC2STR(prBssInfo->rACL.rEntry[i-1].aucAddr),
i);
/* Check if the change in ACL affects any existent association. */
if (prBssInfo->rACL.ePolicy == PARAM_CUSTOM_ACL_POLICY_DENY)
p2pRoleUpdateACLEntry(prAdapter, ucBssIdx);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
return i4BytesWritten;
} /* priv_driver_add_acl_entry */
/*----------------------------------------------------------------------------*/
/*
* @ The function will delete entry to ACL for accept or deny list.
* example: iwpriv p2p0 driver "add_del_entry 01:02:03:04:05:06"
*/
/*----------------------------------------------------------------------------*/
static int priv_driver_del_acl_entry(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint8_t aucMacAddr[MAC_ADDR_LEN] = {0};
int32_t i = 0, j = 0, i4Argc = 0, i4BytesWritten = 0, i4Ret = 0;
uint8_t ucRoleIdx = 0, ucBssIdx = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
return -1;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS)
return -1;
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
DBGLOG(REQ, LOUD, "ucRoleIdx %hhu ucBssIdx %hhu\n", ucRoleIdx,
ucBssIdx);
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc < 2)
return -1;
i4Ret = priv_driver_inspect_mac_addr(apcArgv[1]);
if (i4Ret) {
DBGLOG(REQ, ERROR, "inspect mac format error u4Ret=%d\n",
i4Ret);
return -1;
}
i4Ret = sscanf(apcArgv[1], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
&aucMacAddr[0], &aucMacAddr[1], &aucMacAddr[2],
&aucMacAddr[3], &aucMacAddr[4], &aucMacAddr[5]);
if (i4Ret != MAC_ADDR_LEN) {
DBGLOG(REQ, ERROR, "sscanf mac format fail u4Ret=%d\n", i4Ret);
return -1;
}
for (i = 0; i < prBssInfo->rACL.u4Num; i++) {
if (memcmp(prBssInfo->rACL.rEntry[i].aucAddr, &aucMacAddr,
MAC_ADDR_LEN) == 0) {
memset(&prBssInfo->rACL.rEntry[i], 0x00,
sizeof(struct PARAM_CUSTOM_ACL_ENTRY));
DBGLOG(REQ, TRACE, "delete this mac [" MACSTR "]\n",
MAC2STR(aucMacAddr));
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"delete this mac [" MACSTR "] from ACL(%d)\n",
MAC2STR(aucMacAddr), i+1);
break;
}
}
if ((prBssInfo->rACL.u4Num == 0) || (i == MAX_NUMBER_OF_ACL)) {
DBGLOG(REQ, ERROR, "delete entry fail, num of entries=%d\n", i);
return -1;
}
for (j = i+1; j < prBssInfo->rACL.u4Num; j++)
memcpy(prBssInfo->rACL.rEntry[j-1].aucAddr,
prBssInfo->rACL.rEntry[j].aucAddr, MAC_ADDR_LEN);
prBssInfo->rACL.u4Num = j-1;
memset(prBssInfo->rACL.rEntry[j-1].aucAddr, 0x00, MAC_ADDR_LEN);
/* check if the change in ACL affects any existent association */
if (prBssInfo->rACL.ePolicy == PARAM_CUSTOM_ACL_POLICY_ACCEPT)
p2pRoleUpdateACLEntry(prAdapter, ucBssIdx);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
return i4BytesWritten;
} /* priv_driver_del_acl_entry */
/*----------------------------------------------------------------------------*/
/*
* @ The function will show all entries to ACL for accept or deny list.
* example: iwpriv p2p0 driver "show_acl_entry"
*/
/*----------------------------------------------------------------------------*/
static int priv_driver_show_acl_entry(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i = 0, i4Argc = 0, i4BytesWritten = 0;
uint8_t ucRoleIdx = 0, ucBssIdx = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
return -1;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS)
return -1;
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
DBGLOG(REQ, TRACE, "ACL Policy = %d\n", prBssInfo->rACL.ePolicy);
DBGLOG(REQ, TRACE, "Total ACLs = %d\n", prBssInfo->rACL.u4Num);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"ACL Policy = %d, Total ACLs = %d\n",
prBssInfo->rACL.ePolicy,
prBssInfo->rACL.u4Num);
for (i = 0; i < prBssInfo->rACL.u4Num; i++) {
DBGLOG(REQ, TRACE, "ACL(%d): [" MACSTR "]\n", i+1,
MAC2STR(prBssInfo->rACL.rEntry[i].aucAddr));
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "ACL(%d): [" MACSTR
"]\n", i+1, MAC2STR(prBssInfo->rACL.rEntry[i].aucAddr));
}
return i4BytesWritten;
} /* priv_driver_show_acl_entry */
/*----------------------------------------------------------------------------*/
/*
* @ The function will clear all entries to ACL for accept or deny list.
* example: iwpriv p2p0 driver "clear_acl_entry"
*/
/*----------------------------------------------------------------------------*/
static int priv_driver_clear_acl_entry(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Argc = 0, i4BytesWritten = 0;
uint8_t ucRoleIdx = 0, ucBssIdx = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
return -1;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS)
return -1;
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (prBssInfo->rACL.u4Num) {
memset(&prBssInfo->rACL.rEntry[0], 0x00,
sizeof(struct PARAM_CUSTOM_ACL_ENTRY) * MAC_ADDR_LEN);
prBssInfo->rACL.u4Num = 0;
}
DBGLOG(REQ, TRACE, "ACL Policy = %d\n", prBssInfo->rACL.ePolicy);
DBGLOG(REQ, TRACE, "Total ACLs = %d\n", prBssInfo->rACL.u4Num);
i4BytesWritten += kalSnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"ACL Policy = %d, Total ACLs = %d\n",
prBssInfo->rACL.ePolicy,
prBssInfo->rACL.u4Num);
/* check if the change in ACL affects any existent association */
if (prBssInfo->rACL.ePolicy == PARAM_CUSTOM_ACL_POLICY_ACCEPT)
p2pRoleUpdateACLEntry(prAdapter, ucBssIdx);
return i4BytesWritten;
} /* priv_driver_clear_acl_entry */
static int priv_driver_get_drv_mcr(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret;
/* Add Antenna Selection Input */
/* INT_32 i4ArgNum_with_ant_sel = 3; */
int32_t i4ArgNum = 2;
struct CMD_ACCESS_REG rCmdAccessReg;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rCmdAccessReg.u4Address));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_drv_mcr error (Address) u4Ret=%d\n",
u4Ret);
/* rCmdAccessReg.u4Address = kalStrtoul(apcArgv[1], NULL, 0); */
rCmdAccessReg.u4Data = 0;
DBGLOG(REQ, LOUD, "address is %x\n", rCmdAccessReg.u4Address);
rStatus = kalIoctl(prGlueInfo, wlanoidQueryDrvMcrRead,
&rCmdAccessReg, sizeof(rCmdAccessReg),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "0x%08x",
(unsigned int)rCmdAccessReg.u4Data);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__,
pcCommand);
}
return i4BytesWritten;
} /* priv_driver_get_drv_mcr */
int priv_driver_set_drv_mcr(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret;
/* Add Antenna Selection Input */
/* INT_32 i4ArgNum_with_ant_sel = 4; */
int32_t i4ArgNum = 3;
struct CMD_ACCESS_REG rCmdAccessReg;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rCmdAccessReg.u4Address));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_drv_mcr error (Address) u4Ret=%d\n",
u4Ret);
u4Ret = kalkStrtou32(apcArgv[2], 0, &(rCmdAccessReg.u4Data));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse get_drv_mcr error (Data) u4Ret=%d\n",
u4Ret);
rStatus = kalIoctl(prGlueInfo, wlanoidSetDrvMcrWrite,
&rCmdAccessReg, sizeof(rCmdAccessReg),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_sw_ctrl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t u4Ret = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= 2) {
/* rSwCtrlInfo.u4Id = kalStrtoul(apcArgv[1], NULL, 0); */
rSwCtrlInfo.u4Data = 0;
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rSwCtrlInfo.u4Id));
if (u4Ret)
DBGLOG(REQ, LOUD, "parse rSwCtrlInfo error u4Ret=%d\n",
u4Ret);
DBGLOG(REQ, LOUD, "id is %x\n", rSwCtrlInfo.u4Id);
rStatus = kalIoctl(prGlueInfo, wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "0x%08x",
(unsigned int)rSwCtrlInfo.u4Data);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__,
pcCommand);
}
return i4BytesWritten;
} /* priv_driver_get_sw_ctrl */
int priv_driver_set_sw_ctrl(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= 3) {
/* rSwCtrlInfo.u4Id = kalStrtoul(apcArgv[1], NULL, 0);
* rSwCtrlInfo.u4Data = kalStrtoul(apcArgv[2], NULL, 0);
*/
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rSwCtrlInfo.u4Id));
if (u4Ret)
DBGLOG(REQ, LOUD, "parse rSwCtrlInfo error u4Ret=%d\n",
u4Ret);
u4Ret = kalkStrtou32(apcArgv[2], 0, &(rSwCtrlInfo.u4Data));
if (u4Ret)
DBGLOG(REQ, LOUD, "parse rSwCtrlInfo error u4Ret=%d\n",
u4Ret);
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
return i4BytesWritten;
} /* priv_driver_set_sw_ctrl */
int priv_driver_set_fixed_rate(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
/* INT_32 u4Ret = 0; */
uint32_t u4WCID = 0;
uint32_t u4Mode = 0, u4Bw = 0, u4Mcs = 0, u4VhtNss = 0;
uint32_t u4SGI = 0, u4Preamble = 0, u4STBC = 0, u4LDPC = 0, u4SpeEn = 0;
int32_t i4Recv = 0;
int8_t *this_char = NULL;
uint32_t u4Id = 0xa0610000;
uint32_t u4Data = 0x80000000;
uint32_t u4Id2 = 0xa0600000;
uint8_t u4Nsts = 1;
u_int8_t fgStatus = TRUE;
static uint8_t fgIsUseWCID = FALSE;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
this_char = kalStrStr(*apcArgv, "=");
if (!this_char)
return -1;
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
if (strnicmp(this_char, "auto", strlen("auto")) == 0) {
i4Recv = 1;
} else if (strnicmp(this_char, "UseWCID", strlen("UseWCID")) == 0) {
i4Recv = 2;
fgIsUseWCID = TRUE;
} else if (strnicmp(this_char, "ApplyAll", strlen("ApplyAll")) == 0) {
i4Recv = 3;
fgIsUseWCID = FALSE;
} else {
i4Recv = sscanf(this_char, "%d-%d-%d-%d-%d-%d-%d-%d-%d-%d",
&(u4WCID), &(u4Mode), &(u4Bw), &(u4Mcs),
&(u4VhtNss), &(u4SGI), &(u4Preamble), &(u4STBC),
&(u4LDPC), &(u4SpeEn));
DBGLOG(REQ, LOUD, "u4WCID=%d\nu4Mode=%d\nu4Bw=%d\n", u4WCID,
u4Mode, u4Bw);
DBGLOG(REQ, LOUD, "u4Mcs=%d\nu4VhtNss=%d\nu4SGI=%d\n", u4Mcs,
u4VhtNss, u4SGI);
DBGLOG(REQ, LOUD, "u4Preamble=%d\nu4STBC=%d\n", u4Preamble,
u4STBC);
DBGLOG(REQ, LOUD, "u4LDPC=%d\nu4SpeEn=%d\nfgIsUseWCID=%d\n",
u4LDPC, u4SpeEn, fgIsUseWCID);
}
if (i4Recv == 1) {
rSwCtrlInfo.u4Id = u4Id2;
rSwCtrlInfo.u4Data = 0;
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
} else if (i4Recv == 2 || i4Recv == 3) {
i4BytesWritten = snprintf(pcCommand, i4TotalLen,
"Update fgIsUseWCID %d\n", fgIsUseWCID);
} else if (i4Recv == 10) {
rSwCtrlInfo.u4Id = u4Id;
rSwCtrlInfo.u4Data = u4Data;
if (fgIsUseWCID && u4WCID < WTBL_SIZE &&
prAdapter->rWifiVar.arWtbl[u4WCID].ucUsed) {
rSwCtrlInfo.u4Id |= u4WCID;
rSwCtrlInfo.u4Id |= BIT(8);
i4BytesWritten = snprintf(
pcCommand, i4TotalLen,
"Apply WCID %d\n", u4WCID);
} else {
i4BytesWritten = snprintf(
pcCommand, i4TotalLen, "Apply All\n");
}
if (u4SGI)
rSwCtrlInfo.u4Data |= BIT(30);
if (u4LDPC)
rSwCtrlInfo.u4Data |= BIT(29);
if (u4SpeEn)
rSwCtrlInfo.u4Data |= BIT(28);
if (u4STBC)
rSwCtrlInfo.u4Data |= BIT(11);
if (u4Bw <= 3)
rSwCtrlInfo.u4Data |= ((u4Bw << 26) & BITS(26, 27));
else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"Wrong BW! BW20=0, BW40=1, BW80=2,BW160=3\n");
}
if (u4Mode <= 4) {
rSwCtrlInfo.u4Data |= ((u4Mode << 6) & BITS(6, 8));
switch (u4Mode) {
case 0:
if (u4Mcs <= 3)
rSwCtrlInfo.u4Data |= u4Mcs;
else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"CCK mode but wrong MCS!\n");
}
if (u4Preamble)
rSwCtrlInfo.u4Data |= BIT(2);
else
rSwCtrlInfo.u4Data &= ~BIT(2);
break;
case 1:
switch (u4Mcs) {
case 0:
/* 6'b001011 */
rSwCtrlInfo.u4Data |= 11;
break;
case 1:
/* 6'b001111 */
rSwCtrlInfo.u4Data |= 15;
break;
case 2:
/* 6'b001010 */
rSwCtrlInfo.u4Data |= 10;
break;
case 3:
/* 6'b001110 */
rSwCtrlInfo.u4Data |= 14;
break;
case 4:
/* 6'b001001 */
rSwCtrlInfo.u4Data |= 9;
break;
case 5:
/* 6'b001101 */
rSwCtrlInfo.u4Data |= 13;
break;
case 6:
/* 6'b001000 */
rSwCtrlInfo.u4Data |= 8;
break;
case 7:
/* 6'b001100 */
rSwCtrlInfo.u4Data |= 12;
break;
default:
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"OFDM mode but wrong MCS!\n");
break;
}
break;
case 2:
case 3:
if (u4Mcs <= 32)
rSwCtrlInfo.u4Data |= u4Mcs;
else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"HT mode but wrong MCS!\n");
}
if (u4Mcs != 32) {
u4Nsts += (u4Mcs >> 3);
if (u4STBC && (u4Nsts == 1))
u4Nsts++;
}
break;
case 4:
if (u4Mcs <= 9)
rSwCtrlInfo.u4Data |= u4Mcs;
else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"VHT mode but wrong MCS!\n");
}
if (u4STBC && (u4VhtNss == 1))
u4Nsts++;
else
u4Nsts = u4VhtNss;
break;
default:
break;
}
} else {
fgStatus = FALSE;
DBGLOG(INIT, ERROR,
"Wrong TxMode! CCK=0, OFDM=1, HT=2, GF=3, VHT=4\n");
}
rSwCtrlInfo.u4Data |= (((u4Nsts - 1) << 9) & BITS(9, 10));
if (fgStatus) {
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
}
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
} else {
DBGLOG(INIT, ERROR, "iwpriv wlanXX driver FixedRate=Option\n");
DBGLOG(INIT, ERROR,
"Option:[WCID]-[Mode]-[BW]-[MCS]-[VhtNss]-[SGI]-[Preamble]-[STBC]-[LDPC]-[SPE_EN]\n");
DBGLOG(INIT, ERROR, "[WCID]Wireless Client ID\n");
DBGLOG(INIT, ERROR, "[Mode]CCK=0, OFDM=1, HT=2, GF=3, VHT=4\n");
DBGLOG(INIT, ERROR, "[BW]BW20=0, BW40=1, BW80=2,BW160=3\n");
DBGLOG(INIT, ERROR,
"[MCS]CCK=0~3, OFDM=0~7, HT=0~32, VHT=0~9\n");
DBGLOG(INIT, ERROR, "[VhtNss]VHT=1~4, Other=ignore\n");
DBGLOG(INIT, ERROR, "[Preamble]Long=0, Other=Short\n");
}
return i4BytesWritten;
} /* priv_driver_set_fixed_rate */
int priv_driver_set_cfg(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
struct PARAM_CUSTOM_KEY_CFG_STRUCT rKeyCfgInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prAdapter = prGlueInfo->prAdapter;
kalMemZero(&rKeyCfgInfo, sizeof(rKeyCfgInfo));
if (i4Argc >= 3) {
int8_t ucTmp[WLAN_CFG_VALUE_LEN_MAX];
uint8_t *pucCurrBuf = ucTmp;
uint8_t i = 0;
uint32_t offset = 0;
pucCurrBuf = ucTmp;
kalMemZero(ucTmp, WLAN_CFG_VALUE_LEN_MAX);
if (i4Argc == 3) {
/* no space for it, driver can't accept space in the end
* of the line
*/
/* ToDo: skip the space when parsing */
u4BufLen = kalStrLen(apcArgv[2]);
if (offset + u4BufLen > WLAN_CFG_VALUE_LEN_MAX - 1) {
DBGLOG(INIT, ERROR,
"apcArgv[2] length [%d] overrun\n",
u4BufLen);
return -1;
}
kalMemCopy(pucCurrBuf + offset, apcArgv[2], u4BufLen);
offset += u4BufLen;
} else {
for (i = 2; i < i4Argc; i++) {
u4BufLen = kalStrLen(apcArgv[i]);
if (offset + u4BufLen >
WLAN_CFG_VALUE_LEN_MAX - 1) {
DBGLOG(INIT, ERROR,
"apcArgv[%d] length [%d] overrun\n",
i, u4BufLen);
return -1;
}
kalMemCopy(pucCurrBuf + offset, apcArgv[i],
u4BufLen);
offset += u4BufLen;
}
}
DBGLOG(INIT, WARN, "Update to driver temp buffer as [%s]\n",
ucTmp);
if (kalStrLen(apcArgv[1]) > WLAN_CFG_KEY_LEN_MAX - 1) {
DBGLOG(INIT, ERROR,
"apcArgv[1] length [%lu] overrun\n",
kalStrLen(apcArgv[1]));
return -1;
}
/* wlanCfgSet(prAdapter, apcArgv[1], apcArgv[2], 0); */
/* Call by wlanoid because the set_cfg will trigger callback */
kalStrnCpy(rKeyCfgInfo.aucKey, apcArgv[1],
WLAN_CFG_KEY_LEN_MAX - 1);
kalStrnCpy(rKeyCfgInfo.aucValue, ucTmp,
WLAN_CFG_VALUE_LEN_MAX - 1);
rStatus = kalIoctl(prGlueInfo, wlanoidSetKeyCfg, &rKeyCfgInfo,
sizeof(rKeyCfgInfo), FALSE, FALSE, TRUE,
&u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
}
return i4BytesWritten;
} /* priv_driver_set_cfg */
int priv_driver_get_cfg(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int8_t aucValue[WLAN_CFG_VALUE_LEN_MAX];
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prAdapter = prGlueInfo->prAdapter;
if (i4Argc >= 2) {
/* by wlanoid ? */
if (wlanCfgGet(prAdapter, apcArgv[1], aucValue, "", 0) ==
WLAN_STATUS_SUCCESS) {
kalStrnCpy(pcCommand, aucValue, WLAN_CFG_VALUE_LEN_MAX);
i4BytesWritten = kalStrnLen(pcCommand,
WLAN_CFG_VALUE_LEN_MAX);
}
}
return i4BytesWritten;
} /* priv_driver_get_cfg */
int priv_driver_set_chip_config(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
uint32_t u4CmdLen = 0;
uint32_t u4PrefixLen = 0;
/* INT_32 i4Argc = 0; */
/* PCHAR apcArgv[WLAN_CFG_ARGV_MAX] = {0}; */
struct PARAM_CUSTOM_CHIP_CONFIG_STRUCT rChipConfigInfo = {0};
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
/* wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv); */
/* DBGLOG(REQ, LOUD,("argc is %i\n",i4Argc)); */
/* */
u4CmdLen = kalStrnLen(pcCommand, i4TotalLen);
u4PrefixLen = kalStrLen(CMD_SET_CHIP) + 1 /*space */;
kalMemZero(&rChipConfigInfo, sizeof(rChipConfigInfo));
/* if(i4Argc >= 2) { */
if (u4CmdLen > u4PrefixLen) {
rChipConfigInfo.ucType = CHIP_CONFIG_TYPE_WO_RESPONSE;
/* rChipConfigInfo.u2MsgSize = kalStrnLen(apcArgv[1],
* CHIP_CONFIG_RESP_SIZE);
*/
rChipConfigInfo.u2MsgSize = u4CmdLen - u4PrefixLen;
/* kalStrnCpy(rChipConfigInfo.aucCmd, apcArgv[1],
* CHIP_CONFIG_RESP_SIZE);
*/
kalStrnCpy(rChipConfigInfo.aucCmd, pcCommand + u4PrefixLen,
CHIP_CONFIG_RESP_SIZE - 1);
rChipConfigInfo.aucCmd[CHIP_CONFIG_RESP_SIZE - 1] = '\0';
rStatus = kalIoctl(prGlueInfo, wlanoidSetChipConfig,
&rChipConfigInfo, sizeof(rChipConfigInfo),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, INFO, "%s: kalIoctl ret=%d\n", __func__,
rStatus);
i4BytesWritten = -1;
}
}
return i4BytesWritten;
} /* priv_driver_set_chip_config */
void
priv_driver_get_chip_config_16(uint8_t *pucStartAddr, uint32_t u4Length,
uint32_t u4Line, int i4TotalLen,
int32_t i4BytesWritten, char *pcCommand)
{
while (u4Length >= 16) {
if (i4TotalLen > i4BytesWritten) {
i4BytesWritten +=
snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%04x %02x %02x %02x %02x %02x %02x %02x %02x - %02x %02x %02x %02x %02x %02x %02x %02x\n",
u4Line, pucStartAddr[0],
pucStartAddr[1], pucStartAddr[2],
pucStartAddr[3], pucStartAddr[4],
pucStartAddr[5], pucStartAddr[6],
pucStartAddr[7], pucStartAddr[8],
pucStartAddr[9], pucStartAddr[10],
pucStartAddr[11], pucStartAddr[12],
pucStartAddr[13], pucStartAddr[14],
pucStartAddr[15]);
}
pucStartAddr += 16;
u4Length -= 16;
u4Line += 16;
} /* u4Length */
}
void
priv_driver_get_chip_config_4(uint32_t *pu4StartAddr, uint32_t u4Length,
uint32_t u4Line, int i4TotalLen,
int32_t i4BytesWritten, char *pcCommand)
{
while (u4Length >= 16) {
if (i4TotalLen > i4BytesWritten) {
i4BytesWritten +=
snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%04x %08x %08x %08x %08x\n", u4Line,
pu4StartAddr[0], pu4StartAddr[1],
pu4StartAddr[2], pu4StartAddr[3]);
}
pu4StartAddr += 4;
u4Length -= 16;
u4Line += 4;
} /* u4Length */
}
int priv_driver_get_chip_config(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
uint32_t u4BufLen = 0;
uint32_t u2MsgSize = 0;
uint32_t u4CmdLen = 0;
uint32_t u4PrefixLen = 0;
/* INT_32 i4Argc = 0; */
/* PCHAR apcArgv[WLAN_CFG_ARGV_MAX]; */
struct PARAM_CUSTOM_CHIP_CONFIG_STRUCT rChipConfigInfo = {0};
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
/* wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv); */
/* DBGLOG(REQ, LOUD,("argc is %i\n",i4Argc)); */
u4CmdLen = kalStrnLen(pcCommand, i4TotalLen);
u4PrefixLen = kalStrLen(CMD_GET_CHIP) + 1 /*space */;
/* if(i4Argc >= 2) { */
if (u4CmdLen > u4PrefixLen) {
rChipConfigInfo.ucType = CHIP_CONFIG_TYPE_ASCII;
/* rChipConfigInfo.u2MsgSize = kalStrnLen(apcArgv[1],
* CHIP_CONFIG_RESP_SIZE);
*/
rChipConfigInfo.u2MsgSize = u4CmdLen - u4PrefixLen;
/* kalStrnCpy(rChipConfigInfo.aucCmd, apcArgv[1],
* CHIP_CONFIG_RESP_SIZE);
*/
kalStrnCpy(rChipConfigInfo.aucCmd, pcCommand + u4PrefixLen,
CHIP_CONFIG_RESP_SIZE - 1);
rChipConfigInfo.aucCmd[CHIP_CONFIG_RESP_SIZE - 1] = '\0';
rStatus = kalIoctl(prGlueInfo, wlanoidQueryChipConfig,
&rChipConfigInfo, sizeof(rChipConfigInfo),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, INFO, "%s: kalIoctl ret=%d\n", __func__,
rStatus);
return -1;
}
/* Check respType */
u2MsgSize = rChipConfigInfo.u2MsgSize;
DBGLOG(REQ, INFO, "%s: RespTyep %u\n", __func__,
rChipConfigInfo.ucRespType);
DBGLOG(REQ, INFO, "%s: u2MsgSize %u\n", __func__,
rChipConfigInfo.u2MsgSize);
if (u2MsgSize > sizeof(rChipConfigInfo.aucCmd)) {
DBGLOG(REQ, INFO, "%s: u2MsgSize error ret=%u\n",
__func__, rChipConfigInfo.u2MsgSize);
return -1;
}
if (u2MsgSize > 0) {
if (rChipConfigInfo.ucRespType ==
CHIP_CONFIG_TYPE_ASCII) {
i4BytesWritten =
snprintf(pcCommand + i4BytesWritten,
i4TotalLen, "%s",
rChipConfigInfo.aucCmd);
} else {
uint32_t u4Length;
uint32_t u4Line;
if (rChipConfigInfo.ucRespType ==
CHIP_CONFIG_TYPE_MEM8) {
uint8_t *pucStartAddr = NULL;
pucStartAddr = (uint8_t *)
rChipConfigInfo.aucCmd;
/* align 16 bytes because one print line
* is 16 bytes
*/
u4Length = (((u2MsgSize + 15) >> 4))
<< 4;
u4Line = 0;
priv_driver_get_chip_config_16(
pucStartAddr, u4Length, u4Line,
i4TotalLen, i4BytesWritten,
pcCommand);
} else {
uint32_t *pu4StartAddr = NULL;
pu4StartAddr = (uint32_t *)
rChipConfigInfo.aucCmd;
/* align 16 bytes because one print line
* is 16 bytes
*/
u4Length = (((u2MsgSize + 15) >> 4))
<< 4;
u4Line = 0;
if (IS_ALIGN_4(
(unsigned long) pu4StartAddr)) {
priv_driver_get_chip_config_4(
pu4StartAddr, u4Length,
u4Line, i4TotalLen,
i4BytesWritten,
pcCommand);
} else {
DBGLOG(REQ, INFO,
"%s: rChipConfigInfo.aucCmd is not 4 bytes alignment %p\n",
__func__,
rChipConfigInfo.aucCmd);
}
} /* ChipConfigInfo.ucRespType */
}
}
/* u2MsgSize > 0 */
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__,
pcCommand);
}
/* i4Argc */
return i4BytesWritten;
} /* priv_driver_get_chip_config */
int priv_driver_set_ap_start(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct PARAM_CUSTOM_P2P_SET_STRUCT rSetP2P;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret;
int32_t i4ArgNum = 2;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &(rSetP2P.u4Mode));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse ap-start error (u4Enable) u4Ret=%d\n",
u4Ret);
if (rSetP2P.u4Mode >= RUNNING_P2P_MODE_NUM) {
rSetP2P.u4Mode = 0;
rSetP2P.u4Enable = 0;
} else
rSetP2P.u4Enable = 1;
set_p2p_mode_handler(prNetDev, rSetP2P);
}
return 0;
}
int priv_driver_get_linkspeed(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
uint32_t u4Rate = 0;
uint32_t u4LinkSpeed = 0;
int32_t i4BytesWritten = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!netif_carrier_ok(prNetDev))
return -1;
rStatus = kalIoctl(prGlueInfo, wlanoidQueryLinkSpeed, &u4Rate,
sizeof(u4Rate), TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
u4LinkSpeed = u4Rate * 100;
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "LinkSpeed %u",
(unsigned int)u4LinkSpeed);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
return i4BytesWritten;
} /* priv_driver_get_linkspeed */
int priv_driver_set_band(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct ADAPTER *prAdapter = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
uint32_t ucBand = 0;
uint8_t ucBssIndex;
enum ENUM_BAND eBand = BAND_NULL;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t u4Ret = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prAdapter = prGlueInfo->prAdapter;
if (i4Argc >= 2) {
/* ucBand = kalStrtoul(apcArgv[1], NULL, 0); */
u4Ret = kalkStrtou32(apcArgv[1], 0, &ucBand);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse ucBand error u4Ret=%d\n",
u4Ret);
ucBssIndex = wlanGetAisBssIndex(prGlueInfo->prAdapter);
eBand = BAND_NULL;
if (ucBand == CMD_BAND_5G)
eBand = BAND_5G;
else if (ucBand == CMD_BAND_2G)
eBand = BAND_2G4;
prAdapter->aePreferBand[ucBssIndex] = eBand;
/* XXX call wlanSetPreferBandByNetwork directly in different
* thread
*/
/* wlanSetPreferBandByNetwork (prAdapter, eBand, ucBssIndex); */
}
return 0;
}
int priv_driver_set_txpower(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct SET_TXPWR_CTRL *prTxpwr;
uint16_t i;
int32_t u4Ret = 0;
int32_t ai4Setting[4];
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prTxpwr = &prGlueInfo->rTxPwr;
if (i4Argc >= 3 && i4Argc <= 5) {
for (i = 0; i < (i4Argc - 1); i++) {
/* ai4Setting[i] = kalStrtol(apcArgv[i + 1], NULL, 0);
*/
u4Ret = kalkStrtos32(apcArgv[i + 1], 0,
&(ai4Setting[i]));
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse apcArgv error u4Ret=%d\n", u4Ret);
}
} else {
DBGLOG(REQ, INFO, "set_txpower wrong argc : %d\n", i4Argc);
return -1;
}
/*
* ai4Setting[0]
* 0 : Set TX power offset for specific network
* 1 : Set TX power offset policy when multiple networks are in the
* same channel
* 2 : Set TX power limit for specific channel in 2.4GHz band
* 3 : Set TX power limit of specific sub-band in 5GHz band
* 4 : Enable or reset setting
*/
if (ai4Setting[0] == 0 && (i4Argc - 1) == 4 /* argc num */) {
/* ai4Setting[1] : 0 (All networks), 1 (legacy STA),
* 2 (Hotspot AP), 3 (P2P), 4 (BT over Wi-Fi)
* ai4Setting[2] : 0 (All bands),1 (2.4G), 2 (5G)
* ai4Setting[3] : -30 ~ 20 in unit of 0.5dBm (default: 0)
*/
if (ai4Setting[1] == 1 || ai4Setting[1] == 0) {
if (ai4Setting[2] == 0 || ai4Setting[2] == 1)
prTxpwr->c2GLegacyStaPwrOffset = ai4Setting[3];
if (ai4Setting[2] == 0 || ai4Setting[2] == 2)
prTxpwr->c5GLegacyStaPwrOffset = ai4Setting[3];
}
if (ai4Setting[1] == 2 || ai4Setting[1] == 0) {
if (ai4Setting[2] == 0 || ai4Setting[2] == 1)
prTxpwr->c2GHotspotPwrOffset = ai4Setting[3];
if (ai4Setting[2] == 0 || ai4Setting[2] == 2)
prTxpwr->c5GHotspotPwrOffset = ai4Setting[3];
}
if (ai4Setting[1] == 3 || ai4Setting[1] == 0) {
if (ai4Setting[2] == 0 || ai4Setting[2] == 1)
prTxpwr->c2GP2pPwrOffset = ai4Setting[3];
if (ai4Setting[2] == 0 || ai4Setting[2] == 2)
prTxpwr->c5GP2pPwrOffset = ai4Setting[3];
}
if (ai4Setting[1] == 4 || ai4Setting[1] == 0) {
if (ai4Setting[2] == 0 || ai4Setting[2] == 1)
prTxpwr->c2GBowPwrOffset = ai4Setting[3];
if (ai4Setting[2] == 0 || ai4Setting[2] == 2)
prTxpwr->c5GBowPwrOffset = ai4Setting[3];
}
} else if (ai4Setting[0] == 1 && (i4Argc - 1) == 2) {
/* ai4Setting[1] : 0 (highest power is used) (default),
* 1 (lowest power is used)
*/
prTxpwr->ucConcurrencePolicy = ai4Setting[1];
} else if (ai4Setting[0] == 2 && (i4Argc - 1) == 3) {
/* ai4Setting[1] : 0 (all channels in 2.4G), 1~14 */
/* ai4Setting[2] : 10 ~ 46 in unit of 0.5dBm (default: 46) */
if (ai4Setting[1] == 0) {
for (i = 0; i < 14; i++)
prTxpwr->acTxPwrLimit2G[i] = ai4Setting[2];
} else if (ai4Setting[1] <= 14)
prTxpwr->acTxPwrLimit2G[ai4Setting[1] - 1] =
ai4Setting[2];
} else if (ai4Setting[0] == 3 && (i4Argc - 1) == 3) {
/* ai4Setting[1] : 0 (all sub-bands in 5G),
* 1 (5000 ~ 5250MHz),
* 2 (5255 ~ 5350MHz),
* 3 (5355 ~ 5725MHz),
* 4 (5730 ~ 5825MHz)
*/
/* ai4Setting[2] : 10 ~ 46 in unit of 0.5dBm (default: 46) */
if (ai4Setting[1] == 0) {
for (i = 0; i < 4; i++)
prTxpwr->acTxPwrLimit5G[i] = ai4Setting[2];
} else if (ai4Setting[1] <= 4)
prTxpwr->acTxPwrLimit5G[ai4Setting[1] - 1] =
ai4Setting[2];
} else if (ai4Setting[0] == 4 && (i4Argc - 1) == 2) {
/* ai4Setting[1] : 1 (enable), 0 (reset and disable) */
if (ai4Setting[1] == 0)
wlanDefTxPowerCfg(prGlueInfo->prAdapter);
rStatus = kalIoctl(prGlueInfo, wlanoidSetTxPower, prTxpwr,
sizeof(struct SET_TXPWR_CTRL),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
} else
return -EFAULT;
return 0;
}
int priv_driver_set_country(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint8_t aucCountry[2];
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
#define MIN_ARGC_OF_SET_COUNTRY_CMD 2
if (i4Argc < MIN_ARGC_OF_SET_COUNTRY_CMD)
return -1;
if (regd_is_single_sku_en()) {
uint8_t aucCountry_code[4] = {0, 0, 0, 0};
uint8_t i, count;
/* command like "COUNTRY US", "COUNTRY US1" and
* "COUNTRY US01"
*/
count = kalStrnLen(apcArgv[1], sizeof(aucCountry_code));
for (i = 0; i < count; i++)
aucCountry_code[i] = apcArgv[1][i];
rStatus = kalIoctl(prGlueInfo, wlanoidSetCountryCode,
&aucCountry_code[0], count,
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
return 0;
}
/* command like "COUNTRY US", "COUNTRY EU" and "COUNTRY JP" */
aucCountry[0] = apcArgv[1][0];
aucCountry[1] = apcArgv[1][1];
rStatus = kalIoctl(prGlueInfo, wlanoidSetCountryCode,
&aucCountry[0], 2, FALSE, FALSE, TRUE,
&u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
return 0;
}
int priv_driver_set_csa(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t ch_num = 0;
uint32_t u4Ret = 0;
uint8_t ucRoleIdx = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, INFO, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, INFO, "argc is %i\n", i4Argc);
if (i4Argc >= 2) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &ch_num);
u4Ret = cnmIdcCsaReq(prGlueInfo->prAdapter, ch_num, ucRoleIdx);
DBGLOG(REQ, INFO, "u4Ret is %d\n", u4Ret);
} else {
DBGLOG(REQ, INFO, "Input insufficent\n");
}
return 0;
}
int priv_driver_get_country(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t i4BytesWritten = 0;
uint32_t country = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (!regd_is_single_sku_en()) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "Not Supported.");
return i4BytesWritten;
}
country = rlmDomainGetCountryCode();
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\nCountry Code: (0x%x)",
country);
return i4BytesWritten;
}
int priv_driver_get_channels(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
uint32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
#if (CFG_SUPPORT_SINGLE_SKU == 1)
uint32_t ch_idx, start_idx, end_idx;
struct channel *pCh;
uint32_t ch_num = 0;
uint8_t maxbw = 160;
uint32_t u4Ret = 0;
#endif
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (!regd_is_single_sku_en()) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "Not Supported.");
return i4BytesWritten;
}
#if (CFG_SUPPORT_SINGLE_SKU == 1)
/**
* Usage: iwpriv wlan0 driver "get_channels [2g |5g |ch_num]"
**/
if (i4Argc >= 2 && (apcArgv[1][0] == '2') && (apcArgv[1][1] == 'g')) {
start_idx = 0;
end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
} else if (i4Argc >= 2 && (apcArgv[1][0] == '5') &&
(apcArgv[1][1] == 'g')) {
start_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ)
+ rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ);
} else {
start_idx = 0;
end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ)
+ rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ);
if (i4Argc >= 2)
/* Dump only specified channel */
u4Ret = kalkStrtou32(apcArgv[1], 0, &ch_num);
}
if (regd_is_single_sku_en()) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\n");
for (ch_idx = start_idx; ch_idx < end_idx; ch_idx++) {
pCh = (rlmDomainGetActiveChannels() + ch_idx);
if (ch_num && (ch_num != pCh->chNum))
continue; /*show specific channel information*/
/* Channel number */
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "CH-%d:",
pCh->chNum);
/* Active/Passive */
if (pCh->flags & IEEE80211_CHAN_PASSIVE_FLAG) {
/* passive channel */
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
" " IEEE80211_CHAN_PASSIVE_STR);
} else
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
" ACTIVE");
/* Max BW */
if ((pCh->flags & IEEE80211_CHAN_NO_160MHZ) ==
IEEE80211_CHAN_NO_160MHZ)
maxbw = 80;
if ((pCh->flags & IEEE80211_CHAN_NO_80MHZ) ==
IEEE80211_CHAN_NO_80MHZ)
maxbw = 40;
if ((pCh->flags & IEEE80211_CHAN_NO_HT40) ==
IEEE80211_CHAN_NO_HT40)
maxbw = 20;
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
" BW_%dMHz", maxbw);
/* Channel flags */
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
" (flags=0x%x)\n", pCh->flags);
}
}
#endif
return i4BytesWritten;
}
int priv_driver_get_ap_channels(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
uint32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
#if (CFG_SUPPORT_SINGLE_SKU == 1)
uint32_t ch_idx, start_idx, end_idx;
struct channel *pCh;
uint32_t ch_num = 0;
uint8_t maxbw = 160;
uint32_t u4Ret = 0;
#endif
struct ADAPTER *prAdapter = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
struct WIFI_VAR *prWifiVar = NULL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
prWifiVar = &prAdapter->rWifiVar;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (!regd_is_single_sku_en()) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "Not Supported.");
return i4BytesWritten;
}
#if (CFG_SUPPORT_SINGLE_SKU == 1)
/**
* Usage: iwpriv wlan0 driver "get_ap_channels [2g |5g |ch_num]"
**/
if (i4Argc >= 2 && (apcArgv[1][0] == '2') && (apcArgv[1][1] == 'g')) {
start_idx = 0;
end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
} else if (i4Argc >= 2 && (apcArgv[1][0] == '5') &&
(apcArgv[1][1] == 'g')) {
start_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ)
+ rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ);
} else {
start_idx = 0;
end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ)
+ rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ);
if (i4Argc >= 2)
/* Dump only specified channel */
u4Ret = kalkStrtou32(apcArgv[1], 0, &ch_num);
}
if (regd_is_single_sku_en()) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\n");
for (ch_idx = start_idx; ch_idx < end_idx; ch_idx++) {
uint8_t ApMaxbw = 0;
pCh = (rlmDomainGetActiveChannels() + ch_idx);
if (ch_num && (ch_num != pCh->chNum))
continue; /*show specific channel information*/
/* Channel number */
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "CH-%d:",
pCh->chNum);
/* Active/Passive */
if (pCh->flags & IEEE80211_CHAN_PASSIVE_FLAG) {
LOGBUF(pcCommand, i4TotalLen,
i4BytesWritten,
" " IEEE80211_CHAN_PASSIVE_STR);
} else {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
" ACTIVE");
}
/* Max BW */
if ((pCh->flags & IEEE80211_CHAN_NO_160MHZ) ==
IEEE80211_CHAN_NO_160MHZ)
maxbw = 80;
if ((pCh->flags & IEEE80211_CHAN_NO_80MHZ) ==
IEEE80211_CHAN_NO_80MHZ)
maxbw = 40;
if ((pCh->flags & IEEE80211_CHAN_NO_HT40) ==
IEEE80211_CHAN_NO_HT40)
maxbw = 20;
/* Checking 2G BW setting */
if (pCh->chNum < MAX_2G_BAND_CHN_NUM) {
switch (prWifiVar->ucAp2gBandwidth) {
case MAX_BW_40MHZ:
ApMaxbw = 40;
break;
case MAX_BW_20MHZ:
ApMaxbw = 20;
break;
default:
ApMaxbw = 40;
break;
}
} else {
switch (prWifiVar->ucAp5gBandwidth) {
case MAX_BW_80MHZ:
ApMaxbw = 80;
break;
case MAX_BW_40MHZ:
ApMaxbw = 40;
break;
case MAX_BW_20MHZ:
ApMaxbw = 20;
break;
default:
ApMaxbw = 80;
break;
}
}
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
" BW_%dMHz",
((maxbw <= ApMaxbw)?(maxbw):(ApMaxbw)));
/* Channel flags */
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
" (flags=0x%x)\n",
pCh->flags);
}
}
#endif
return i4BytesWritten;
}
#if (CFG_SUPPORT_DFS_MASTER == 1)
int priv_driver_show_dfs_state(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4BytesWritten = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\nDFS State: \"%s\"",
p2pFuncShowDfsState());
return i4BytesWritten;
}
int priv_driver_show_dfs_radar_param(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4BytesWritten = 0;
uint8_t ucCnt = 0;
struct P2P_RADAR_INFO *prP2pRadarInfo = (struct P2P_RADAR_INFO *) NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prP2pRadarInfo = (struct P2P_RADAR_INFO *) cnmMemAlloc(
prGlueInfo->prAdapter, RAM_TYPE_MSG, sizeof(*prP2pRadarInfo));
if (prP2pRadarInfo == NULL) {
DBGLOG(REQ, ERROR,
"NCHO no memory for P2pRadarInfo req\n");
return -1;
}
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
p2pFuncGetRadarInfo(prP2pRadarInfo);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\nRDD idx: %d\n",
prP2pRadarInfo->ucRddIdx);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nLong Pulse detected: %d\n", prP2pRadarInfo->ucLongDetected);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nPeriodic Pulse detected: %d\n",
prP2pRadarInfo->ucPeriodicDetected);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\nLPB Num: %d\n",
prP2pRadarInfo->ucLPBNum);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\nPPB Num: %d\n",
prP2pRadarInfo->ucPPBNum);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n===========================");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nLong Pulse Buffer Contents:\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\npulse_time pulse_width PRI\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\n%-10d %-11d -\n"
, prP2pRadarInfo->arLpbContent[ucCnt].u4LongStartTime
, prP2pRadarInfo->arLpbContent[ucCnt].u2LongPulseWidth);
for (ucCnt = 1; ucCnt < prP2pRadarInfo->ucLPBNum; ucCnt++) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n%-10d %-11d %d\n",
prP2pRadarInfo->arLpbContent[ucCnt].u4LongStartTime,
prP2pRadarInfo->arLpbContent[ucCnt].u2LongPulseWidth,
(prP2pRadarInfo->arLpbContent[ucCnt].u4LongStartTime
- prP2pRadarInfo->arLpbContent[ucCnt-1]
.u4LongStartTime) * 2 / 5);
}
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nLPB Period Valid: %d", prP2pRadarInfo->ucLPBPeriodValid);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nLPB Period Valid: %d\n", prP2pRadarInfo->ucLPBWidthValid);
ucCnt = 0;
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n===========================");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nPeriod Pulse Buffer Contents:\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\npulse_time pulse_width PRI\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten, "\n%-10d %-11d -\n"
, prP2pRadarInfo->arPpbContent[ucCnt].u4PeriodicStartTime
, prP2pRadarInfo->arPpbContent[ucCnt].u2PeriodicPulseWidth);
for (ucCnt = 1; ucCnt < prP2pRadarInfo->ucPPBNum; ucCnt++) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n%-10d %-11d %d\n"
, prP2pRadarInfo->arPpbContent[ucCnt].u4PeriodicStartTime
, prP2pRadarInfo->arPpbContent[ucCnt]
.u2PeriodicPulseWidth
, (prP2pRadarInfo->arPpbContent[ucCnt]
.u4PeriodicStartTime
- prP2pRadarInfo->arPpbContent[ucCnt-1]
.u4PeriodicStartTime) * 2 / 5);
}
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nPRI Count M1 TH: %d; PRI Count M1: %d",
prP2pRadarInfo->ucPRICountM1TH, prP2pRadarInfo->ucPRICountM1);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nPRI Count M2 TH: %d; PRI Count M2: %d",
prP2pRadarInfo->ucPRICountM2TH,
prP2pRadarInfo->ucPRICountM2);
cnmMemFree(prGlueInfo->prAdapter, prP2pRadarInfo);
return i4BytesWritten;
}
int priv_driver_show_dfs_help(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4BytesWritten = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n--iwpriv wlanX driver \"show_dfs_state\"\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nINACTIVE: RDD disable or temporary RDD disable");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nCHECKING: During CAC time");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nACTIVE : In-serive monitoring");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nDETECTED: Has detected radar but hasn't moved to new channel\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n--iwpriv wlanX driver \"show_dfs_radar_param\"\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nShow the latest pulse information\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n--iwpriv wlanX driver \"show_dfs_cac_time\"\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nShow the remaining time of CAC\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n--iwpriv wlanX set ByPassCac=yy\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nValue yy: set the time of CAC\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n--iwpriv wlanX set RDDReport=yy\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nValue yy is \"0\" or \"1\"");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n\"0\": Emulate RDD0 manual radar event");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n\"1\": Emulate RDD1 manual radar event\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n--iwpriv wlanX set RadarDetectMode=yy\n");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nValue yy is \"0\" or \"1\"");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n\"0\": Switch channel when radar detected (default)");
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n\"1\": Do not switch channel when radar detected");
return i4BytesWritten;
}
int priv_driver_show_dfs_cac_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4BytesWritten = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (p2pFuncGetDfsState() != DFS_STATE_CHECKING) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nNot in CAC period");
return i4BytesWritten;
}
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nRemaining time of CAC: %dsec", p2pFuncGetCacRemainingTime());
return i4BytesWritten;
}
#endif
#ifdef CFG_SUPPORT_ADJUST_MCC_STAY_TIME
#define CFG_MCC_AIS_QUOTA_TYPE 0
#define CFG_MCC_P2PGC_QUOTA_TYPE 1
#define CFG_MCC_P2PGO_QUOTA_TYPE 2
int priv_driver_set_mcc_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct ADAPTER *prAdapter = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
uint32_t i4BytesWritten = 0;
uint32_t ucLinkType = 0; /* 0 for AIS and 1 for P2P */
uint32_t ucStayTime = 0; /* In unit of us */
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = 0;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prAdapter = prGlueInfo->prAdapter;
if (i4Argc != 3)
goto out;
i4Ret = kalkStrtou32(apcArgv[1], 0, &ucLinkType);
if (i4Ret) {
DBGLOG(REQ, LOUD, "parse ucLinkType error i4Ret=%d\n", i4Ret);
goto out;
}
i4Ret = kalkStrtou32(apcArgv[2], 0, &ucStayTime);
if (i4Ret) {
DBGLOG(REQ, LOUD, "parse ucStayTime error i4Ret=%d\n", i4Ret);
goto out;
}
if (ucLinkType == CFG_MCC_AIS_QUOTA_TYPE) {
snprintf(pcCommand, i4TotalLen, CMD_SET_CHIP " mccTime 0 %d",
ucStayTime);
} else if (ucLinkType == CFG_MCC_P2PGC_QUOTA_TYPE) {
snprintf(pcCommand, i4TotalLen, CMD_SET_CHIP " mccTime 1 %d",
ucStayTime);
} else if (ucLinkType == CFG_MCC_P2PGO_QUOTA_TYPE) {
snprintf(pcCommand, i4TotalLen, CMD_SET_CHIP " mccTime 2 %d",
ucStayTime);
} else {
DBGLOG(REQ, LOUD, "Wrong network type %i\n", ucLinkType);
i4BytesWritten = -1;
goto out;
}
priv_driver_set_chip_config(prNetDev, pcCommand, i4TotalLen);
out:
return i4BytesWritten;
}
#endif
int priv_driver_set_miracast(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct ADAPTER *prAdapter = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t i4BytesWritten = 0;
/* WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS; */
/* UINT_32 u4BufLen = 0; */
int32_t i4Argc = 0;
uint32_t ucMode = 0;
struct WFD_CFG_SETTINGS *prWfdCfgSettings =
(struct WFD_CFG_SETTINGS *) NULL;
struct MSG_WFD_CONFIG_SETTINGS_CHANGED *prMsgWfdCfgUpdate =
(struct MSG_WFD_CONFIG_SETTINGS_CHANGED *) NULL;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t u4Ret = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prAdapter = prGlueInfo->prAdapter;
if (i4Argc >= 2) {
/* ucMode = kalStrtoul(apcArgv[1], NULL, 0); */
u4Ret = kalkStrtou32(apcArgv[1], 0, &ucMode);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse ucMode error u4Ret=%d\n",
u4Ret);
if (g_ucMiracastMode == (uint8_t) ucMode) {
/* XXX: continue or skip */
/* XXX: continue or skip */
}
g_ucMiracastMode = (uint8_t) ucMode;
prMsgWfdCfgUpdate = cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
sizeof(struct MSG_WFD_CONFIG_SETTINGS_CHANGED));
if (prMsgWfdCfgUpdate != NULL) {
prWfdCfgSettings =
&(prAdapter->rWifiVar.rWfdConfigureSettings);
prMsgWfdCfgUpdate->rMsgHdr.eMsgId =
MID_MNY_P2P_WFD_CFG_UPDATE;
prMsgWfdCfgUpdate->prWfdCfgSettings = prWfdCfgSettings;
if (ucMode == MIRACAST_MODE_OFF) {
prWfdCfgSettings->ucWfdEnable = 0;
snprintf(pcCommand, i4TotalLen,
CMD_SET_CHIP " mira 0");
} else if (ucMode == MIRACAST_MODE_SOURCE) {
prWfdCfgSettings->ucWfdEnable = 1;
snprintf(pcCommand, i4TotalLen,
CMD_SET_CHIP " mira 1");
} else if (ucMode == MIRACAST_MODE_SINK) {
prWfdCfgSettings->ucWfdEnable = 2;
snprintf(pcCommand, i4TotalLen,
CMD_SET_CHIP " mira 2");
} else {
prWfdCfgSettings->ucWfdEnable = 0;
snprintf(pcCommand, i4TotalLen,
CMD_SET_CHIP " mira 0");
}
mboxSendMsg(prAdapter, MBOX_ID_0, (struct MSG_HDR *)
prMsgWfdCfgUpdate, MSG_SEND_METHOD_BUF);
priv_driver_set_chip_config(prNetDev, pcCommand,
i4TotalLen);
} /* prMsgWfdCfgUpdate */
else {
ASSERT(FALSE);
i4BytesWritten = -1;
}
}
/* i4Argc */
return i4BytesWritten;
}
int parseValueInString(
IN char **pcCommand,
IN const char *acDelim,
IN void *aucValue,
IN int u4MaxLen)
{
uint8_t *pcPtr;
uint32_t u4Len;
uint8_t *pucValueHead = NULL;
uint8_t *pucValueTail = NULL;
if (*pcCommand
&& !kalStrnCmp(*pcCommand, acDelim, kalStrLen(acDelim))) {
pcPtr = kalStrSep(pcCommand, "=,");
pucValueHead = *pcCommand;
pcPtr = kalStrSep(pcCommand, "=,");
DBGLOG(REQ, TRACE, "pucValueHead = %s\n", pucValueHead);
if (pucValueHead) {
u4Len = kalStrLen(pucValueHead);
if (*pcCommand) {
pucValueTail = *pcCommand - 1;
u4Len = pucValueTail - pucValueHead;
}
if (u4Len > u4MaxLen)
u4Len = u4MaxLen;
/* MAC */
if (!kalStrnCmp(acDelim, "MAC=", kalStrLen(acDelim))) {
u8 *addr = aucValue;
wlanHwAddrToBin(pucValueHead, addr);
DBGLOG(REQ, TRACE, "MAC type");
} else {
u8 *addr = aucValue;
kalStrnCpy(addr, pucValueHead, u4Len);
*((char *)aucValue + u4Len) = '\0';
DBGLOG(REQ, TRACE,
"STR type = %s\n", (char *)aucValue);
}
return 0;
}
}
return -1;
}
int priv_driver_set_ap_set_mac_acl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
uint8_t aucValue[WLAN_CFG_ARGV_MAX];
uint8_t ucRoleIdx = 0, ucBssIdx = 0;
int32_t i4BytesWritten = 0;
int32_t i4Count = 0, i4Mode = 0;
int i = 0;
DBGLOG(REQ, INFO, "command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
goto error;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
goto error;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS)
goto error;
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
if (!prBssInfo) {
DBGLOG(REQ, WARN, "bss is not active\n");
goto error;
}
/* Mode */
if (parseValueInString(&pcCommand,
"MAC_MODE=", &aucValue, WLAN_CFG_ARGV_MAX)) {
DBGLOG(REQ, ERROR, "[MODE] parse error\n");
goto error;
}
if (kalkStrtou32(aucValue, 0, &i4Mode)) {
DBGLOG(REQ, ERROR, "[MODE] convert to int error\n");
goto error;
}
if (i4Mode == 0)
prBssInfo->rACL.ePolicy = PARAM_CUSTOM_ACL_POLICY_DISABLE;
else if (i4Mode == 1)
prBssInfo->rACL.ePolicy = PARAM_CUSTOM_ACL_POLICY_DENY;
else if (i4Mode == 2)
prBssInfo->rACL.ePolicy = PARAM_CUSTOM_ACL_POLICY_ACCEPT;
else {
DBGLOG(REQ, ERROR, "[MODE] invalid ACL policy= %d\n", i4Mode);
goto error;
}
/* Count */
if (parseValueInString(&pcCommand,
"MAC_CNT=", &aucValue, WLAN_CFG_ARGV_MAX)) {
DBGLOG(REQ, ERROR, "[CNT] parse count error\n");
goto error;
}
if (kalkStrtou32(aucValue, 0, &i4Count)) {
DBGLOG(REQ, ERROR, "[CNT] convert to int error\n");
goto error;
}
if (i4Count > MAX_NUMBER_OF_ACL) {
DBGLOG(REQ, ERROR, "[CNT] invalid count > max ACL\n");
goto error;
}
/* MAC */
if (prBssInfo->rACL.u4Num) {
/* Clear */
kalMemZero(&prBssInfo->rACL.rEntry[0],
sizeof(struct PARAM_CUSTOM_ACL_ENTRY) * MAC_ADDR_LEN);
prBssInfo->rACL.u4Num = 0;
}
if (prBssInfo->rACL.ePolicy != PARAM_CUSTOM_ACL_POLICY_DISABLE) {
for (i = 0; i < i4Count; i++) {
/* Add */
if (parseValueInString(&pcCommand,
"MAC=", &aucValue, WLAN_CFG_ARGV_MAX))
break;
kalMemCopy(prBssInfo->rACL.rEntry[i].aucAddr,
&aucValue, MAC_ADDR_LEN);
DBGLOG(REQ, INFO,
"[MAC] add mac addr " MACSTR " to ACL(%d).\n",
MAC2STR(prBssInfo->rACL.rEntry[i].aucAddr), i);
}
prBssInfo->rACL.u4Num = i;
/* check ACL affects any existent association */
p2pRoleUpdateACLEntry(prAdapter, ucBssIdx);
DBGLOG(REQ, INFO,
"[MAC] Mode = %d, #ACL = %d, count = %d\n",
i4Mode, i, i4Count);
}
return i4BytesWritten;
error:
return -1;
}
int priv_driver_set_ap_set_cfg(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct WIFI_VAR *prWifiVar = NULL;
uint8_t aucValue[WLAN_CFG_ARGV_MAX];
uint8_t ucRoleIdx = 0;
int32_t i4BytesWritten = 0;
int32_t i4MaxCount = 0, i4Channel = 0;
DBGLOG(REQ, INFO, "command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
goto error;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
prWifiVar = &prAdapter->rWifiVar;
/* get role index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
goto error;
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
/* Cfg */
if (parseValueInString(&pcCommand, "ASCII_CMD=",
&aucValue, WLAN_CFG_ARGV_MAX)) {
DBGLOG(REQ, ERROR, "[CFG] cmd parse error\n");
goto error;
}
if (kalStrnCmp(aucValue, "AP_CFG", 6)) {
DBGLOG(REQ, ERROR, "[CFG] sub cmd parse error\n");
goto error;
}
/* Channel */
if (parseValueInString(&pcCommand, "CHANNEL=",
&aucValue, WLAN_CFG_ARGV_MAX)) {
DBGLOG(REQ, ERROR, "[CH] parse error\n");
goto error;
}
if (kalkStrtou32(aucValue, 0, &i4Channel)) {
DBGLOG(REQ, ERROR, "[CH] convert to int error\n");
goto error;
}
/* Max SCB */
if (parseValueInString(&pcCommand, "MAX_SCB=",
&aucValue, WLAN_CFG_ARGV_MAX)) {
DBGLOG(REQ, ERROR, "[MAX_SCB] parse error\n");
goto error;
}
if (kalkStrtou32(aucValue, 0, &i4MaxCount)) {
DBGLOG(REQ, ERROR, "[MAX_SCB] convert to int error\n");
goto error;
}
/* Overwrite AP channel */
prWifiVar->ucApChannel = i4Channel;
/* Set max clients of Hotspot */
kalP2PSetMaxClients(prGlueInfo, i4MaxCount, ucRoleIdx);
DBGLOG(REQ, INFO,
"[CFG] CH = %d, MAX_SCB = %d\n",
i4Channel, i4MaxCount);
/* Stop ap */
#if 0
{
struct PARAM_CUSTOM_P2P_SET_STRUCT rSetP2P;
rSetP2P.u4Mode = 0;
rSetP2P.u4Enable = 0;
set_p2p_mode_handler(prNetDev, rSetP2P);
}
#endif
return i4BytesWritten;
error:
return -1;
}
int priv_driver_set_ap_get_sta_list(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
struct LINK *prClientList;
struct STA_RECORD *prCurrStaRec, *prNextStaRec;
uint8_t ucRoleIdx = 0, ucBssIdx = 0;
int32_t i4BytesWritten = 0;
int i = 0;
DBGLOG(REQ, INFO, "command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
goto error;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
goto error;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS)
goto error;
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
if (!prBssInfo) {
DBGLOG(REQ, WARN, "bss is not active\n");
goto error;
}
prClientList = &prBssInfo->rStaRecOfClientList;
LINK_FOR_EACH_ENTRY_SAFE(prCurrStaRec,
prNextStaRec, prClientList, rLinkEntry, struct STA_RECORD) {
if (!prCurrStaRec) {
DBGLOG(REQ, WARN, "NULL STA_REC\n");
break;
}
DBGLOG(SW4, INFO, "STA[%u] [" MACSTR "]\n",
prCurrStaRec->ucIndex,
MAC2STR(prCurrStaRec->aucMacAddr));
i4BytesWritten += kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"MAC[%d]=" MACSTR "\n",
i++,
MAC2STR(prCurrStaRec->aucMacAddr));
}
return i4BytesWritten;
error:
return -1;
}
int priv_driver_set_ap_sta_disassoc(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint8_t aucValue[WLAN_CFG_ARGV_MAX];
uint8_t ucRoleIdx = 0;
int32_t i4BytesWritten = 0;
struct MSG_P2P_CONNECTION_ABORT *prDisconnectMsg =
(struct MSG_P2P_CONNECTION_ABORT *) NULL;
DBGLOG(REQ, INFO, "command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
goto error;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get role index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0)
goto error;
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
if (parseValueInString(&pcCommand, "MAC=",
&aucValue, WLAN_CFG_ARGV_MAX)) {
DBGLOG(REQ, ERROR, "[MAC] parse error\n");
goto error;
}
prDisconnectMsg =
(struct MSG_P2P_CONNECTION_ABORT *)
cnmMemAlloc(prGlueInfo->prAdapter, RAM_TYPE_MSG,
sizeof(struct MSG_P2P_CONNECTION_ABORT));
if (prDisconnectMsg == NULL) {
ASSERT(FALSE);
goto error;
}
prDisconnectMsg->rMsgHdr.eMsgId = MID_MNY_P2P_CONNECTION_ABORT;
prDisconnectMsg->ucRoleIdx = ucRoleIdx;
COPY_MAC_ADDR(prDisconnectMsg->aucTargetID, aucValue);
prDisconnectMsg->u2ReasonCode = REASON_CODE_UNSPECIFIED;
prDisconnectMsg->fgSendDeauth = TRUE;
mboxSendMsg(prGlueInfo->prAdapter,
MBOX_ID_0,
(struct MSG_HDR *) prDisconnectMsg,
MSG_SEND_METHOD_BUF);
return i4BytesWritten;
error:
return -1;
}
int
priv_set_ap(IN struct net_device *prNetDev,
IN struct iw_request_info *prIwReqInfo,
IN union iwreq_data *prIwReqData, IN OUT char *pcExtra)
{
uint32_t u4SubCmd = 0;
uint16_t u2Cmd = 0;
int32_t i4TotalFixLen = 1024;
int32_t i4CmdFound = 0;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
ASSERT(prNetDev);
ASSERT(prIwReqData);
if (!prNetDev || !prIwReqData) {
DBGLOG(REQ, INFO,
"invalid param(0x%p, 0x%p)\n",
prNetDev, prIwReqData);
return -EINVAL;
}
u2Cmd = prIwReqInfo->cmd;
DBGLOG(REQ, INFO, "prIwReqInfo->cmd %x\n", u2Cmd);
u4SubCmd = (uint32_t) prIwReqData->data.flags;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
if (!prGlueInfo) {
DBGLOG(REQ, INFO,
"invalid prGlueInfo(0x%p, 0x%p)\n",
prNetDev,
*((struct GLUE_INFO **) netdev_priv(prNetDev)));
return -EINVAL;
}
DBGLOG(REQ, INFO, "prIwReqData->data.length %u\n",
prIwReqData->data.length);
ASSERT(IW_IS_GET(u2Cmd));
if (prIwReqData->data.length != 0) {
#if KERNEL_VERSION(5, 0, 0) <= LINUX_VERSION_CODE
if (!access_ok(prIwReqData->data.pointer,
prIwReqData->data.length)) {
#else
if (!access_ok(VERIFY_READ, prIwReqData->data.pointer,
prIwReqData->data.length)) {
#endif
DBGLOG(REQ, INFO,
"%s access_ok Read fail written = %d\n",
__func__, i4BytesWritten);
return -EFAULT;
}
if (prIwReqData->data.length >
CMD_OID_BUF_LENGTH) {
DBGLOG(REQ, INFO,
"illegal cmd length\n");
return -EFAULT;
}
if (copy_from_user(pcExtra,
prIwReqData->data.pointer,
prIwReqData->data.length)) {
DBGLOG(REQ, INFO,
"%s copy_form_user fail written = %d\n",
__func__,
prIwReqData->data.length);
return -EFAULT;
}
/* prIwReqData->data.length include the terminate '\0' */
pcExtra[prIwReqData->data.length - 1] = 0;
}
if (!pcExtra)
goto exit;
DBGLOG(REQ, INFO, "%s pcExtra %s\n", __func__, pcExtra);
i4CmdFound = 1;
switch (u2Cmd) {
case IOC_AP_GET_STA_LIST:
i4BytesWritten =
priv_driver_set_ap_get_sta_list(
prNetDev,
pcExtra,
i4TotalFixLen);
break;
case IOC_AP_SET_MAC_FLTR:
i4BytesWritten =
priv_driver_set_ap_set_mac_acl(
prNetDev,
pcExtra,
i4TotalFixLen);
break;
case IOC_AP_SET_CFG:
i4BytesWritten =
priv_driver_set_ap_set_cfg(
prNetDev,
pcExtra,
i4TotalFixLen);
break;
case IOC_AP_STA_DISASSOC:
i4BytesWritten =
priv_driver_set_ap_sta_disassoc(
prNetDev,
pcExtra,
i4TotalFixLen);
break;
default:
i4CmdFound = 0;
break;
}
if (i4CmdFound == 0)
DBGLOG(REQ, INFO,
"Unknown driver command\n");
if (i4BytesWritten >= 0) {
if ((i4BytesWritten == 0) && (i4TotalFixLen > 0)) {
/* reset the command buffer */
pcExtra[0] = '\0';
}
if (i4BytesWritten >= i4TotalFixLen) {
DBGLOG(REQ, INFO,
"%s: i4BytesWritten %d > i4TotalFixLen < %d\n",
__func__, i4BytesWritten, i4TotalFixLen);
i4BytesWritten = i4TotalFixLen;
} else {
pcExtra[i4BytesWritten] = '\0';
i4BytesWritten++;
}
}
DBGLOG(REQ, INFO, "%s i4BytesWritten = %d\n", __func__,
i4BytesWritten);
exit:
DBGLOG(REQ, INFO, "pcExtra done\n");
if (i4BytesWritten >= 0)
prIwReqData->data.length = i4BytesWritten;
return 0;
}
#if CFG_SUPPORT_CAL_RESULT_BACKUP_TO_HOST
/*
* Memo
* 00 : Reset All Cal Data in Driver
* 01 : Trigger All Cal Function
* 02 : Get Thermal Temp from FW
* 03 : Get Cal Data Size from FW
* 04 : Get Cal Data from FW (Rom)
* 05 : Get Cal Data from FW (Ram)
* 06 : Print Cal Data in Driver (Rom)
* 07 : Print Cal Data in Driver (Ram)
* 08 : Print Cal Data in FW (Rom)
* 09 : Print Cal Data in FW (Ram)
* 10 : Send Cal Data to FW (Rom)
* 11 : Send Cal Data to FW (Ram)
*/
static int priv_driver_set_calbackup_test_drv_fw(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret, u4GetInput;
int32_t i4ArgNum = 2;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(RFTEST, INFO, "%s\r\n", __func__);
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= i4ArgNum) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4GetInput);
if (u4Ret)
DBGLOG(RFTEST, INFO,
"priv_driver_set_calbackup_test_drv_fw Parsing Fail\n");
if (u4GetInput == 0) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#0 : Reset All Cal Data in Driver.\n");
/* (New Flow 20160720) Step 0 : Reset All Cal Data
* Structure
*/
memset(&g_rBackupCalDataAllV2, 1,
sizeof(struct RLM_CAL_RESULT_ALL_V2));
g_rBackupCalDataAllV2.u4MagicNum1 = 6632;
g_rBackupCalDataAllV2.u4MagicNum2 = 6632;
} else if (u4GetInput == 1) {
DBGLOG(RFTEST, INFO,
"CMD#1 : Trigger FW Do All Cal.\n");
/* Step 1 : Trigger All Cal Function */
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 1, 2, 0);
DBGLOG(RFTEST, INFO,
"Trigger FW Do All Cal, rStatus = 0x%08x\n",
rStatus);
} else if (u4GetInput == 2) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#2 : Get Thermal Temp from FW.\n");
/* (New Flow 20160720) Step 2 : Get Thermal Temp from
* FW
*/
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 0, 0, 0);
DBGLOG(RFTEST, INFO,
"Get Thermal Temp from FW, rStatus = 0x%08x\n",
rStatus);
} else if (u4GetInput == 3) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#3 : Get Cal Data Size from FW.\n");
/* (New Flow 20160720) Step 3 : Get Cal Data Size from
* FW
*/
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 0, 1, 0);
DBGLOG(RFTEST, INFO,
"Get Rom Cal Data Size, rStatus = 0x%08x\n",
rStatus);
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 0, 1, 1);
DBGLOG(RFTEST, INFO,
"Get Ram Cal Data Size, rStatus = 0x%08x\n",
rStatus);
} else if (u4GetInput == 4) {
#if 1
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#4 : Print Cal Data in FW (Ram) (Part 1 - [0]~[3327]).\n");
/* Debug Use : Print Cal Data in FW (Ram) */
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 4, 6, 1);
DBGLOG(RFTEST, INFO,
"Print Cal Data in FW (Ram), rStatus = 0x%08x\n",
rStatus);
#else /* For Temp Use this Index */
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#4 : Get Cal Data from FW (Rom). Start!!!!!!!!!!!\n");
DBGLOG(RFTEST, INFO, "Thermal Temp = %d\n",
g_rBackupCalDataAllV2.u4ThermalInfo);
DBGLOG(RFTEST, INFO, "Total Length (Rom) = %d\n",
g_rBackupCalDataAllV2.u4ValidRomCalDataLength);
/* (New Flow 20160720) Step 3 : Get Cal Data from FW */
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 2, 4, 0);
DBGLOG(RFTEST, INFO,
"Get Cal Data from FW (Rom), rStatus = 0x%08x\n",
rStatus);
#endif
} else if (u4GetInput == 5) {
#if 1
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#5 : Print RAM Cal Data in Driver (Part 1 - [0]~[3327]).\n");
DBGLOG(RFTEST, INFO,
"==================================================================\n");
/* RFTEST_INFO_LOGDUMP32(
* &(g_rBackupCalDataAllV2.au4RamCalData[0]),
* 3328*sizeof(uint32_t));
*/
DBGLOG(RFTEST, INFO,
"==================================================================\n");
DBGLOG(RFTEST, INFO,
"Dumped Ram Cal Data Szie : %d bytes\n",
3328*sizeof(uint32_t));
DBGLOG(RFTEST, INFO,
"Total Ram Cal Data Szie : %d bytes\n",
g_rBackupCalDataAllV2.u4ValidRamCalDataLength);
DBGLOG(RFTEST, INFO,
"==================================================================\n");
#else /* For Temp Use this Index */
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#5 : Get Cal Data from FW (Ram). Start!!!!!!!!!!!\n");
DBGLOG(RFTEST, INFO, "Thermal Temp = %d\n",
g_rBackupCalDataAllV2.u4ThermalInfo);
DBGLOG(RFTEST, INFO, "Total Length (Ram) = %d\n",
g_rBackupCalDataAllV2.u4ValidRamCalDataLength);
/* (New Flow 20160720) Step 3 : Get Cal Data from FW */
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 2, 4, 1);
DBGLOG(RFTEST, INFO,
"Get Cal Data from FW (Ram), rStatus = 0x%08x\n",
rStatus);
#endif
} else if (u4GetInput == 6) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#6 : Print ROM Cal Data in Driver.\n");
DBGLOG(RFTEST, INFO,
"==================================================================\n");
/* RFTEST_INFO_LOGDUMP32(
* &(g_rBackupCalDataAllV2.au4RomCalData[0]),
* g_rBackupCalDataAllV2.u4ValidRomCalDataLength);
*/
DBGLOG(RFTEST, INFO,
"==================================================================\n");
DBGLOG(RFTEST, INFO,
"Total Rom Cal Data Szie : %d bytes\n",
g_rBackupCalDataAllV2.u4ValidRomCalDataLength);
DBGLOG(RFTEST, INFO,
"==================================================================\n");
} else if (u4GetInput == 7) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#7 : Print RAM Cal Data in Driver (Part 2 - [3328]~[6662]).\n");
DBGLOG(RFTEST, INFO,
"==================================================================\n");
/* RFTEST_INFO_LOGDUMP32(
* &(g_rBackupCalDataAllV2.au4RamCalData[3328]),
* (g_rBackupCalDataAllV2.u4ValidRamCalDataLength -
* 3328*sizeof(uint32_t)));
*/
DBGLOG(RFTEST, INFO,
"==================================================================\n");
DBGLOG(RFTEST, INFO,
"Dumped Ram Cal Data Szie : %d bytes\n",
(g_rBackupCalDataAllV2.u4ValidRamCalDataLength -
3328*sizeof(uint32_t)));
DBGLOG(RFTEST, INFO,
"Total Ram Cal Data Szie : %d bytes\n",
g_rBackupCalDataAllV2.u4ValidRamCalDataLength);
DBGLOG(RFTEST, INFO,
"==================================================================\n");
} else if (u4GetInput == 8) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#8 : Print Cal Data in FW (Rom).\n");
/* Debug Use : Print Cal Data in FW (Rom) */
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 4, 6, 0);
DBGLOG(RFTEST, INFO,
"Print Cal Data in FW (Rom), rStatus = 0x%08x\n",
rStatus);
} else if (u4GetInput == 9) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#9 : Print Cal Data in FW (Ram) (Part 2 - [3328]~[6662]).\n");
/* Debug Use : Print Cal Data in FW (Ram) */
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 4, 6, 2);
DBGLOG(RFTEST, INFO,
"Print Cal Data in FW (Ram), rStatus = 0x%08x\n",
rStatus);
} else if (u4GetInput == 10) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#10 : Send Cal Data to FW (Rom).\n");
/* Send Cal Data to FW (Rom) */
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 3, 5, 0);
DBGLOG(RFTEST, INFO,
"Send Cal Data to FW (Rom), rStatus = 0x%08x\n",
rStatus);
} else if (u4GetInput == 11) {
DBGLOG(RFTEST, INFO,
"(New Flow) CMD#11 : Send Cal Data to FW (Ram).\n");
/* Send Cal Data to FW (Ram) */
rStatus = rlmCalBackup(prGlueInfo->prAdapter, 3, 5, 1);
DBGLOG(RFTEST, INFO,
"Send Cal Data to FW (Ram), rStatus = 0x%08x\n",
rStatus);
}
}
return i4BytesWritten;
} /* priv_driver_set_calbackup_test_drv_fw */
#endif
#if CFG_SUPPORT_ADJUST_MCC_MODE_SET
static int priv_driver_set_mcc_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct ADAPTER *prAdapter = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int32_t i4BytesWritten = 0;
/* MCC mode 0: fair (5:5), 1: favor STA (7:3), 2: favor P2P (3:7) */
uint32_t ucMccMode = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = 0;
uint8_t ucRole;
uint32_t u4MccTimeToSet = 0;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prAdapter = prGlueInfo->prAdapter;
if (i4Argc != 2)
goto out;
i4Ret = kalkStrtou32(apcArgv[1], 0, &ucMccMode);
if (i4Ret) {
DBGLOG(REQ, LOUD, "Parse ucMccMode error i4Ret=%d\n", i4Ret);
goto out;
}
if (ucMccMode == MCC_FAIR) {
prAdapter->ucModeMCC = MCC_FAIR;
DBGLOG(REQ, TRACE,
"Current dynamic MCC priority : Fair\n");
#if CFG_SUPPORT_RX_DYNAMIC_MCC_PRIORITY
prAdapter->ucModeMCC_STA_time = MCC_TIME_5;
prAdapter->ucModeMCC_P2P_time = MCC_TIME_5;
#endif
} else if (ucMccMode == MCC_FAV_STA) {
prAdapter->ucModeMCC = MCC_FAV_STA;
DBGLOG(REQ, TRACE,
"Current dynamic MCC priority : STA favor\n");
#if CFG_SUPPORT_RX_DYNAMIC_MCC_PRIORITY
prAdapter->ucModeMCC_STA_time = MCC_TIME_7;
prAdapter->ucModeMCC_P2P_time = MCC_TIME_3;
#endif
} else if (ucMccMode == MCC_FAV_P2P) {
prAdapter->ucModeMCC = MCC_FAV_P2P;
DBGLOG(REQ, TRACE,
"Current dynamic MCC priority : P2P Favor\n");
#if CFG_SUPPORT_RX_DYNAMIC_MCC_PRIORITY
prAdapter->ucModeMCC_STA_time = MCC_TIME_3;
prAdapter->ucModeMCC_P2P_time = MCC_TIME_7;
#endif
} else {
DBGLOG(REQ, LOUD, "Wrong MCC mode %i\n", ucMccMode);
i4BytesWritten = -1;
goto out;
}
/*0:CFG_MCC_AIS_QUOTA_TYPE,
**1:CFG_MCC_P2PGC_QUOTA_TYPE, 2:CFG_MCC_P2PGO_QUOTA_TYPE
*/
for (ucRole = CFG_MCC_AIS_QUOTA_TYPE;
ucRole <= CFG_MCC_P2PGO_QUOTA_TYPE; ucRole++) {
if (ucRole == CFG_MCC_AIS_QUOTA_TYPE)
u4MccTimeToSet = prAdapter->ucModeMCC_STA_time;
else
u4MccTimeToSet = prAdapter->ucModeMCC_P2P_time;
snprintf(pcCommand, i4TotalLen,
CMD_SET_CHIP " mccTime %d %d",
ucRole, u4MccTimeToSet);
priv_driver_set_chip_config(prNetDev, pcCommand,
i4TotalLen);
}
out:
return i4BytesWritten;
}
#endif
#if CFG_WOW_SUPPORT
static int priv_driver_set_wow(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct WOW_CTRL *pWOW_CTRL = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret = 0;
uint32_t Enable = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
pWOW_CTRL = &prGlueInfo->prAdapter->rWowCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc < 2)
return -1;
u4Ret = kalkStrtou32(apcArgv[1], 0, &Enable);
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse bEnable error u4Ret=%d\n", u4Ret);
DBGLOG(INIT, INFO, "CMD set_wow_enable = %d\n",
Enable);
DBGLOG(INIT, INFO, "Scenario ID %d\n",
pWOW_CTRL->ucScenarioId);
DBGLOG(INIT, INFO, "ucBlockCount %d\n",
pWOW_CTRL->ucBlockCount);
DBGLOG(INIT, INFO, "interface %d\n",
pWOW_CTRL->astWakeHif[0].ucWakeupHif);
DBGLOG(INIT, INFO, "gpio_pin %d\n",
pWOW_CTRL->astWakeHif[0].ucGpioPin);
DBGLOG(INIT, INFO, "gpio_level 0x%x\n",
pWOW_CTRL->astWakeHif[0].ucTriggerLvl);
DBGLOG(INIT, INFO, "gpio_timer %d\n",
pWOW_CTRL->astWakeHif[0].u4GpioInterval);
kalWowProcess(prGlueInfo, Enable);
#if defined(_HIF_USB)
if (Enable)
glUsbSetState(&prGlueInfo->rHifInfo, USB_STATE_SUSPEND);
else
glUsbSetState(&prGlueInfo->rHifInfo, USB_STATE_LINK_UP);
#endif
return 0;
}
static int priv_driver_set_wow_enable(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct WOW_CTRL *pWOW_CTRL = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret = 0;
uint8_t ucEnable = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
pWOW_CTRL = &prGlueInfo->prAdapter->rWowCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc < 2)
return -1;
u4Ret = kalkStrtou8(apcArgv[1], 0, &ucEnable);
if (u4Ret)
DBGLOG(REQ, LOUD,
"parse bEnable error u4Ret=%d\n", u4Ret);
pWOW_CTRL->fgWowEnable = ucEnable;
DBGLOG(PF, INFO, "WOW enable %d\n", pWOW_CTRL->fgWowEnable);
return 0;
}
static int priv_driver_set_wow_par(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct WOW_CTRL *pWOW_CTRL = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint8_t ucWakeupHif = 0, GpioPin = 0, ucGpioLevel = 0, ucBlockCount,
ucScenario = 0;
uint32_t u4GpioTimer = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
pWOW_CTRL = &prGlueInfo->prAdapter->rWowCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc < 7)
return -1;
u4Ret = kalkStrtou8(apcArgv[1], 0, &ucWakeupHif);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse ucWakeupHif error u4Ret=%d\n",
u4Ret);
pWOW_CTRL->astWakeHif[0].ucWakeupHif = ucWakeupHif;
u4Ret = kalkStrtou8(apcArgv[2], 0, &GpioPin);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse GpioPin error u4Ret=%d\n",
u4Ret);
pWOW_CTRL->astWakeHif[0].ucGpioPin = GpioPin;
u4Ret = kalkStrtou8(apcArgv[3], 0, &ucGpioLevel);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse Gpio level error u4Ret=%d\n",
u4Ret);
pWOW_CTRL->astWakeHif[0].ucTriggerLvl = ucGpioLevel;
u4Ret = kalkStrtou32(apcArgv[4], 0, &u4GpioTimer);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse u4GpioTimer error u4Ret=%d\n",
u4Ret);
pWOW_CTRL->astWakeHif[0].u4GpioInterval = u4GpioTimer;
u4Ret = kalkStrtou8(apcArgv[5], 0, &ucScenario);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse ucScenario error u4Ret=%d\n",
u4Ret);
pWOW_CTRL->ucScenarioId = ucScenario;
u4Ret = kalkStrtou8(apcArgv[6], 0, &ucBlockCount);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse ucBlockCnt error u4Ret=%d\n",
u4Ret);
pWOW_CTRL->ucBlockCount = ucBlockCount;
DBGLOG(INIT, INFO, "gpio_scenario%d\n",
pWOW_CTRL->ucScenarioId);
DBGLOG(INIT, INFO, "interface %d\n",
pWOW_CTRL->astWakeHif[0].ucWakeupHif);
DBGLOG(INIT, INFO, "gpio_pin %d\n",
pWOW_CTRL->astWakeHif[0].ucGpioPin);
DBGLOG(INIT, INFO, "gpio_level %d\n",
pWOW_CTRL->astWakeHif[0].ucTriggerLvl);
DBGLOG(INIT, INFO, "gpio_timer %d\n",
pWOW_CTRL->astWakeHif[0].u4GpioInterval);
return 0;
}
static int priv_driver_set_wow_udpport(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct WOW_CTRL *pWOW_CTRL = NULL;
int32_t i4Argc = 0;
int8_t *apcPortArgv[WLAN_CFG_ARGV_MAX_LONG] = { 0 }; /* to input 20 port
*/
int32_t u4Ret = 0, ii;
uint8_t ucVer, ucCount;
uint16_t u2Port = 0;
uint16_t *pausPortArry;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
pWOW_CTRL = &prGlueInfo->prAdapter->rWowCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgumentLong(pcCommand, &i4Argc, apcPortArgv);
DBGLOG(REQ, WARN, "argc is %i\n", i4Argc);
/* example ipv4: set_wow_udp 0 5353,8080 (set) */
/* example ipv4: set_wow_udp 0 (clear) */
/* example ipv6: set_wow_udp 1 8000 (set) */
/* example ipv6: set_wow_udp 1 (clear) */
if (i4Argc >= 3) {
/* Pick Max */
ucCount = ((i4Argc - 2) > MAX_TCP_UDP_PORT) ? MAX_TCP_UDP_PORT :
(i4Argc - 2);
DBGLOG(PF, INFO, "UDP ucCount=%d\n", ucCount);
u4Ret = kalkStrtou8(apcPortArgv[1], 0, &ucVer);
if (u4Ret) {
DBGLOG(REQ, LOUD, "parse ucWakeupHif error u4Ret=%d\n",
u4Ret);
return -1;
}
/* IPv4/IPv6 */
DBGLOG(PF, INFO, "ucVer=%d\n", ucVer);
if (ucVer == 0) {
pWOW_CTRL->stWowPort.ucIPv4UdpPortCnt = ucCount;
pausPortArry = pWOW_CTRL->stWowPort.ausIPv4UdpPort;
} else {
pWOW_CTRL->stWowPort.ucIPv6UdpPortCnt = ucCount;
pausPortArry = pWOW_CTRL->stWowPort.ausIPv6UdpPort;
}
/* Port */
for (ii = 0; ii < ucCount; ii++) {
u4Ret = kalkStrtou16(apcPortArgv[ii+2], 0, &u2Port);
if (u4Ret) {
DBGLOG(PF, ERROR,
"parse u2Port error u4Ret=%d\n", u4Ret);
return -1;
}
pausPortArry[ii] = u2Port;
DBGLOG(PF, INFO, "ucPort=%d, idx=%d\n", u2Port, ii);
}
return 0;
} else if (i4Argc == 2) {
u4Ret = kalkStrtou8(apcPortArgv[1], 0, &ucVer);
if (u4Ret) {
DBGLOG(REQ, LOUD, "parse ucWakeupHif error u4Ret=%d\n",
u4Ret);
return -1;
}
if (ucVer == 0) {
kalMemZero(prGlueInfo->prAdapter->rWowCtrl.stWowPort
.ausIPv4UdpPort,
sizeof(uint16_t) * MAX_TCP_UDP_PORT);
prGlueInfo->prAdapter->rWowCtrl.stWowPort
.ucIPv4UdpPortCnt = 0;
} else {
kalMemZero(prGlueInfo->prAdapter->rWowCtrl.stWowPort
.ausIPv6UdpPort,
sizeof(uint16_t) * MAX_TCP_UDP_PORT);
prGlueInfo->prAdapter->rWowCtrl.stWowPort
.ucIPv6UdpPortCnt = 0;
}
return 0;
} else
return -1;
}
static int priv_driver_set_wow_tcpport(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct WOW_CTRL *pWOW_CTRL = NULL;
int32_t i4Argc = 0;
int8_t *apcPortArgv[WLAN_CFG_ARGV_MAX_LONG] = { 0 }; /* to input 20 port
*/
int32_t u4Ret = 0, ii;
uint8_t ucVer, ucCount;
uint16_t u2Port = 0;
uint16_t *pausPortArry;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
pWOW_CTRL = &prGlueInfo->prAdapter->rWowCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgumentLong(pcCommand, &i4Argc, apcPortArgv);
DBGLOG(REQ, WARN, "argc is %i\n", i4Argc);
/* example ipv4: set_wow_tcp 0 5353,8080 (set) */
/* example ipv4: set_wow_tcp 0 (clear) */
/* example ipv6: set_wow_tcp 1 8000 (set) */
/* example ipv6: set_wow_tcp 1 (clear) */
if (i4Argc >= 3) {
/* Pick Max */
ucCount = ((i4Argc - 2) > MAX_TCP_UDP_PORT) ? MAX_TCP_UDP_PORT :
(i4Argc - 2);
DBGLOG(PF, INFO, "TCP ucCount=%d\n", ucCount);
u4Ret = kalkStrtou8(apcPortArgv[1], 0, &ucVer);
if (u4Ret) {
DBGLOG(REQ, LOUD, "parse ucWakeupHif error u4Ret=%d\n",
u4Ret);
return -1;
}
/* IPv4/IPv6 */
DBGLOG(PF, INFO, "Ver=%d\n", ucVer);
if (ucVer == 0) {
pWOW_CTRL->stWowPort.ucIPv4TcpPortCnt = ucCount;
pausPortArry = pWOW_CTRL->stWowPort.ausIPv4TcpPort;
} else {
pWOW_CTRL->stWowPort.ucIPv6TcpPortCnt = ucCount;
pausPortArry = pWOW_CTRL->stWowPort.ausIPv6TcpPort;
}
/* Port */
for (ii = 0; ii < ucCount; ii++) {
u4Ret = kalkStrtou16(apcPortArgv[ii+2], 0, &u2Port);
if (u4Ret) {
DBGLOG(PF, ERROR,
"parse u2Port error u4Ret=%d\n", u4Ret);
return -1;
}
pausPortArry[ii] = u2Port;
DBGLOG(PF, INFO, "ucPort=%d, idx=%d\n", u2Port, ii);
}
return 0;
} else if (i4Argc == 2) {
u4Ret = kalkStrtou8(apcPortArgv[1], 0, &ucVer);
if (u4Ret) {
DBGLOG(REQ, LOUD, "parse ucWakeupHif error u4Ret=%d\n",
u4Ret);
return -1;
}
if (ucVer == 0) {
kalMemZero(
prGlueInfo->prAdapter->rWowCtrl.stWowPort
.ausIPv4TcpPort,
sizeof(uint16_t) * MAX_TCP_UDP_PORT);
prGlueInfo->prAdapter->rWowCtrl.stWowPort
.ucIPv4TcpPortCnt = 0;
} else {
kalMemZero(
prGlueInfo->prAdapter->rWowCtrl.stWowPort
.ausIPv6TcpPort,
sizeof(uint16_t) * MAX_TCP_UDP_PORT);
prGlueInfo->prAdapter->rWowCtrl.stWowPort
.ucIPv6TcpPortCnt = 0;
}
return 0;
} else
return -1;
}
static int priv_driver_get_wow_port(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct WOW_CTRL *pWOW_CTRL = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0, ii;
uint8_t ucVer, ucProto;
uint16_t ucCount;
uint16_t *pausPortArry;
int8_t *aucIp[2] = {"IPv4", "IPv6"};
int8_t *aucProto[2] = {"UDP", "TCP"};
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
pWOW_CTRL = &prGlueInfo->prAdapter->rWowCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
/* example: get_wow_port 0 0 (ipv4-udp) */
/* example: get_wow_port 0 1 (ipv4-tcp) */
/* example: get_wow_port 1 0 (ipv6-udp) */
/* example: get_wow_port 1 1 (ipv6-tcp) */
if (i4Argc >= 3) {
/* 0=IPv4, 1=IPv6 */
u4Ret = kalkStrtou8(apcArgv[1], 0, &ucVer);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse argc[1] error u4Ret=%d\n",
u4Ret);
/* 0=UDP, 1=TCP */
u4Ret = kalkStrtou8(apcArgv[2], 0, &ucProto);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse argc[2] error u4Ret=%d\n",
u4Ret);
if (ucVer > 1)
ucVer = 0;
if (ucProto > 1)
ucProto = 0;
if (ucVer == 0) {
if (ucProto == 0) {
/* IPv4/UDP */
ucCount = pWOW_CTRL->stWowPort.ucIPv4UdpPortCnt;
pausPortArry =
pWOW_CTRL->stWowPort.ausIPv4UdpPort;
} else {
/* IPv4/TCP */
ucCount = pWOW_CTRL->stWowPort.ucIPv4TcpPortCnt;
pausPortArry =
pWOW_CTRL->stWowPort.ausIPv4TcpPort;
}
} else {
if (ucProto == 0) {
/* IPv6/UDP */
ucCount = pWOW_CTRL->stWowPort.ucIPv6UdpPortCnt;
pausPortArry =
pWOW_CTRL->stWowPort.ausIPv6UdpPort;
} else {
/* IPv6/TCP */
ucCount = pWOW_CTRL->stWowPort.ucIPv6TcpPortCnt;
pausPortArry =
pWOW_CTRL->stWowPort.ausIPv6TcpPort;
}
}
/* Dunp Port */
for (ii = 0; ii < ucCount; ii++)
DBGLOG(PF, INFO, "ucPort=%d, idx=%d\n",
pausPortArry[ii], ii);
DBGLOG(PF, INFO, "[%s/%s] count:%d\n", aucIp[ucVer],
aucProto[ucProto], ucCount);
return 0;
} else
return -1;
}
static int priv_driver_get_wow_reason(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int32_t i4BytesWritten = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
struct WOW_CTRL *pWOW_CTRL = NULL;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
pWOW_CTRL = &prGlueInfo->prAdapter->rWowCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (pWOW_CTRL->ucReason != INVALID_WOW_WAKE_UP_REASON)
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nwakeup_reason:%d", pWOW_CTRL->ucReason);
return i4BytesWritten;
}
static int priv_driver_set_suspend_cmd(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct WOW_CTRL *pWOW_CTRL = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret = 0;
uint32_t Enable = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
pWOW_CTRL = &prGlueInfo->prAdapter->rWowCtrl;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
u4Ret = kalkStrtou32(apcArgv[1], 0, &Enable);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse bEnable error u4Ret=%d\n", u4Ret);
wlanSetSuspendMode(prGlueInfo, Enable);
return 0;
}
#if CFG_SUPPORT_MDNS_OFFLOAD
#if TEST_CODE_FOR_MDNS
/* test code for mdns offload */
/* _googlecast.tcp.local */
uint8_t ptr_name[100] = {
0x0b, 0x5f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x63, 0x61, 0x73, 0x74, 0x04, 0x5f, 0x74, 0x63,
0x70, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c};
/* _googlezone._tcp.local */
uint8_t ptr_name2[100] = {
0x0b, 0x5f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x7a, 0x6f, 0x6e, 0x65, 0x04, 0x5f, 0x74, 0x63,
0x70, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c};
uint8_t response[500] = {
0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0x02, 0x0b, 0x5f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x63, 0x61, 0x73, 0x74, 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05,
0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
0x00, 0x00, 0x00, 0x78, 0x00, 0x18, 0x15, 0x69, 0x73, 0x74,
0x6f, 0x2d, 0x38, 0x61, 0x61, 0x30, 0x31, 0x38, 0x66, 0x63,
0x34, 0x30, 0x37, 0x63, 0x64, 0x66, 0x65, 0x64, 0xc0, 0x0c,
0xc0, 0x2e, 0x00, 0x21, 0x80, 0x01, 0x00, 0x00, 0x00, 0x78,
0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x49, 0x10, 0x38,
0x61, 0x61, 0x30, 0x31, 0x38, 0x66, 0x63, 0x34, 0x30, 0x37,
0x63, 0x64, 0x66, 0x65, 0x64, 0x05, 0x6c, 0x6f, 0x63, 0x61,
0x6c, 0xc0, 0x1d, 0xc0, 0x2e, 0x00, 0x21, 0x80, 0x01, 0x00,
0x00, 0x00, 0x78, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1f,
0x49, 0xc0, 0x58};
uint8_t response2[500] = {
0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0x03, 0x0b, 0x5f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x7a, 0x6f, 0x6e, 0x65, 0x04, 0x5f, 0x74, 0x63, 0x70, 0x05,
0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
0x00, 0x00, 0x00, 0x78, 0x00, 0x27, 0x24, 0x61, 0x31, 0x33,
0x39, 0x36, 0x63, 0x32, 0x66, 0x2d, 0x38, 0x66, 0x30, 0x32,
0x2d, 0x39, 0x35, 0x33, 0x65, 0x2d, 0x30, 0x31, 0x61, 0x64,
0x2d, 0x30, 0x61, 0x64, 0x31, 0x33, 0x31, 0x30, 0x64, 0x65,
0x63, 0x65, 0x32, 0xc0, 0x0c, 0xc0, 0x2e, 0x00, 0x10, 0x80,
0x01, 0x00, 0x00, 0x11, 0x94, 0x00, 0x38, 0x23, 0x69, 0x64,
0x3d, 0x35, 0x31, 0x31, 0x32, 0x32, 0x43, 0x34, 0x38, 0x41,
0x39, 0x38, 0x33, 0x30, 0x33, 0x30, 0x38, 0x30, 0x46, 0x32,
0x46, 0x44, 0x32, 0x44, 0x43, 0x30, 0x36, 0x34, 0x36, 0x35,
0x35, 0x37, 0x46, 0x13, 0x5f, 0x5f, 0x63, 0x6f, 0x6d, 0x6d,
0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x5f, 0x3d,
0x30, 0x7c, 0x30, 0xc0, 0x2e, 0x00, 0x21, 0x80, 0x01, 0x00,
0x00, 0x00, 0x78, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x27,
0x11, 0x24, 0x61, 0x31, 0x33, 0x39, 0x36, 0x63, 0x32, 0x66,
0x2d, 0x38, 0x66, 0x30, 0x32, 0x2d, 0x39, 0x35, 0x33, 0x65,
0x2d, 0x30, 0x31, 0x61, 0x64, 0x2d, 0x30, 0x61, 0x64, 0x31,
0x33, 0x31, 0x30, 0x64, 0x65, 0x63, 0x65, 0x32, 0xc0, 0x1d,
0xc0, 0xab, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x78,
0x00, 0x04, 0xc0, 0xab, 0x1f, 0x44};
static int priv_driver_test_add_mdns_record(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct MDNS_INFO_UPLAYER_T *prMdnsUplayerInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret = 0;
uint8_t ucIndex = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prMdnsUplayerInfo =
kalMemAlloc(sizeof(struct MDNS_INFO_UPLAYER_T), PHY_MEM_TYPE);
if (!prMdnsUplayerInfo) {
DBGLOG(REQ, WARN, "%s, alloc mem failed\n", __func__);
return -ENOMEM;
}
/* add record 2 */
kalMemZero(prMdnsUplayerInfo, sizeof(struct MDNS_INFO_UPLAYER_T));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
u4Ret = kalkStrtou8(apcArgv[1], 0, &ucIndex);
/* ucIndex == 0, ptr_name is _googlecast.tcp.local */
if (ucIndex > 0)
ptr_name[22] = ucIndex + '0';
/* add record 1 */
prMdnsUplayerInfo->ucCmd = MDNS_CMD_ADD_RECORD;
prMdnsUplayerInfo->mdns_param.query_ptr.type = 12;
prMdnsUplayerInfo->mdns_param.query_ptr.class = 1;
prMdnsUplayerInfo->mdns_param.query_ptr.name_length = 23;
kalMemCopy(prMdnsUplayerInfo->mdns_param.query_ptr.name,
ptr_name, sizeof(ptr_name));
prMdnsUplayerInfo->mdns_param.response_len = 133;
kalMemCopy(prMdnsUplayerInfo->mdns_param.response,
response, 133);
kalMdnsProcess(prGlueInfo, prMdnsUplayerInfo);
kalMemFree(prMdnsUplayerInfo, PHY_MEM_TYPE,
sizeof(struct MDNS_INFO_UPLAYER_T));
return 0;
}
static int priv_driver_add_mdns_record(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct MDNS_INFO_UPLAYER_T *prMdnsUplayerInfo = NULL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prMdnsUplayerInfo =
kalMemAlloc(sizeof(struct MDNS_INFO_UPLAYER_T), PHY_MEM_TYPE);
if (!prMdnsUplayerInfo) {
DBGLOG(REQ, WARN, "%s, alloc mem failed\n", __func__);
return -ENOMEM;
}
/* add record 2 */
kalMemZero(prMdnsUplayerInfo, sizeof(struct MDNS_INFO_UPLAYER_T));
prMdnsUplayerInfo->ucCmd = MDNS_CMD_ADD_RECORD;
prMdnsUplayerInfo->mdns_param.query_ptr.type = 12;
prMdnsUplayerInfo->mdns_param.query_ptr.class = 1;
prMdnsUplayerInfo->mdns_param.query_ptr.name_length = 23;
kalMemCopy(prMdnsUplayerInfo->mdns_param.query_ptr.name,
ptr_name2, sizeof(ptr_name2));
prMdnsUplayerInfo->mdns_param.response_len = 226;
kalMemCopy(prMdnsUplayerInfo->mdns_param.response,
response2, 226);
kalMdnsProcess(prGlueInfo, prMdnsUplayerInfo);
/* add record 1 */
prMdnsUplayerInfo->ucCmd = MDNS_CMD_ADD_RECORD;
prMdnsUplayerInfo->mdns_param.query_ptr.type = 12;
prMdnsUplayerInfo->mdns_param.query_ptr.class = 1;
prMdnsUplayerInfo->mdns_param.query_ptr.name_length = 23;
kalMemCopy(prMdnsUplayerInfo->mdns_param.query_ptr.name,
ptr_name, sizeof(ptr_name));
prMdnsUplayerInfo->mdns_param.response_len = 133;
kalMemCopy(prMdnsUplayerInfo->mdns_param.response,
response, 133);
kalMdnsProcess(prGlueInfo, prMdnsUplayerInfo);
/* add record 3 */
prMdnsUplayerInfo->ucCmd = MDNS_CMD_ADD_RECORD;
prMdnsUplayerInfo->mdns_param.query_ptr.type = 12;
prMdnsUplayerInfo->mdns_param.query_ptr.class = 1;
prMdnsUplayerInfo->mdns_param.query_ptr.name_length = 23;
kalMemCopy(prMdnsUplayerInfo->mdns_param.query_ptr.name,
ptr_name2, sizeof(ptr_name2));
prMdnsUplayerInfo->mdns_param.response_len = 133;
kalMemCopy(prMdnsUplayerInfo->mdns_param.response,
response, 133);
kalMdnsProcess(prGlueInfo, prMdnsUplayerInfo);
/* add record 4 */
prMdnsUplayerInfo->ucCmd = MDNS_CMD_ADD_RECORD;
prMdnsUplayerInfo->mdns_param.query_ptr.type = 12;
prMdnsUplayerInfo->mdns_param.query_ptr.class = 1;
prMdnsUplayerInfo->mdns_param.query_ptr.name_length = 23;
kalMemCopy(prMdnsUplayerInfo->mdns_param.query_ptr.name,
ptr_name, sizeof(ptr_name));
prMdnsUplayerInfo->mdns_param.response_len = 226;
kalMemCopy(prMdnsUplayerInfo->mdns_param.response,
response2, 226);
kalMdnsProcess(prGlueInfo, prMdnsUplayerInfo);
kalMemFree(prMdnsUplayerInfo, PHY_MEM_TYPE,
sizeof(struct MDNS_INFO_UPLAYER_T));
return 0;
}
static int priv_driver_send_mdns_record(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
kalSendClearRecordToFw(prGlueInfo);
kalSendMdnsRecordToFw(prGlueInfo);
return 0;
}
#endif
static int priv_driver_show_mdns_record(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
kalShowMdnsRecord(prGlueInfo);
return 0;
}
static int priv_driver_enable_mdns_offload(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct MDNS_INFO_UPLAYER_T *prMdnsUplayerInfo;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prMdnsUplayerInfo =
kalMemAlloc(sizeof(struct MDNS_INFO_UPLAYER_T), PHY_MEM_TYPE);
if (!prMdnsUplayerInfo) {
DBGLOG(REQ, WARN, "%s, alloc mem failed\n", __func__);
return -ENOMEM;
}
kalMemZero(prMdnsUplayerInfo, sizeof(struct MDNS_INFO_UPLAYER_T));
prMdnsUplayerInfo->ucCmd = MDNS_CMD_ENABLE;
kalMdnsProcess(prGlueInfo, prMdnsUplayerInfo);
kalMemFree(prMdnsUplayerInfo, PHY_MEM_TYPE,
sizeof(struct MDNS_INFO_UPLAYER_T));
return 0;
}
static int priv_driver_disable_mdns_offload(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct MDNS_INFO_UPLAYER_T *prMdnsUplayerInfo;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prMdnsUplayerInfo =
kalMemAlloc(sizeof(struct MDNS_INFO_UPLAYER_T), PHY_MEM_TYPE);
if (!prMdnsUplayerInfo) {
DBGLOG(REQ, WARN, "%s, alloc mem failed\n", __func__);
return -ENOMEM;
}
kalMemZero(prMdnsUplayerInfo, sizeof(struct MDNS_INFO_UPLAYER_T));
prMdnsUplayerInfo->ucCmd = MDNS_CMD_DISABLE;
kalMdnsProcess(prGlueInfo, prMdnsUplayerInfo);
kalMemFree(prMdnsUplayerInfo, PHY_MEM_TYPE,
sizeof(struct MDNS_INFO_UPLAYER_T));
return 0;
}
static int priv_driver_set_mdns_wake_flag(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret = 0;
uint8_t ucWakeFlag = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
u4Ret = kalkStrtou8(apcArgv[1], 0, &ucWakeFlag);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse ucWakeFlag error u4Ret=%u\n", u4Ret);
prGlueInfo->prAdapter->mdns_wake_flag = ucWakeFlag;
DBGLOG(REQ, STATE, "set mdns wake flag %u\n", ucWakeFlag);
return 0;
}
#endif
#endif
static int priv_driver_set_adv_pws(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret = 0;
uint8_t ucAdvPws = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc < 2)
return -1;
u4Ret = kalkStrtou8(apcArgv[1], 0, &ucAdvPws);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse bEnable error u4Ret=%d\n",
u4Ret);
prGlueInfo->prAdapter->rWifiVar.ucAdvPws = ucAdvPws;
DBGLOG(INIT, INFO, "AdvPws:%d\n",
prGlueInfo->prAdapter->rWifiVar.ucAdvPws);
return 0;
}
static int priv_driver_set_mdtim(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret = 0;
uint8_t ucMultiDtim = 0, ucVer;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
/* iwpriv wlan0 driver "set_mdtim 1 3 */
if (i4Argc >= 3) {
u4Ret = kalkStrtou8(apcArgv[1], 0, &ucVer);
if (u4Ret) {
DBGLOG(REQ, ERROR, "parse apcArgv1 error u4Ret=%d\n",
u4Ret);
return -1;
}
u4Ret = kalkStrtou8(apcArgv[2], 0, &ucMultiDtim);
if (u4Ret) {
DBGLOG(REQ, ERROR, "parse apcArgv2 error u4Ret=%d\n",
u4Ret);
return -1;
}
if (ucVer == 0) {
prGlueInfo->prAdapter->rWifiVar.ucWowOnMdtim =
ucMultiDtim;
DBGLOG(REQ, INFO, "WOW On MDTIM:%d\n",
prGlueInfo->prAdapter->rWifiVar.ucWowOnMdtim);
} else {
prGlueInfo->prAdapter->rWifiVar.ucWowOffMdtim =
ucMultiDtim;
DBGLOG(REQ, INFO, "WOW Off MDTIM:%d\n",
prGlueInfo->prAdapter->rWifiVar.ucWowOffMdtim);
}
}
return 0;
}
static int priv_driver_get_deep_sleep_cnt(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rWlanStatus;
int32_t i4BytesWritten = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = 0xb0100000;
rWlanStatus = kalIoctl(prGlueInfo, wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, STATE, "Deep sleep cnt=%d\n", rSwCtrlInfo.u4Data);
if (rWlanStatus == WLAN_STATUS_SUCCESS) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n Deep sleep cnt: %d\n", rSwCtrlInfo.u4Data);
}
return i4BytesWritten;
}
static int priv_driver_enforce_power_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rWlanStatus;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t i4Ret = 0;
uint16_t ucEnforcePowerMode;
struct PARAM_POWER_MODE_ rPowerMode;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (i4Argc != 2) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n format:enforce_power_mode [0|1|2|3]\n");
return i4BytesWritten;
}
i4Ret = kalkStrtou16(apcArgv[1], 0, &ucEnforcePowerMode);
if (i4Ret)
DBGLOG(REQ, ERROR, "parse enforce_power_mode error i4Ret=%d\n",
i4Ret);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prGlueInfo)
return -EFAULT;
if (!prGlueInfo->prAdapter->prAisBssInfo)
return -EFAULT;
rPowerMode.ucBssIdx = prGlueInfo->prAdapter->prAisBssInfo->ucBssIndex;
rPowerMode.ePowerMode = (enum PARAM_POWER_MODE) ucEnforcePowerMode;
prGlueInfo->prAdapter->rWifiVar.ucEnforcePSMode = rPowerMode.ePowerMode;
/* Restore Android's power mode setting
* if we do not enforce power mode.
*/
if (rPowerMode.ePowerMode >= Param_PowerModeMax &&
prGlueInfo->prAdapter->prAisBssInfo->ePowerModeFromUser
< Param_PowerModeMax) {
rPowerMode.ePowerMode =
prGlueInfo->prAdapter->prAisBssInfo->ePowerModeFromUser;
}
rWlanStatus = kalIoctl(prGlueInfo,
wlanoidSet802dot11PowerSaveProfile,
&rPowerMode,
sizeof(struct PARAM_POWER_MODE_),
FALSE, FALSE, TRUE, &u4BufLen);
if (rWlanStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rWlanStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_power_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
uint16_t ucEnforcePowerMode;
uint16_t ePowerModeFromUser;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prGlueInfo)
return -EFAULT;
if (!prGlueInfo->prAdapter->prAisBssInfo)
return -EFAULT;
ucEnforcePowerMode =
prGlueInfo->prAdapter->rWifiVar.ucEnforcePSMode;
ePowerModeFromUser =
prGlueInfo->prAdapter->prAisBssInfo->ePowerModeFromUser;
if (ucEnforcePowerMode < Param_PowerModeMax) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n enforce power mode %d\n", ucEnforcePowerMode);
} else {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\n enforce power mode: disabled\n");
}
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
" system power mode: %d\n", ePowerModeFromUser);
return i4BytesWritten;
}
#if CFG_CHIP_RESET_HANG
static int priv_driver_set_rst_hang(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc == 0) {
DBGLOG(REQ, INFO, "set_rst_hang Argc = %d\n", i4Argc);
return -EFAULT;
}
if (strnicmp(apcArgv[0], CMD_SET_RST_HANG,
strlen(CMD_SET_RST_HANG)) == 0) {
if (i4Argc < CMD_SET_RST_HANG_ARG_NUM) {
DBGLOG(REQ, STATE,
"[SER][L0] RST_HANG_SET arg num=%d,must be %d\n",
i4Argc, CMD_SET_RST_HANG_ARG_NUM);
return -EFAULT;
}
u4Ret = kalkStrtou8(apcArgv[1], 0, &fgIsResetHangState);
if (u4Ret)
DBGLOG(REQ, ERROR, "u4Ret=%d\n", u4Ret);
DBGLOG(REQ, STATE, "[SER][L0] set fgIsResetHangState=%d\n",
fgIsResetHangState);
if (fgIsResetHangState == SER_L0_HANG_RST_CMD_TRG) {
DBGLOG(REQ, STATE, "[SER][L0] cmd trigger\n");
glGetRstReason(RST_CMD_TRIGGER);
GL_RESET_TRIGGER(NULL, RST_FLAG_CHIP_RESET);
}
} else {
DBGLOG(REQ, STATE, "[SER][L0] get fgIsResetSqcState=%d\n",
fgIsResetHangState);
DBGLOG(REQ, ERROR, "[SER][L0] RST HANG subcmd(%s) error !\n",
apcArgv[0]);
return -EFAULT;
}
return 0;
}
#endif
#if CFG_SUPPORT_ANT_DIV
static int priv_driver_ant_diversity_config(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret;
uint8_t fgRead = FALSE;
uint8_t fgWaitResp = FALSE;
struct CMD_ANT_DIV_CTRL rAntDivInfo;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -EFAULT;
rAntDivInfo.ucAction = 0;
rAntDivInfo.ucAntId = 0;
rAntDivInfo.ucRcpi = 0;
rAntDivInfo.ucState = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc == 0) {
DBGLOG(REQ, INFO, "ANT_DIV Argc = %d\n", i4Argc);
return -EFAULT;
}
if (strnicmp(apcArgv[0],
CMD_GET_ANT_DIV,
strlen(CMD_GET_ANT_DIV)) == 0) {
if (i4Argc < CMD_GET_ANT_DIV_ARG_NUM) {
DBGLOG(REQ, INFO,
"GET_ANT_DIV arg num=%d, must be %d\n",
i4Argc, CMD_GET_ANT_DIV_ARG_NUM);
return -EFAULT;
}
rAntDivInfo.ucAction = ANT_DIV_CMD_GET_ANT;
fgRead = TRUE;
fgWaitResp = TRUE;
} else if (strnicmp(apcArgv[0],
CMD_DETC_ANT_DIV,
strlen(CMD_DETC_ANT_DIV)) == 0) {
if (i4Argc < CMD_DETC_ANT_DIV_ARG_NUM) {
DBGLOG(REQ, INFO,
"DECT_ANT_DIV arg num=%d, must be %d\n",
i4Argc, CMD_DETC_ANT_DIV_ARG_NUM);
return -EFAULT;
}
rAntDivInfo.ucAction = ANT_DIV_CMD_DETC;
fgRead = TRUE;
fgWaitResp = TRUE;
} else if (strnicmp(apcArgv[0],
CMD_SWH_ANT_DIV,
strlen(CMD_SWH_ANT_DIV)) == 0) {
if (i4Argc < CMD_SWH_ANT_DIV_ARG_NUM) {
DBGLOG(REQ, INFO,
"SWH_ANT_DIV arg num=%d, must be %d\n",
i4Argc, CMD_SWH_ANT_DIV_ARG_NUM);
return -EFAULT;
}
rAntDivInfo.ucAction = ANT_DIV_CMD_SWH;
fgRead = TRUE;
fgWaitResp = TRUE;
} else if (strnicmp(apcArgv[0],
CMD_SET_ANT_DIV,
strlen(CMD_SET_ANT_DIV)) == 0) {
if (i4Argc < CMD_SET_ANT_DIV_ARG_NUM) {
DBGLOG(REQ, INFO,
"SET_ANT_DIV arg num=%d, must be %d\n",
i4Argc, CMD_SET_ANT_DIV_ARG_NUM);
return -EFAULT;
}
rAntDivInfo.ucAction = ANT_DIV_CMD_SET_ANT;
fgRead = FALSE;
fgWaitResp = FALSE;
u4Ret = kalkStrtou8(apcArgv[1], 0, &(rAntDivInfo.ucAntId));
if (u4Ret ||
((rAntDivInfo.ucAntId != 1) &&
(rAntDivInfo.ucAntId != 2))) {
DBGLOG(REQ, INFO,
"Parse ANT Index error Ret=%d, AntId =%d\n",
u4Ret, rAntDivInfo.ucAntId);
return -EFAULT;
}
} else {
DBGLOG(REQ, INFO, "ANT DIV subcmd(%s) error !\n", apcArgv[0]);
return -EFAULT;
}
rStatus = kalIoctl(prGlueInfo,
wlanoidAntDivCfg,
&rAntDivInfo,
sizeof(rAntDivInfo),
fgRead,
fgWaitResp,
TRUE,
&u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
if (fgWaitResp) {
DBGLOG(REQ, LOUD,
"[ANT-DIV] priv_driver_ant_diversity_config\n");
DBGLOG(REQ, LOUD, "[ANT-DIV] action=%d\n",
rAntDivInfo.ucAction);
DBGLOG(REQ, LOUD, "[ANT-DIV] ucState=%d\n",
rAntDivInfo.ucState);
switch (rAntDivInfo.ucAction) {
case ANT_DIV_CMD_GET_ANT:
i4BytesWritten = scnprintf(pcCommand,
i4TotalLen,
"%d",
rAntDivInfo.ucState);
break;
case ANT_DIV_CMD_DETC:
if (rAntDivInfo.ucState == ANT_DIV_SUCCESS) {
/* rcpi to rssi */
DBGLOG(REQ, LOUD,
"[ANT-DIV] ucRcpi=%d rssi=%d\n",
rAntDivInfo.ucRcpi,
RCPI_TO_dBm(rAntDivInfo.ucRcpi));
i4BytesWritten = scnprintf(pcCommand,
i4TotalLen,
"%d",
RCPI_TO_dBm(rAntDivInfo.ucRcpi));
} else {
i4BytesWritten = scnprintf(pcCommand,
i4TotalLen,
"%d",
rAntDivInfo.ucState);
}
break;
case ANT_DIV_CMD_SWH:
i4BytesWritten = scnprintf(pcCommand,
i4TotalLen,
"%d",
rAntDivInfo.ucState);
break;
default:
DBGLOG(REQ, ERROR,
"[ANT-DIV][WARN] ucAction=%d\n",
rAntDivInfo.ucAction);
i4BytesWritten = scnprintf(pcCommand,
i4TotalLen, "fail");
break;
}
DBGLOG(REQ, INFO, "%s: command result is %s\n",
__func__, pcCommand);
}
return i4BytesWritten;
}
#endif
int priv_driver_set_suspend_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
u_int8_t fgEnable;
uint32_t u4Enable;
int32_t u4Ret = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= 2) {
/* fgEnable = (kalStrtoul(apcArgv[1], NULL, 0) == 1) ? TRUE :
* FALSE;
*/
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Enable);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse u4Enable error u4Ret=%d\n",
u4Ret);
if (u4Enable == 1)
fgEnable = TRUE;
else
fgEnable = FALSE;
#if (CFG_SUPPORT_APF == 1)
prGlueInfo->fgIsScreenOff = fgEnable;
nicRxSetAPFCntTimer(prGlueInfo, fgEnable);
#endif
if (prGlueInfo->fgIsInSuspendMode == fgEnable) {
DBGLOG(REQ, INFO,
"%s: Already in suspend mode [%u], SKIP!\n",
__func__, fgEnable);
return 0;
}
if (prGlueInfo->prAdapter->rWifiVar.ucDisSuspendScrOff) {
DBGLOG(REQ, INFO,
"No need to set suspend mode\n");
return 0;
}
DBGLOG(REQ, INFO, "%s: Set suspend mode [%u]\n", __func__,
fgEnable);
prGlueInfo->fgIsInSuspendMode = fgEnable;
wlanSetSuspendMode(prGlueInfo, fgEnable);
p2pSetSuspendMode(prGlueInfo, fgEnable);
}
return 0;
}
#if CFG_SUPPORT_SNIFFER
int priv_driver_set_monitor(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int32_t i4BytesWritten = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct PARAM_CUSTOM_MONITOR_SET_STRUCT rMonitorSetInfo;
uint8_t ucEnable = 0;
uint8_t ucPriChannel = 0;
uint8_t ucChannelWidth = 0;
uint8_t ucExt = 0;
uint8_t ucSco = 0;
uint8_t ucChannelS1 = 0;
uint8_t ucChannelS2 = 0;
u_int8_t fgIsLegalChannel = FALSE;
u_int8_t fgError = FALSE;
u_int8_t fgEnable = FALSE;
enum ENUM_BAND eBand = BAND_NULL;
uint32_t u4Parse = 0;
int32_t u4Ret = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (i4Argc >= 5) {
/* ucEnable = (uint8_t) (kalStrtoul(apcArgv[1], NULL, 0));
* ucPriChannel = (uint8_t) (kalStrtoul(apcArgv[2], NULL, 0));
* ucChannelWidth = (uint8_t) (kalStrtoul(apcArgv[3], NULL, 0));
* ucExt = (uint8_t) (kalStrtoul(apcArgv[4], NULL, 0));
*/
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Parse);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse apcArgv error u4Ret=%d\n",
u4Ret);
ucEnable = (uint8_t) u4Parse;
u4Ret = kalkStrtou32(apcArgv[2], 0, &u4Parse);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse apcArgv error u4Ret=%d\n",
u4Ret);
ucPriChannel = (uint8_t) u4Parse;
u4Ret = kalkStrtou32(apcArgv[3], 0, &u4Parse);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse apcArgv error u4Ret=%d\n",
u4Ret);
ucChannelWidth = (uint8_t) u4Parse;
u4Ret = kalkStrtou32(apcArgv[4], 0, &u4Parse);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse apcArgv error u4Ret=%d\n",
u4Ret);
ucExt = (uint8_t) u4Parse;
eBand = (ucPriChannel <= 14) ? BAND_2G4 : BAND_5G;
fgIsLegalChannel = rlmDomainIsLegalChannel(prAdapter, eBand,
ucPriChannel);
if (fgIsLegalChannel == FALSE) {
i4BytesWritten = snprintf(pcCommand, i4TotalLen,
"Illegal primary channel %d",
ucPriChannel);
return i4BytesWritten;
}
switch (ucChannelWidth) {
case 160:
ucChannelWidth = (uint8_t) CW_160MHZ;
ucSco = (uint8_t) CHNL_EXT_SCN;
if (ucPriChannel >= 36 && ucPriChannel <= 64)
ucChannelS2 = 50;
else if (ucPriChannel >= 100 && ucPriChannel <= 128)
ucChannelS2 = 114;
else
fgError = TRUE;
break;
case 80:
ucChannelWidth = (uint8_t) CW_80MHZ;
ucSco = (uint8_t) CHNL_EXT_SCN;
if (ucPriChannel >= 36 && ucPriChannel <= 48)
ucChannelS1 = 42;
else if (ucPriChannel >= 52 && ucPriChannel <= 64)
ucChannelS1 = 58;
else if (ucPriChannel >= 100 && ucPriChannel <= 112)
ucChannelS1 = 106;
else if (ucPriChannel >= 116 && ucPriChannel <= 128)
ucChannelS1 = 122;
else if (ucPriChannel >= 132 && ucPriChannel <= 144)
ucChannelS1 = 138;
else if (ucPriChannel >= 149 && ucPriChannel <= 161)
ucChannelS1 = 155;
else
fgError = TRUE;
break;
case 40:
ucChannelWidth = (uint8_t) CW_20_40MHZ;
ucSco = (ucExt) ? (uint8_t) CHNL_EXT_SCA :
(uint8_t) CHNL_EXT_SCB;
break;
case 20:
ucChannelWidth = (uint8_t) CW_20_40MHZ;
ucSco = (uint8_t) CHNL_EXT_SCN;
break;
default:
fgError = TRUE;
break;
}
if (fgError) {
i4BytesWritten =
snprintf(pcCommand, i4TotalLen,
"Invalid primary channel %d with bandwidth %d",
ucPriChannel, ucChannelWidth);
return i4BytesWritten;
}
fgEnable = (ucEnable) ? TRUE : FALSE;
if (prGlueInfo->fgIsEnableMon != fgEnable) {
prGlueInfo->fgIsEnableMon = fgEnable;
schedule_work(&prGlueInfo->monWork);
}
kalMemZero(&rMonitorSetInfo, sizeof(rMonitorSetInfo));
rMonitorSetInfo.ucEnable = ucEnable;
rMonitorSetInfo.ucPriChannel = ucPriChannel;
rMonitorSetInfo.ucSco = ucSco;
rMonitorSetInfo.ucChannelWidth = ucChannelWidth;
rMonitorSetInfo.ucChannelS1 = ucChannelS1;
rMonitorSetInfo.ucChannelS2 = ucChannelS2;
rStatus = kalIoctl(prGlueInfo, wlanoidSetMonitor,
&rMonitorSetInfo, sizeof(rMonitorSetInfo),
FALSE, FALSE, TRUE, &u4BufLen);
i4BytesWritten =
snprintf(pcCommand, i4TotalLen, "set monitor config %s",
(rStatus == WLAN_STATUS_SUCCESS) ?
"success" : "fail");
return i4BytesWritten;
}
i4BytesWritten = snprintf(pcCommand, i4TotalLen,
"monitor [Enable][PriChannel][ChannelWidth][Sco]");
return i4BytesWritten;
}
#endif
static int priv_driver_get_sta_index(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter;
int32_t i4BytesWritten = 0, i4Argc = 0;
uint8_t ucStaIdx, ucWlanIndex;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint8_t aucMacAddr[MAC_ADDR_LEN];
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc >= 2) {
wlanHwAddrToBin(apcArgv[1], &aucMacAddr[0]);
if (!wlanGetWlanIdxByAddress(prGlueInfo->prAdapter,
&aucMacAddr[0], &ucWlanIndex))
return i4BytesWritten;
if (wlanGetStaIdxByWlanIdx(prAdapter, ucWlanIndex, &ucStaIdx)
!= WLAN_STATUS_SUCCESS)
return i4BytesWritten;
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"StaIdx = %d, WlanIdx = %d\n", ucStaIdx,
ucWlanIndex);
}
return i4BytesWritten;
}
static int priv_driver_get_version(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter;
int32_t i4BytesWritten = 0;
uint32_t u4Offset = 0;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **)netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
u4Offset += fwDlGetFwdlInfo(prAdapter, pcCommand, i4TotalLen);
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"WiFi Driver Version %u.%u.%u\n",
NIC_DRIVER_MAJOR_VERSION,
NIC_DRIVER_MINOR_VERSION,
NIC_DRIVER_SERIAL_VERSION);
i4BytesWritten = (int32_t)u4Offset;
return i4BytesWritten;
}
#if CFG_SUPPORT_DBDC
int priv_driver_set_dbdc(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
uint32_t u4Ret, u4Parse;
uint8_t ucDBDCEnable;
/*UINT_8 ucBssIndex;*/
/*P_BSS_INFO_T prBssInfo;*/
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
#if 0
for (ucBssIndex = 0; ucBssIndex < (prAdapter->ucHwBssIdNum + 1);
ucBssIndex++) {
prBssInfo = prGlueInfo->prAdapter->aprBssInfo[ucBssIndex];
pr_info("****BSS %u inUse %u active %u Mode %u priCh %u state %u rfBand %u\n",
ucBssIndex,
prBssInfo->fgIsInUse,
prBssInfo->fgIsNetActive,
prBssInfo->eCurrentOPMode,
prBssInfo->ucPrimaryChannel,
prBssInfo->eConnectionState,
prBssInfo->eBand);
}
#endif
if (prGlueInfo->prAdapter->rWifiVar.eDbdcMode !=
ENUM_DBDC_MODE_DYNAMIC) {
DBGLOG(REQ, LOUD,
"Current DBDC mode %u cannot enable/disable DBDC!!\n",
prGlueInfo->prAdapter->rWifiVar.eDbdcMode);
return -1;
}
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (i4Argc == 2) {
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Parse);
if (u4Ret)
DBGLOG(REQ, LOUD, "parse apcArgv error u4Ret=%d\n",
u4Ret);
ucDBDCEnable = (uint8_t) u4Parse;
if ((!prGlueInfo->prAdapter->rWifiVar.fgDbDcModeEn &&
!ucDBDCEnable) ||
(prGlueInfo->prAdapter->rWifiVar.fgDbDcModeEn &&
ucDBDCEnable))
return i4BytesWritten;
rStatus = kalIoctl(prGlueInfo, wlanoidSetDbdcEnable,
&ucDBDCEnable, 1, FALSE, FALSE, TRUE,
&u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
} else {
DBGLOG(INIT, ERROR, "iwpriv wlanXX driver SET_DBDC <enable>\n");
DBGLOG(INIT, ERROR, "<enable> 1: enable. 0: disable.\n");
}
return i4BytesWritten;
}
#endif /*CFG_SUPPORT_DBDC*/
#if CFG_SUPPORT_BATCH_SCAN
#define CMD_BATCH_SET "WLS_BATCHING SET"
#define CMD_BATCH_GET "WLS_BATCHING GET"
#define CMD_BATCH_STOP "WLS_BATCHING STOP"
#endif
static int priv_driver_get_que_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
return qmDumpQueueStatus(prGlueInfo->prAdapter, pcCommand, i4TotalLen);
}
static int priv_driver_get_mem_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
return cnmDumpMemoryStatus(prGlueInfo->prAdapter, pcCommand,
i4TotalLen);
}
static int priv_driver_get_hif_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
return halDumpHifStatus(prGlueInfo->prAdapter, pcCommand, i4TotalLen);
}
static int priv_driver_get_cnm(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct PARAM_GET_CNM_T *prCnmInfo = NULL;
enum ENUM_DBDC_BN eDbdcIdx, eDbdcIdxMax;
uint8_t ucBssIdx;
struct BSS_INFO *prBssInfo;
enum ENUM_CNM_NETWORK_TYPE_T eNetworkType;
uint8_t ucNss;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
prCnmInfo = (struct PARAM_GET_CNM_T *)kalMemAlloc(
sizeof(struct PARAM_GET_CNM_T), VIR_MEM_TYPE);
if (prCnmInfo == NULL)
return -1;
kalMemZero(prCnmInfo, sizeof(struct PARAM_GET_CNM_T));
rStatus = kalIoctl(prGlueInfo, wlanoidQueryCnm, prCnmInfo,
sizeof(struct PARAM_GET_CNM_T),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n[CNM Info]\n");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"DBDC Mode : %s\n\n",
(prCnmInfo->fgIsDbdcEnable) ?
"Enable" : "Disable");
eDbdcIdxMax = (prCnmInfo->fgIsDbdcEnable)?ENUM_BAND_NUM:ENUM_BAND_1;
for (eDbdcIdx = ENUM_BAND_0; eDbdcIdx < eDbdcIdxMax; eDbdcIdx++) {
/* Do not clean history information */
/* if argc is bigger than 1 */
if (i4Argc < 2) {
if (prCnmInfo->ucOpChNum[eDbdcIdx] < 3)
prCnmInfo->ucChList[eDbdcIdx][2] = 0;
if (prCnmInfo->ucOpChNum[eDbdcIdx] < 2)
prCnmInfo->ucChList[eDbdcIdx][1] = 0;
if (prCnmInfo->ucOpChNum[eDbdcIdx] < 1)
prCnmInfo->ucChList[eDbdcIdx][0] = 0;
}
/* backward compatible for 7668 format */
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"BAND%u channels : %u %u %u\n",
eDbdcIdx,
prCnmInfo->ucChList[eDbdcIdx][0],
prCnmInfo->ucChList[eDbdcIdx][1],
prCnmInfo->ucChList[eDbdcIdx][2]);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Band %u OPCH %d [%u, %u, %u]\n",
eDbdcIdx,
prCnmInfo->ucOpChNum[eDbdcIdx],
prCnmInfo->ucChList[eDbdcIdx][0],
prCnmInfo->ucChList[eDbdcIdx][1],
prCnmInfo->ucChList[eDbdcIdx][2]);
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n");
for (ucBssIdx = BSSID_0; ucBssIdx < (BSSID_NUM+1); ucBssIdx++) {
prBssInfo = prGlueInfo->prAdapter->aprBssInfo[ucBssIdx];
if (!prBssInfo)
continue;
eNetworkType = cnmGetBssNetworkType(prBssInfo);
if (prCnmInfo->ucBssInuse[ucBssIdx] &&
prCnmInfo->ucBssActive[ucBssIdx] &&
((eNetworkType == ENUM_CNM_NETWORK_TYPE_P2P_GO) ||
((eNetworkType == ENUM_CNM_NETWORK_TYPE_AIS ||
eNetworkType == ENUM_CNM_NETWORK_TYPE_P2P_GC) &&
(prCnmInfo->ucBssConnectState[ucBssIdx] ==
PARAM_MEDIA_STATE_CONNECTED)))) {
if (eNetworkType == ENUM_CNM_NETWORK_TYPE_P2P_GO) {
struct STA_RECORD *prCurrStaRec =
(struct STA_RECORD *) NULL;
prCurrStaRec = LINK_PEEK_HEAD(
&prBssInfo->rStaRecOfClientList,
struct STA_RECORD, rLinkEntry);
if (prCurrStaRec != NULL &&
IS_CONNECTION_NSS2(prBssInfo,
prCurrStaRec)) {
ucNss = 2;
} else
ucNss = 1;
} else if (prBssInfo->prStaRecOfAP != NULL &&
IS_CONNECTION_NSS2(prBssInfo,
prBssInfo->prStaRecOfAP)) {
ucNss = 2;
} else
ucNss = 1;
} else {
eNetworkType = ENUM_CNM_NETWORK_TYPE_OTHER;
ucNss = prBssInfo->ucNss;
/* Do not show history information */
/* if argc is 1 */
if (i4Argc < 2)
continue;
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"BSS%u Inuse%u Act%u ConnStat%u [NetType%u][CH%3u][DBDC b%u][WMM%u b%u][OMAC%u b%u][BW%3u][NSS%u]\n",
ucBssIdx,
prCnmInfo->ucBssInuse[ucBssIdx],
prCnmInfo->ucBssActive[ucBssIdx],
prCnmInfo->ucBssConnectState[ucBssIdx],
eNetworkType,
prCnmInfo->ucBssCh[ucBssIdx],
prCnmInfo->ucBssDBDCBand[ucBssIdx],
prCnmInfo->ucBssWmmSet[ucBssIdx],
prCnmInfo->ucBssWmmDBDCBand[ucBssIdx],
prCnmInfo->ucBssOMACSet[ucBssIdx],
prCnmInfo->ucBssOMACDBDCBand[ucBssIdx],
20 * (0x01 << rlmGetBssOpBwByVhtAndHtOpInfo(prBssInfo)),
ucNss);
}
kalMemFree(prCnmInfo, VIR_MEM_TYPE, sizeof(struct PARAM_GET_CNM_T));
return i4BytesWritten;
} /* priv_driver_get_sw_ctrl */
#if CFG_AUTO_CHANNEL_SEL_SUPPORT
static int priv_driver_get_ch_rank_list(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t i4BytesWritten = 0;
int8_t ucIdx = 0, ucIdx2 = 0, ucChannelNum = 0,
ucNumOf2gChannel = 0, ucNumOf5gChannel = 0;
struct PARAM_GET_CHN_INFO *prChnLoadInfo = NULL;
struct RF_CHANNEL_INFO *prChannelList = NULL,
auc2gChannelList[MAX_2G_BAND_CHN_NUM],
auc5gChannelList[MAX_5G_BAND_CHN_NUM];
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prChnLoadInfo = &(prGlueInfo->prAdapter->rWifiVar.rChnLoadInfo);
kalMemZero(pcCommand, i4TotalLen);
rlmDomainGetChnlList(prGlueInfo->prAdapter, BAND_2G4, TRUE,
MAX_2G_BAND_CHN_NUM, &ucNumOf2gChannel,
auc2gChannelList);
rlmDomainGetChnlList(prGlueInfo->prAdapter, BAND_5G, TRUE,
MAX_5G_BAND_CHN_NUM, &ucNumOf5gChannel,
auc5gChannelList);
for (ucIdx = 0; ucIdx < MAX_CHN_NUM; ucIdx++) {
if (prChnLoadInfo->rChnRankList[ucIdx].ucChannel > 14) {
prChannelList = auc5gChannelList;
ucChannelNum = ucNumOf5gChannel;
} else {
prChannelList = auc2gChannelList;
ucChannelNum = ucNumOf2gChannel;
}
for (ucIdx2 = 0; ucIdx2 < ucChannelNum; ucIdx2++) {
if (prChnLoadInfo->rChnRankList[ucIdx].ucChannel ==
prChannelList[ucIdx2].ucChannelNum) {
pcCommand[i4BytesWritten++] =
prChnLoadInfo->rChnRankList[ucIdx]
.ucChannel;
DBGLOG(SCN, TRACE, "ch %u, dirtiness %d\n",
prChnLoadInfo->rChnRankList[ucIdx]
.ucChannel,
prChnLoadInfo->rChnRankList[ucIdx]
.u4Dirtiness);
break;
}
}
}
return i4BytesWritten;
}
static int priv_driver_get_ch_dirtiness(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int8_t cIdx = 0;
uint8_t ucNumOf2gChannel = 0;
uint8_t ucNumOf5gChannel = 0;
uint32_t i4BytesWritten = 0;
struct PARAM_GET_CHN_INFO *prChnLoadInfo = NULL;
struct RF_CHANNEL_INFO ar2gChannelList[MAX_2G_BAND_CHN_NUM];
struct RF_CHANNEL_INFO ar5gChannelList[MAX_5G_BAND_CHN_NUM];
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prChnLoadInfo = &(prGlueInfo->prAdapter->rWifiVar.rChnLoadInfo);
kalMemZero(pcCommand, i4TotalLen);
rlmDomainGetChnlList(prGlueInfo->prAdapter, BAND_2G4, TRUE,
MAX_2G_BAND_CHN_NUM, &ucNumOf2gChannel,
ar2gChannelList);
rlmDomainGetChnlList(prGlueInfo->prAdapter, BAND_5G, TRUE,
MAX_5G_BAND_CHN_NUM, &ucNumOf5gChannel,
ar5gChannelList);
for (cIdx = 0; cIdx < MAX_CHN_NUM; cIdx++) {
int8_t cIdx2 = 0;
uint8_t ucChannelNum = 0;
uint32_t u4Offset = 0;
struct RF_CHANNEL_INFO *prChannelList = NULL;
if (prChnLoadInfo->rChnRankList[cIdx].ucChannel > 14) {
prChannelList = ar5gChannelList;
ucChannelNum = ucNumOf5gChannel;
} else {
prChannelList = ar2gChannelList;
ucChannelNum = ucNumOf2gChannel;
}
for (cIdx2 = 0; cIdx2 < ucChannelNum; cIdx2++) {
if (prChnLoadInfo->rChnRankList[cIdx].ucChannel ==
prChannelList[cIdx2].ucChannelNum) {
u4Offset = kalSnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nch %03u -> dirtiness %u",
prChnLoadInfo->rChnRankList[cIdx]
.ucChannel,
prChnLoadInfo->rChnRankList[cIdx]
.u4Dirtiness);
i4BytesWritten += u4Offset;
break;
}
}
}
return i4BytesWritten;
}
#endif
static int priv_driver_efuse_ops(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
enum EFUSE_OP_MODE {
EFUSE_READ,
EFUSE_WRITE,
EFUSE_FREE,
EFUSE_INVALID,
};
uint8_t ucOpMode = EFUSE_INVALID;
uint8_t ucOpChar;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t u4Ret;
int32_t i4Parameter;
uint32_t u4Efuse_addr = 0;
uint8_t ucEfuse_value = 0;
#if (CFG_EEPROM_PAGE_ACCESS == 1)
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4Offset = 0;
uint32_t u4BufLen = 0;
uint8_t u4Index = 0;
struct GLUE_INFO *prGlueInfo = NULL;
struct PARAM_CUSTOM_ACCESS_EFUSE rAccessEfuseInfo;
#endif
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
/* Sanity check */
if (i4Argc < 2)
goto efuse_op_invalid;
ucOpChar = (uint8_t)apcArgv[1][0];
if ((i4Argc == 3) && (ucOpChar == 'r' || ucOpChar == 'R'))
ucOpMode = EFUSE_READ;
else if ((i4Argc == 4) && (ucOpChar == 'w' || ucOpChar == 'W'))
ucOpMode = EFUSE_WRITE;
else if ((ucOpChar == 'f' || ucOpChar == 'F'))
ucOpMode = EFUSE_FREE;
/* Print out help if input format is wrong */
if (ucOpMode == EFUSE_INVALID)
goto efuse_op_invalid;
/* convert address */
if (ucOpMode == EFUSE_READ || ucOpMode == EFUSE_WRITE) {
u4Ret = kalkStrtos32(apcArgv[2], 16, &i4Parameter);
u4Efuse_addr = (uint32_t)i4Parameter;
}
/* convert value */
if (ucOpMode == EFUSE_WRITE) {
u4Ret = kalkStrtos32(apcArgv[3], 16, &i4Parameter);
ucEfuse_value = (uint8_t)i4Parameter;
}
/* Start operation */
#if (CFG_EEPROM_PAGE_ACCESS == 1)
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
if (prGlueInfo->prAdapter == NULL)
return 0;
if (prGlueInfo->prAdapter &&
prGlueInfo->prAdapter->chip_info &&
!prGlueInfo->prAdapter->chip_info->is_support_efuse) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"efuse ops is invalid\n");
return (int32_t)u4Offset;
}
kalMemSet(&rAccessEfuseInfo, 0,
sizeof(struct PARAM_CUSTOM_ACCESS_EFUSE));
rAccessEfuseInfo.u4Address = (u4Efuse_addr / EFUSE_BLOCK_SIZE)
* EFUSE_BLOCK_SIZE;
u4Index = u4Efuse_addr % EFUSE_BLOCK_SIZE;
if (ucOpMode == EFUSE_READ) {
rStatus = kalIoctl(prGlueInfo,
wlanoidQueryProcessAccessEfuseRead,
&rAccessEfuseInfo,
sizeof(struct PARAM_CUSTOM_ACCESS_EFUSE),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus == WLAN_STATUS_SUCCESS) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Read success 0x%X = 0x%X\n", u4Efuse_addr,
prGlueInfo->prAdapter->aucEepromVaule[u4Index]);
}
} else if (ucOpMode == EFUSE_WRITE) {
prGlueInfo->prAdapter->aucEepromVaule[u4Index] = ucEfuse_value;
kalMemCopy(rAccessEfuseInfo.aucData,
prGlueInfo->prAdapter->aucEepromVaule, 16);
rStatus = kalIoctl(prGlueInfo,
wlanoidQueryProcessAccessEfuseWrite,
&rAccessEfuseInfo,
sizeof(struct PARAM_CUSTOM_ACCESS_EFUSE),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus == WLAN_STATUS_SUCCESS) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Write success 0x%X = 0x%X\n",
u4Efuse_addr, ucEfuse_value);
}
} else if (ucOpMode == EFUSE_FREE) {
struct PARAM_CUSTOM_EFUSE_FREE_BLOCK rEfuseFreeBlock = {};
if (prGlueInfo->prAdapter->fgIsSupportGetFreeEfuseBlockCount
== FALSE) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Cannot read free block size\n");
return (int32_t)u4Offset;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryEfuseFreeBlock,
&rEfuseFreeBlock,
sizeof(struct PARAM_CUSTOM_EFUSE_FREE_BLOCK),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus == WLAN_STATUS_SUCCESS) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Free block size 0x%X\n",
prGlueInfo->prAdapter->u4FreeBlockNum);
}
}
#else
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"efuse ops is invalid\n");
#endif
return (int32_t)u4Offset;
efuse_op_invalid:
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"\nHelp menu\n");
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"\tRead:\t\"efuse read addr_hex\"\n");
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"\tWrite:\t\"efuse write addr_hex val_hex\"\n");
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"\tFree Blocks:\t\"efuse free\"\n");
return (int32_t)u4Offset;
}
#if defined(_HIF_SDIO) && (MTK_WCN_HIF_SDIO == 0)
static int priv_driver_cccr_ops(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
enum CCCR_OP_MODE {
CCCR_READ,
CCCR_WRITE,
CCCR_FREE,
CCCR_INVALID,
};
uint8_t ucOpMode = CCCR_INVALID;
uint8_t ucOpChar;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret;
int32_t i4Parameter;
uint32_t u4CCCR_addr = 0;
uint8_t ucCCCR_value = 0;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4Offset = 0;
struct GLUE_INFO *prGlueInfo = NULL;
struct sdio_func *func;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
if (!IS_SDIO_INF(prGlueInfo)) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Not SDIO bus(%d)\n",
prGlueInfo->u4InfType);
return (int32_t)u4Offset;
}
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
/* Sanity check */
if (i4Argc < 2)
goto cccr_op_invalid;
ucOpChar = (uint8_t)apcArgv[1][0];
if ((i4Argc == 3) && (ucOpChar == 'r' || ucOpChar == 'R'))
ucOpMode = CCCR_READ;
else if ((i4Argc == 4) && (ucOpChar == 'w' || ucOpChar == 'W'))
ucOpMode = CCCR_WRITE;
/* Print out help if input format is wrong */
if (ucOpMode == CCCR_INVALID)
goto cccr_op_invalid;
/* convert address */
if (ucOpMode == CCCR_READ || ucOpMode == CCCR_WRITE) {
i4Ret = kalkStrtos32(apcArgv[2], 16, &i4Parameter);
/* Valid address 0x0~0xFF */
u4CCCR_addr = (uint32_t)(i4Parameter & 0xFF);
}
/* convert value */
if (ucOpMode == CCCR_WRITE) {
i4Ret = kalkStrtos32(apcArgv[3], 16, &i4Parameter);
ucCCCR_value = (uint8_t)i4Parameter;
}
/* Set SDIO host reference */
func = prGlueInfo->rHifInfo.func;
/* Start operation */
if (ucOpMode == CCCR_READ) {
sdio_claim_host(func);
ucCCCR_value = sdio_f0_readb(func, u4CCCR_addr, &rStatus);
sdio_release_host(func);
if (rStatus) /* Fail case */
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Read Fail 0x%X (ret=%d)\n",
u4CCCR_addr, rStatus);
else
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Read success 0x%X = 0x%X\n",
u4CCCR_addr, ucCCCR_value);
} else if (ucOpMode == CCCR_WRITE) {
uint32_t quirks_bak;
sdio_claim_host(func);
/* Enable capability to write CCCR */
quirks_bak = func->card->quirks;
func->card->quirks |= MMC_QUIRK_LENIENT_FN0;
/* Write CCCR into card */
sdio_f0_writeb(func, ucCCCR_value, u4CCCR_addr, &rStatus);
func->card->quirks = quirks_bak;
sdio_release_host(func);
if (rStatus) /* Fail case */
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Write Fail 0x%X (ret=%d)\n",
u4CCCR_addr, rStatus);
else
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"Write success 0x%X = 0x%X\n",
u4CCCR_addr, ucCCCR_value);
}
return (int32_t)u4Offset;
cccr_op_invalid:
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"\nHelp menu\n");
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"\tRead:\t\"cccr read addr_hex\"\n");
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"\tWrite:\t\"cccr write addr_hex val_hex\"\n");
return (int32_t)u4Offset;
}
#endif /* _HIF_SDIO && (MTK_WCN_HIF_SDIO == 0) */
#if CFG_SUPPORT_ADVANCE_CONTROL
static int priv_driver_set_noise(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID + 1;
uint32_t u4Sel = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR: SET_NOISE <Sel>\n", i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Sel);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n", u4Ret);
rSwCtrlInfo.u4Data = u4Sel << 30;
DBGLOG(REQ, LOUD, "u4Sel=%d u4Data=0x%x,\n", u4Sel, rSwCtrlInfo.u4Data);
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite, &rSwCtrlInfo,
sizeof(rSwCtrlInfo), FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_noise(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_NOISE_ID;
uint32_t u4Offset = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
int16_t u2Wf0AvgPwr, u2Wf1AvgPwr;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo, wlanoidQuerySwCtrlRead, &rSwCtrlInfo,
sizeof(rSwCtrlInfo), TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
u2Wf0AvgPwr = rSwCtrlInfo.u4Data & 0xFFFF;
u2Wf1AvgPwr = (rSwCtrlInfo.u4Data >> 16) & 0xFFFF;
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"Noise Idle Avg. Power: WF0:%ddB WF1:%ddB\n",
u2Wf0AvgPwr, u2Wf1AvgPwr);
i4BytesWritten = (int32_t)u4Offset;
return i4BytesWritten;
} /* priv_driver_get_sw_ctrl */
static int priv_driver_set_pop(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID + CMD_ADVCTL_POP_ID;
uint32_t u4Sel = 0, u4CckTh = 0, u4OfdmTh = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 3) {
DBGLOG(REQ, ERROR,
"Argc(%d) ERR: SET_POP <Sel> <CCK TH> <OFDM TH>\n",
i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Sel);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n", u4Ret);
u4Ret = kalkStrtou32(apcArgv[2], 0, &u4CckTh);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n", u4Ret);
u4Ret = kalkStrtou32(apcArgv[3], 0, &u4OfdmTh);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n", u4Ret);
rSwCtrlInfo.u4Data = (u4CckTh | (u4OfdmTh<<8) | (u4Sel<<30));
DBGLOG(REQ, LOUD, "u4Sel=%d u4CckTh=%d u4OfdmTh=%d, u4Data=0x%x,\n",
u4Sel, u4CckTh, u4OfdmTh, rSwCtrlInfo.u4Data);
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite, &rSwCtrlInfo,
sizeof(rSwCtrlInfo), FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_traffic_report(IN struct net_device
*prNetDev, IN char *pcCommand, IN int i4TotalLen)
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct CMD_GET_TRAFFIC_REPORT *cmd = NULL;
uint8_t ucBand = ENUM_BAND_0;
uint16_t u2Val = 0;
uint8_t ucVal = 0;
int32_t u4Ret = 0;
u_int8_t fgWaitResp = FALSE;
u_int8_t fgRead = FALSE;
u_int8_t fgGetDbg = FALSE;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prGlueInfo)
goto get_report_invalid;
cmd = (struct CMD_GET_TRAFFIC_REPORT *)
kalMemAlloc(sizeof(*cmd), VIR_MEM_TYPE);
if (!cmd)
goto get_report_invalid;
if ((i4Argc > 4) || (i4Argc < 2))
goto get_report_invalid;
memset(cmd, 0, sizeof(*cmd));
cmd->u2Type = CMD_GET_REPORT_TYPE;
cmd->u2Len = sizeof(*cmd);
cmd->ucBand = ucBand;
if (strnicmp(apcArgv[1], "ENABLE", strlen("ENABLE")) == 0) {
prGlueInfo->prAdapter->u4IsKeepFullPwrBitmap
|= KEEP_FULL_PWR_TRAFFIC_REPORT_BIT;
cmd->ucAction = CMD_GET_REPORT_ENABLE;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
} else if (strnicmp(apcArgv[1], "DISABLE", strlen("DISABLE")) == 0) {
prGlueInfo->prAdapter->u4IsKeepFullPwrBitmap
&= ~KEEP_FULL_PWR_TRAFFIC_REPORT_BIT;
cmd->ucAction = CMD_GET_REPORT_DISABLE;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
} else if (strnicmp(apcArgv[1], "RESET", strlen("RESET")) == 0) {
cmd->ucAction = CMD_GET_REPORT_RESET;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
} else if ((strnicmp(apcArgv[1], "GET", strlen("GET")) == 0) ||
(strnicmp(apcArgv[1], "GETDBG", strlen("GETDBG")) == 0)) {
cmd->ucAction = CMD_GET_REPORT_GET;
fgWaitResp = TRUE;
fgRead = TRUE;
if ((i4Argc == 4) && (strnicmp(apcArgv[2],
"BAND", strlen("BAND")) == 0)) {
u4Ret = kalkStrtou8(apcArgv[3], 0, &ucVal);
cmd->ucBand = ucVal;
}
if (strnicmp(apcArgv[1], "GETDBG", strlen("GETDBG")) == 0)
fgGetDbg = TRUE;
} else if ((strnicmp(apcArgv[1], "SAMPLEPOINTS",
strlen("SAMPLEPOINTS")) == 0) && (i4Argc == 3)) {
u4Ret = kalkStrtou16(apcArgv[2], 0, &u2Val);
cmd->u2SamplePoints = u2Val;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
cmd->ucAction = CMD_SET_REPORT_SAMPLE_POINT;
} else if ((strnicmp(apcArgv[1], "TXTHRES",
strlen("TXTHRES")) == 0) && (i4Argc == 3)) {
u4Ret = kalkStrtou8(apcArgv[2], 0, &ucVal);
/* valid val range is from 0 - 100% */
if (ucVal > 100)
ucVal = 100;
cmd->ucTxThres = ucVal;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
cmd->ucAction = CMD_SET_REPORT_TXTHRES;
} else if ((strnicmp(apcArgv[1], "RXTHRES",
strlen("RXTHRES")) == 0) && (i4Argc == 3)) {
u4Ret = kalkStrtou8(apcArgv[2], 0, &ucVal);
/* valid val range is from 0 - 100% */
if (ucVal > 100)
ucVal = 100;
cmd->ucRxThres = ucVal;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
cmd->ucAction = CMD_SET_REPORT_RXTHRES;
} else
goto get_report_invalid;
DBGLOG(REQ, LOUD, "%s(%s) action %x band %x wait_resp %x\n"
, __func__, pcCommand, cmd->ucAction, ucBand, fgWaitResp);
rStatus = kalIoctl(prGlueInfo, wlanoidAdvCtrl, cmd,
sizeof(*cmd), TRUE, TRUE, TRUE, &u4BufLen);
if ((rStatus != WLAN_STATUS_SUCCESS)
&& (rStatus != WLAN_STATUS_PENDING))
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\ncommand failed %x", rStatus);
else if (cmd->ucAction == CMD_GET_REPORT_GET) {
int persentage = 0;
int sample_dur = cmd->u4FetchEd - cmd->u4FetchSt;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCCK false detect cnt: %d"
, (cmd->u4FalseCCA >> EVENT_REPORT_CCK_FCCA)
& EVENT_REPORT_CCK_FCCA_FEILD);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nOFDM false detect cnt: %d"
, (cmd->u4FalseCCA >> EVENT_REPORT_OFDM_FCCA)
& EVENT_REPORT_OFDM_FCCA_FEILD);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCCK Sig CRC cnt: %d"
, (cmd->u4HdrCRC >> EVENT_REPORT_CCK_SIGERR)
& EVENT_REPORT_CCK_SIGERR_FEILD);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nOFDM Sig CRC cnt: %d"
, (cmd->u4HdrCRC >> EVENT_REPORT_OFDM_SIGERR)
& EVENT_REPORT_OFDM_SIGERR_FEILD);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nBand%d Info:", cmd->ucBand);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tSample every %u ms with %u points",
cmd->u4TimerDur, cmd->u2SamplePoints);
if (fgGetDbg) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"from systime%u-%u total_dur %u us f_cost %u us t_drift %d ms"
, cmd->u4FetchSt, cmd->u4FetchEd
, sample_dur
, cmd->u4FetchCost, cmd->TimerDrift);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tbusy-RMAC %u us, idle-TMAC %u us, t_total %u"
, cmd->u4ChBusy, cmd->u4ChIdle,
cmd->u4ChBusy + cmd->u4ChIdle);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\theavy tx threshold %u%% rx threshold %u%%"
, cmd->ucTxThres, cmd->ucRxThres);
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tch_busy %u us, ch_idle %u us, total_period %u us"
, sample_dur - cmd->u4ChIdle
, cmd->u4ChIdle, sample_dur);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tmy_tx_time: %u us"
, cmd->u4TxAirTime);
if (cmd->u4FetchEd - cmd->u4FetchSt) {
persentage = cmd->u4TxAirTime / (sample_dur / 1000);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
", tx utility: %d.%1d%%"
, persentage / 10
, persentage % 10);
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tmy_data_rx_time (no BMC data): %u us"
, cmd->u4RxAirTime);
if (cmd->u4FetchEd - cmd->u4FetchSt) {
persentage = cmd->u4RxAirTime / (sample_dur / 1000);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
", rx utility: %d.%1d%%"
, persentage / 10
, persentage % 10);
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tTotal packet transmitted: %u",
cmd->u4PktSent);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tTotal tx ok packet: %u",
cmd->u4PktSent - cmd->u4PktTxfailed);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tTotal tx failed packet: %u",
cmd->u4PktTxfailed);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tTotal tx retried packet: %u",
cmd->u4PktRetried);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tTotal rx mpdu: %u", cmd->u4RxMPDU);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n\tTotal rx fcs: %u", cmd->u4RxFcs);
} else
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\ncommand sent %x", rStatus);
if (cmd)
kalMemFree(cmd, VIR_MEM_TYPE, sizeof(*cmd));
return i4BytesWritten;
get_report_invalid:
if (cmd)
kalMemFree(cmd, VIR_MEM_TYPE, sizeof(*cmd));
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:get_report [enable|disable|get|reset]");
return i4BytesWritten;
}
static int priv_driver_get_pop(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_POP_ID;
uint32_t u4Offset = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
int32_t u4CckTh = 0, u4OfdmTh = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
u4CckTh = rSwCtrlInfo.u4Data & 0xFF;
u4OfdmTh = (rSwCtrlInfo.u4Data >> 8) & 0xFF;
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"PoP: CckTh:%ddB OfdmTh:%ddB\n",
u4CckTh, u4OfdmTh);
i4BytesWritten = (int32_t)u4Offset;
return i4BytesWritten;
}
static int priv_driver_set_ed(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
uint32_t u4Status = WLAN_STATUS_SUCCESS;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t i4Ret = 0;
int32_t i4EdVal[2] = { 0 };
uint32_t u4Sel = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return WLAN_STATUS_FAILURE;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
if (prAdapter == NULL) {
DBGLOG(REQ, LOUD, "Adapter is NULL!\n");
return WLAN_STATUS_FAILURE;
}
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc <= 3) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR! Parameters for SET_ED:\n",
i4Argc);
DBGLOG(REQ, ERROR,
"<Sel> <2.4G ED(-49~-81dBm)> <5G ED(-49~-81dBm)>\n");
return WLAN_STATUS_FAILURE;
}
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Sel);
if (i4Ret)
DBGLOG(REQ, ERROR, "parse error i4Ret=%d\n", i4Ret);
i4Ret = kalkStrtos32(apcArgv[2], 0, &i4EdVal[0]);
if (i4Ret)
DBGLOG(REQ, ERROR,
"parse i4EdVal(2.4G) error i4Ret=%d\n", i4Ret);
i4Ret = kalkStrtos32(apcArgv[3], 0, &i4EdVal[1]);
if (i4Ret)
DBGLOG(REQ, ERROR,
"parse i4EdVal(5G) error u4Ret=%d\n", i4Ret);
u4Status = wlanSetEd(prAdapter, i4EdVal[0], i4EdVal[1], u4Sel);
if (u4Status != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", u4Status);
return WLAN_STATUS_FAILURE;
}
return i4BytesWritten;
}
static int priv_driver_get_ed(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Status = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_ED_ID;
uint32_t u4Offset = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
int8_t iEdVal[2] = { 0 };
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return WLAN_STATUS_FAILURE;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
u4Status = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "Status %u\n", u4Status);
if (u4Status != WLAN_STATUS_SUCCESS)
return WLAN_STATUS_FAILURE;
iEdVal[0] = rSwCtrlInfo.u4Data & 0xFF;
iEdVal[1] = (rSwCtrlInfo.u4Data >> 16) & 0xFF;
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"ED: 2.4G(%ddB), 5G(%ddB)\n", iEdVal[0], iEdVal[1]);
i4BytesWritten = (int32_t)u4Offset;
return i4BytesWritten;
}
static int priv_driver_get_tp_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
return kalPerMonGetInfo(prGlueInfo->prAdapter, pcCommand, i4TotalLen);
}
static int priv_driver_set_pd(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID + CMD_ADVCTL_PD_ID;
uint32_t u4Sel = 0;
int32_t u4CckTh = 0, u4OfdmTh = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR,
"Argc(%d) ERR: SET_PD <Sel> [CCK TH] [OFDM TH]\n",
i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Sel);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n", u4Ret);
if (u4Sel == 1) {
if (i4Argc <= 3) {
DBGLOG(REQ, ERROR,
"Argc(%d) ERR: SET_PD 1 <CCK TH> <OFDM CH>\n",
i4Argc);
return -1;
}
u4Ret = kalkStrtos32(apcArgv[2], 0, &u4CckTh);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n",
u4Ret);
u4Ret = kalkStrtos32(apcArgv[3], 0, &u4OfdmTh);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n",
u4Ret);
}
rSwCtrlInfo.u4Data = ((u4OfdmTh & 0xFFFF) | ((u4CckTh & 0xFF) << 16) |
(u4Sel << 30));
DBGLOG(REQ, LOUD, "u4Sel=%d u4OfdmTh=%d, u4CckTh=%d, u4Data=0x%x,\n",
u4Sel, u4OfdmTh, u4CckTh, rSwCtrlInfo.u4Data);
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite, &rSwCtrlInfo,
sizeof(rSwCtrlInfo), FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_pd(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_PD_ID;
uint32_t u4Offset = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
int8_t u4CckTh = 0, u4OfdmTh = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
u4CckTh = rSwCtrlInfo.u4Data & 0xFF;
u4OfdmTh = (rSwCtrlInfo.u4Data >> 8) & 0xFF;
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"PD: CckTh:%ddB OfdmTh:%ddB\n", u4CckTh, u4OfdmTh);
i4BytesWritten = (int32_t)u4Offset;
return i4BytesWritten;
}
static int priv_driver_set_maxrfgain(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID + CMD_ADVCTL_MAX_RFGAIN_ID;
uint32_t u4Sel = 0;
int32_t u4Wf0Gain = 0, u4Wf1Gain = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR,
"Argc(%d) ERR: SET_RFGAIN <Sel> <WF0 Gain> <WF1 Gain>\n",
i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Sel);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n", u4Ret);
if (u4Sel == 1) {
if (i4Argc <= 3) {
DBGLOG(REQ, ERROR,
"Argc(%d) ERR: SET_RFGAIN 1 <WF0 Gain> <WF1 Gain>\n",
i4Argc);
return -1;
}
u4Ret = kalkStrtos32(apcArgv[2], 0, &u4Wf0Gain);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n",
u4Ret);
u4Ret = kalkStrtos32(apcArgv[3], 0, &u4Wf1Gain);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n",
u4Ret);
}
rSwCtrlInfo.u4Data = ((u4Wf0Gain & 0xFF) | ((u4Wf1Gain & 0xFF) << 8) |
(u4Sel << 31));
DBGLOG(REQ, LOUD, "u4Sel=%d u4Wf0Gain=%d, u4Wf1Gain=%d, u4Data=0x%x,\n",
u4Sel, u4Wf0Gain, u4Wf1Gain, rSwCtrlInfo.u4Data);
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite, &rSwCtrlInfo,
sizeof(rSwCtrlInfo), FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_maxrfgain(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_MAX_RFGAIN_ID;
uint32_t u4Offset = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint8_t u4Wf0Gain = 0, u4Wf1Gain = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
u4Wf0Gain = rSwCtrlInfo.u4Data & 0xFF;
u4Wf1Gain = (rSwCtrlInfo.u4Data >> 8) & 0xFF;
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"Max RFGain: WF0:%ddB WF1:%ddB\n",
u4Wf0Gain, u4Wf1Gain);
i4BytesWritten = (int32_t)u4Offset;
return i4BytesWritten;
}
static int priv_driver_noise_histogram(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
uint32_t u4Status = WLAN_STATUS_SUCCESS;
struct GLUE_INFO *prGlueInfo;
int32_t i4BytesWritten = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
struct CMD_NOISE_HISTOGRAM_REPORT *cmd = NULL;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prGlueInfo)
goto noise_histogram_invalid;
cmd = (struct CMD_NOISE_HISTOGRAM_REPORT *)kalMemAlloc(sizeof(*cmd),
VIR_MEM_TYPE);
if (!cmd)
goto noise_histogram_invalid;
if ((i4Argc > 4) || (i4Argc < 2))
goto noise_histogram_invalid;
memset(cmd, 0, sizeof(*cmd));
cmd->u2Type = CMD_NOISE_HISTOGRAM_TYPE;
cmd->u2Len = sizeof(*cmd);
if (strnicmp(apcArgv[1], "ENABLE", strlen("ENABLE")) == 0) {
prGlueInfo->prAdapter->u4IsKeepFullPwrBitmap |=
KEEP_FULL_PWR_NOISE_HISTOGRAM_BIT;
cmd->ucAction = CMD_NOISE_HISTOGRAM_ENABLE;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
} else if (strnicmp(apcArgv[1], "DISABLE", strlen("DISABLE")) == 0) {
prGlueInfo->prAdapter->u4IsKeepFullPwrBitmap &=
~KEEP_FULL_PWR_NOISE_HISTOGRAM_BIT;
cmd->ucAction = CMD_NOISE_HISTOGRAM_DISABLE;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
} else if (strnicmp(apcArgv[1], "RESET", strlen("RESET")) == 0) {
cmd->ucAction = CMD_NOISE_HISTOGRAM_RESET;
cmd->u2Type |= CMD_ADV_CONTROL_SET;
#if CFG_IPI_2CHAIN_SUPPORT
} else if (strnicmp(apcArgv[1], "GET2", strlen("GET2")) == 0) {
/*
* For getting backward compatibility
* to original format for default chain
*/
cmd->u2Type = CMD_NOISE_HISTOGRAM_TYPE2;
cmd->ucAction = CMD_NOISE_HISTOGRAM_GET;
u4Status = kalIoctl(prGlueInfo, wlanoidAdvCtrl,
cmd, sizeof(*cmd), TRUE, TRUE, TRUE, &u4BufLen);
if (u4Status == WLAN_STATUS_SUCCESS)
parseNoiseHistogramReport(&i4BytesWritten,
pcCommand, &i4TotalLen, cmd);
cmd->ucAction = CMD_NOISE_HISTOGRAM_GET2;
#endif /* CFG_IPI_2CHAIN_SUPPORT */
} else if (strnicmp(apcArgv[1], "GET", strlen("GET")) == 0) {
cmd->ucAction = CMD_NOISE_HISTOGRAM_GET;
} else
goto noise_histogram_invalid;
DBGLOG(REQ, LOUD, "%s(%s) action %x\n"
, __func__, pcCommand, cmd->ucAction);
u4Status = kalIoctl(prGlueInfo, wlanoidAdvCtrl, cmd, sizeof(*cmd),
TRUE, TRUE, TRUE, &u4BufLen);
if (u4Status == WLAN_STATUS_NOT_SUPPORTED) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nThis fw version does not support priv command: %s\n",
pcCommand);
} else if ((u4Status != WLAN_STATUS_SUCCESS)
&& (u4Status != WLAN_STATUS_PENDING)) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\ncommand failed %x", u4Status);
} else if (cmd->ucAction == CMD_NOISE_HISTOGRAM_GET
#if CFG_IPI_2CHAIN_SUPPORT
|| cmd->ucAction == CMD_NOISE_HISTOGRAM_GET2
#endif /* CFG_IPI_2CHAIN_SUPPORT */
) {
parseNoiseHistogramReport(&i4BytesWritten,
pcCommand, &i4TotalLen, cmd);
} else
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\ncommand sent %x", u4Status);
if (cmd)
kalMemFree(cmd, VIR_MEM_TYPE, sizeof(*cmd));
return i4BytesWritten;
noise_histogram_invalid:
if (cmd)
kalMemFree(cmd, VIR_MEM_TYPE, sizeof(*cmd));
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:get_report [enable|disable|get|reset]");
return i4BytesWritten;
}
#if CFG_RX_SINGLE_CHAIN_SUPPORT
static int priv_driver_set_rxchain(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID + CMD_ADVCTL_RXC_ID;
uint32_t u4Sel = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint32_t u4Offset = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 1) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"SET RX CHAIN:Fail!(%d) SET_RXC<Sel:0/1/2>\n", i4Argc);
goto out;
}
/* not connected */
/* if (prGlueInfo->eParamMediaStateIndicated !=
* PARAM_MEDIA_STATE_CONNECTED) {
* u4Offset += snprintf(pcCommand + u4Offset,
* i4TotalLen - u4Offset,
* "SET RX CHAIN: Fail! not connected\n");
* goto out;
* }
*/
/* if (prAdapter->rWifiVar.ucNSS > 1 ||
* prAdapter->rWifiVar.ucSpeIdxCtrl == 2) {
* u4Offset += snprintf(pcCommand + u4Offset,
* i4TotalLen - u4Offset,
* "SET RX CHAIN: Fail!NSS =%d &
* SpeIdxCtrl =%d wrong setting\n",
* prAdapter->rWifiVar.ucNSS,
* prAdapter->rWifiVar.ucSpeIdxCtrl);
* goto out;
* }
*/
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Sel);
if (u4Ret) {
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error u4Ret=%d\n", u4Ret);
return -1;
}
if ((u4Sel < 0 || u4Sel > 2) && (u4Sel != 5)) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"SET RX CHAIN:Fail!(%d) not equal 0/1/2/5\n", u4Sel);
goto out;
}
/* else if (u4Sel != prAdapter->rWifiVar.ucSpeIdxCtrl) {
* u4Offset += snprintf(pcCommand + u4Offset,
* i4TotalLen - u4Offset,
* "SET RX CHAIN:Fail!(%d)
* not equal to SpeIdxCtrl(%d)\n",
* u4Sel, prAdapter->rWifiVar.ucSpeIdxCtrl);
* goto out;
* }
*/
rSwCtrlInfo.u4Data = u4Sel;
rStatus = kalIoctl(prGlueInfo,
wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"SET RX CHAIN: kalIoctl fail (%d)\n", rStatus);
goto out;
} else {
u4Offset += snprintf(pcCommand + u4Offset,
i4TotalLen - u4Offset,
"SET RX CHAIN: %d (0: WF0 1:WF1 2:WF0+1 5:Disable)Success\n"
, u4Sel);
}
out:
i4BytesWritten = (int32_t)u4Offset;
return i4BytesWritten;
}
static int priv_driver_get_rxchain(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_RXC_ID;
uint32_t u4Offset = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint8_t ucRxChain;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
/*not connected*/
/*if (prGlueInfo->eParamMediaStateIndicated !=
* PARAM_MEDIA_STATE_CONNECTED) {
* u4Offset += snprintf(pcCommand + u4Offset,
* i4TotalLen - u4Offset,
* "GET RX CHAIN: Fail! not yet connected\n");
* goto out;
* }
*/
/*if (prAdapter->rWifiVar.ucNSS > 1 ||
* prAdapter->rWifiVar.ucSpeIdxCtrl == 2) {
* u4Offset += snprintf(pcCommand + u4Offset,
* i4TotalLen - u4Offset,
* "GET RX CHAIN: Fail! NSS=%d (Need <2)
* SpeIdxCtrl=%d (Need <2) \n",
* prAdapter->rWifiVar.ucNSS,
* prAdapter->rWifiVar.ucSpeIdxCtrl);
* goto out;
* }
*/
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
ucRxChain = (rSwCtrlInfo.u4Data) & 0xFF;
u4Offset += snprintf(pcCommand + u4Offset, i4TotalLen - u4Offset,
"GET RX CHAIN: %d (0: WF0 1:WF1 2:WF0+WF1)\n",
ucRxChain);
/*out:*/
i4BytesWritten = (int32_t)u4Offset;
return i4BytesWritten;
}
#endif
static int priv_driver_set_adm_ctrl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID + CMD_ADVCTL_ADM_CTRL_ID;
uint32_t u4Enable = 0, u4TimeRatio = 100, u4AdmBase = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
rSwCtrlInfo.u4Id = u4Id;
if ((i4Argc > 4) || (i4Argc < 2)) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR: set_adm_ctrl\n", i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Enable);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse u4Enable error u4Ret=%d\n", u4Ret);
if (i4Argc > 2) {
/* u4AdmTime default is 100% */
u4Ret = kalkStrtos32(apcArgv[2], 0, &u4TimeRatio);
if (u4Ret)
DBGLOG(REQ, ERROR, "u4AdmTime err u4Ret=%d\n", u4Ret);
}
if (i4Argc > 3) {
u4Ret = kalkStrtos32(apcArgv[3], 0, &u4AdmBase);
if (u4Ret)
DBGLOG(REQ, ERROR, "u4AdmBase err u4Ret=%d\n", u4Ret);
}
rSwCtrlInfo.u4Data = ((u4AdmBase & 0xFFFF) |
((u4TimeRatio & 0xFF) << 16) |
((u4Enable & 0xFF) << 24));
DBGLOG(REQ, LOUD,
"u4Enable=%d u4AdmTime=%d, u4AdmBase=%d, u4Data=0x%x,\n",
u4Enable, u4TimeRatio, u4AdmBase, rSwCtrlInfo.u4Data);
rStatus = kalIoctl(prGlueInfo, wlanoidSetSwCtrlWrite, &rSwCtrlInfo,
sizeof(rSwCtrlInfo), FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_adm_ctrl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_ADM_CTRL_ID;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint32_t u4Enable = 0, u4TimeRatio = 100, u4AdmBase = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
u4Enable = (rSwCtrlInfo.u4Data >> 24) & 0xFF;
u4TimeRatio = (rSwCtrlInfo.u4Data >> 16) & 0xFF;
u4AdmBase = rSwCtrlInfo.u4Data & 0xFFFF;
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tAdminCtrl: %s",
(u4Enable) ?
"Enabled" : "Disabled\n");
if (u4Enable == 1)
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nLimited %% from thermal: %u%%\n",
u4TimeRatio);
return i4BytesWritten;
}
#if CFG_ENABLE_1RPD_MMPS_CTRL
static int priv_driver_set_1rpd(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Status = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID +
CMD_ADVCTL_1RPD;
uint32_t u4Enable = FALSE;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR: SET_1RPD <Sel>\n", i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Enable);
if (u4Ret) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommand failed, invalid parameter");
return i4BytesWritten;
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nSet 1RPD %d", u4Enable);
rSwCtrlInfo.u4Data = u4Enable;
u4Status = kalIoctl(prGlueInfo,
wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, g_fgIsOid, &u4BufLen);
if (u4Status != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", u4Status);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_1rpd(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID +
CMD_ADVCTL_1RPD;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint32_t u4Sel = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo), TRUE,
TRUE, g_fgIsOid, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
u4Sel = rSwCtrlInfo.u4Data & 0xFF;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n1RPD status: %d", u4Sel);
return i4BytesWritten;
}
static int priv_driver_set_mmps(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID +
CMD_ADVCTL_MMPS;
uint32_t u4Enable = FALSE;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR: SET_NOISE <Sel>\n", i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Enable);
if (u4Ret) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommand failed, invalid parameter");
return i4BytesWritten;
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nSet MMPS %d", u4Enable);
rSwCtrlInfo.u4Data = u4Enable;
rStatus = kalIoctl(prGlueInfo,
wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, g_fgIsOid, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_mmps(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID +
CMD_ADVCTL_MMPS;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint32_t u4Sel = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo), TRUE,
TRUE, g_fgIsOid, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
u4Sel = rSwCtrlInfo.u4Data & 0xFF;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nMMPS status: %d", u4Sel);
return i4BytesWritten;
}
#endif
#if CFG_ENABLE_DEWEIGHTING_CTRL
static int priv_driver_set_deweighting_th(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID +
CMD_ADVCTL_DEWEIGHTING_TH_ID;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint32_t u4Sel = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR: SET_NOISE <Sel>\n", i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Sel);
if (u4Ret) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommand failed, threshold range is 0 to 15");
return i4BytesWritten;
}
if ((u4Sel < 0) || (u4Sel > 15)) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommand failed, threshold range is 0 to 15");
return i4BytesWritten;
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nSetting noise difference threshold %d", u4Sel);
rSwCtrlInfo.u4Data = u4Sel << 16;
rStatus = kalIoctl(prGlueInfo,
wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_get_deweighting_th(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID +
CMD_ADVCTL_DEWEIGHTING_TH_ID;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint32_t u4Sel = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo), TRUE,
TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
u4Sel = rSwCtrlInfo.u4Data & 0xFF;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nNoise difference threshold is %d", u4Sel);
return i4BytesWritten;
}
static int priv_driver_get_deweighting_noise(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID +
CMD_ADVCTL_DEWEIGHTING_NOISE_ID;
uint8_t u2Wf0AvgNoise = 0, u2Wf1AvgNoise = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
u2Wf1AvgNoise = rSwCtrlInfo.u4Data & 0xFF;
u2Wf0AvgNoise = (rSwCtrlInfo.u4Data >> 16) & 0xFF;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nDeweighting Average noise, WF0 = %d, WF1 = %d",
u2Wf0AvgNoise, u2Wf1AvgNoise);
return i4BytesWritten;
}
static int priv_driver_get_deweighting_weight(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID +
CMD_ADVCTL_DEWEIGHTING_WEIGHT_ID;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
uint8_t ucWF0OfdmSetpt, ucWF0CckSetpt, ucWF1OfdmSetpt, ucWF1CckSetpt;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
ucWF1CckSetpt = rSwCtrlInfo.u4Data & 0xFF;
ucWF1OfdmSetpt = (rSwCtrlInfo.u4Data >> 8) & 0xFF;
ucWF0CckSetpt = (rSwCtrlInfo.u4Data >> 16) & 0xFF;
ucWF0OfdmSetpt = (rSwCtrlInfo.u4Data >> 24) & 0xFF;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nDeweighting weight, WF0 ofdm=%02X cck=%02X, WF1 ofdm=%02X cck=%02X",
ucWF0OfdmSetpt, ucWF0CckSetpt,
ucWF1OfdmSetpt, ucWF1CckSetpt);
return i4BytesWritten;
}
#endif /* CFG_ENABLE_DEWEIGHTING_CTRL */
static int priv_driver_set_bcn_th(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID + CMD_ADVCTL_BCN_TH_ID;
int32_t i4Ret = 0;
int8_t ucP2P, ucInfra, ucWithbt;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc != 4) {
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:set_bcn_th <p2p> <infra> <withbt>");
return i4BytesWritten;
}
i4Ret = kalkStrtou8(apcArgv[1], 0, &ucP2P);
if (i4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error i4Ret=%d\n", i4Ret);
i4Ret = kalkStrtou8(apcArgv[2], 0, &ucInfra);
if (i4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error i4Ret=%d\n", i4Ret);
i4Ret = kalkStrtou8(apcArgv[3], 0, &ucWithbt);
if (i4Ret)
DBGLOG(REQ, ERROR, "parse rSwCtrlInfo error i4Ret=%d\n", i4Ret);
rSwCtrlInfo.u4Data = (ucP2P | (ucInfra << 8) | (ucWithbt << 16));
rSwCtrlInfo.u4Id = u4Id;
DBGLOG(REQ, LOUD, "ucP2P=%d ucInfra=%d, ucWithbt=%d u4Data=0x%x,\n",
ucP2P, ucInfra, ucWithbt, rSwCtrlInfo.u4Data);
rStatus = kalIoctl(prGlueInfo,
wlanoidSetSwCtrlWrite,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
FALSE, FALSE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
return i4BytesWritten;
}
static int priv_driver_get_bcn_th(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID + CMD_ADVCTL_BCN_TH_ID;
int8_t ucAdhoc, ucInfra, ucWithbt;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc != 1) {
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:get_bcn_th");
return i4BytesWritten;
}
rSwCtrlInfo.u4Data = 0;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
ucAdhoc = rSwCtrlInfo.u4Data & 0xFF;
ucInfra = (rSwCtrlInfo.u4Data >> 8) & 0xFF;
ucWithbt = (rSwCtrlInfo.u4Data >> 16) & 0xFF;
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nBeacon loss threshold: P2P:%d, INFRA:%d, With BT:%d\n",
ucAdhoc, ucInfra, ucWithbt);
return i4BytesWritten;
}
static int priv_driver_get_bcntimeout_cnt(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_GET_ID +
CMD_ADVCTL_BCNTIMOUT_NUM_ID;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (!prGlueInfo->prAdapter->prAisBssInfo)
return -EFAULT;
rSwCtrlInfo.u4Data = prGlueInfo->prAdapter->prAisBssInfo->ucBssIndex;
rSwCtrlInfo.u4Id = u4Id;
rStatus = kalIoctl(prGlueInfo,
wlanoidQuerySwCtrlRead,
&rSwCtrlInfo, sizeof(rSwCtrlInfo),
TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, LOUD, "rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS)
return -1;
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\tbeacon timeout count: %d",
rSwCtrlInfo.u4Data);
return i4BytesWritten;
}
#endif /* CFG_SUPPORT_ADVANCE_CONTROL */
#if CFG_SUPPORT_CSI
static int
priv_driver_set_csi(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
uint32_t i4Argc = 0;
signed char *apcArgv[WLAN_CFG_ARGV_MAX];
struct CMD_CSI_CONTROL_T *prCSICtrl = NULL;
uint32_t u4Ret = 0;
struct CSI_INFO_T *prCSIInfo = NULL;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(RSN, LOUD, "[CSI] command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "[CSI] argc is %i\n", i4Argc);
DBGLOG(RSN, INFO, "[CSI] priv_driver_csi_control\n");
prCSIInfo = &(prGlueInfo->prAdapter->rCSIInfo);
prCSICtrl = (struct CMD_CSI_CONTROL_T *)kalMemAlloc(
sizeof(struct CMD_CSI_CONTROL_T), VIR_MEM_TYPE);
if (!prCSICtrl) {
DBGLOG(REQ, ERROR,
"[CSI] allocate memory for prCSICtrl failed\n");
i4BytesWritten = -1;
goto out;
}
if (i4Argc < 2 || i4Argc > 5) {
DBGLOG(REQ, ERROR, "[CSI] argc %i is invalid\n", i4Argc);
i4BytesWritten = -1;
goto out;
}
u4Ret = kalkStrtou8(apcArgv[1], 0, &(prCSICtrl->ucMode));
if (u4Ret) {
DBGLOG(REQ, LOUD, "[CSI] parse ucMode error u4Ret=%d\n", u4Ret);
goto out;
}
if (prCSICtrl->ucMode >= CSI_CONTROL_MODE_NUM) {
DBGLOG(REQ, LOUD, "[CSI] Invalid ucMode %d, should be 0 or 1\n",
prCSICtrl->ucMode);
goto out;
}
prCSICtrl->ucBandIdx = ENUM_BAND_0;
prCSIInfo->ucMode = prCSICtrl->ucMode;
if (prCSICtrl->ucMode == CSI_CONTROL_MODE_STOP ||
prCSICtrl->ucMode == CSI_CONTROL_MODE_START) {
prCSIInfo->bIncomplete = FALSE;
prCSIInfo->u4CopiedDataSize = 0;
prCSIInfo->u4RemainingDataSize = 0;
prCSIInfo->u4CSIBufferHead = 0;
prCSIInfo->u4CSIBufferTail = 0;
prCSIInfo->u4CSIBufferUsed = 0;
goto send_cmd;
}
u4Ret = kalkStrtou8(apcArgv[2], 0, &(prCSICtrl->ucCfgItem));
if (u4Ret) {
DBGLOG(REQ, LOUD,
"[CSI] parse cfg item error u4Ret=%d\n", u4Ret);
goto out;
}
if (prCSICtrl->ucCfgItem >= CSI_CONFIG_ITEM_NUM) {
DBGLOG(REQ, LOUD, "[CSI] Invalid csi cfg_item %u\n",
prCSICtrl->ucCfgItem);
goto out;
}
u4Ret = kalkStrtou8(apcArgv[3], 0, &(prCSICtrl->ucValue1));
if (u4Ret) {
DBGLOG(REQ, LOUD,
"[CSI] parse csi cfg value1 error u4Ret=%d\n", u4Ret);
goto out;
}
prCSIInfo->ucValue1[prCSICtrl->ucCfgItem] = prCSICtrl->ucValue1;
if (i4Argc == 5) {
u4Ret = kalkStrtou8(apcArgv[4], 0, &(prCSICtrl->ucValue2));
if (u4Ret) {
DBGLOG(REQ, LOUD,
"[CSI] parse csi cfg value2 error u4Ret=%d\n",
u4Ret);
goto out;
}
prCSIInfo->ucValue2[prCSICtrl->ucCfgItem] = prCSICtrl->ucValue2;
}
DBGLOG(REQ, STATE,
"[CSI][DEBUG] Set mode %d, csi cfg item %d, value1 %d, value2 %d",
prCSICtrl->ucMode, prCSICtrl->ucCfgItem,
prCSICtrl->ucValue1, prCSICtrl->ucValue2);
send_cmd:
rStatus = kalIoctl(prGlueInfo, wlanoidSetCSIControl, prCSICtrl,
sizeof(struct CMD_CSI_CONTROL_T), TRUE, TRUE, TRUE, &u4BufLen);
DBGLOG(REQ, INFO, "[CSI] %s: command result is %s\n",
__func__, pcCommand);
DBGLOG(REQ, STATE,
"[CSI] mode %d, csi cfg item %d, value1 %d, value2 %d",
prCSICtrl->ucMode, prCSICtrl->ucCfgItem,
prCSICtrl->ucValue1, prCSICtrl->ucValue2);
DBGLOG(REQ, LOUD, "[CSI] rStatus %u\n", rStatus);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "[CSI] send CSI control cmd failed\n");
i4BytesWritten = -1;
}
out:
if (prCSICtrl)
kalMemFree(prCSICtrl, VIR_MEM_TYPE,
sizeof(struct CMD_CSI_CONTROL_T));
return i4BytesWritten;
}
#endif
#if CFG_SUPPORT_GET_MCS_INFO
static int32_t priv_driver_last_sec_mcs_info(struct ADAPTER *prAdapter,
IN char *pcCommand, IN int i4TotalLen,
struct PARAM_TX_MCS_INFO *prTxMcsInfo)
{
int32_t i4BytesWritten = 0;
uint8_t ucStaIdx = 0, i, j, ucCnt = 0, ucPerSum = 0;
uint16_t u2RateCode;
struct STA_RECORD *prStaRec = NULL;
uint32_t au4RxV0[MCS_INFO_SAMPLE_CNT], au4RxV1[MCS_INFO_SAMPLE_CNT];
uint32_t txmode, rate, frmode, sgi, nsts, ldpc, stbc, groupid, mu, bw;
uint32_t u4RxV0, u4RxV1;
if (prAdapter->prAisBssInfo->prStaRecOfAP != NULL) {
ucStaIdx = prAdapter->prAisBssInfo->prStaRecOfAP->ucIndex;
prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaIdx);
}
if (prStaRec != NULL && prStaRec->fgIsValid && prStaRec->fgIsInUse) {
kalMemCopy(au4RxV0, prStaRec->au4RxV0, sizeof(au4RxV0));
kalMemCopy(au4RxV1, prStaRec->au4RxV1, sizeof(au4RxV1));
} else {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Not Connect to AP\n");
return i4BytesWritten;
}
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\nTx MCS:\n");
for (i = 0; i < MCS_INFO_SAMPLE_CNT; i++) {
if (prTxMcsInfo->au2TxRateCode[i] == 0xFFFF)
continue;
txmode = HW_TX_RATE_TO_MODE(prTxMcsInfo->au2TxRateCode[i]);
if (txmode >= MAX_TX_MODE)
txmode = MAX_TX_MODE;
rate = HW_TX_RATE_TO_MCS(prTxMcsInfo->au2TxRateCode[i], txmode);
nsts = HW_TX_RATE_TO_NSS(prTxMcsInfo->au2TxRateCode[i]) + 1;
stbc = HW_TX_RATE_TO_STBC(prTxMcsInfo->au2TxRateCode[i]);
bw = GET_TX_MCS_BW(prTxMcsInfo->au2TxRateCode[i]);
sgi = GET_TX_MCS_SGI(prTxMcsInfo->au2TxRateCode[i]);
ldpc = GET_TX_MCS_LDPC(prTxMcsInfo->au2TxRateCode[i]);
ucCnt = 0;
ucPerSum = 0;
u2RateCode = prTxMcsInfo->au2TxRateCode[i];
for (j = 0; j < MCS_INFO_SAMPLE_CNT; j++) {
if (u2RateCode == prTxMcsInfo->au2TxRateCode[j]) {
ucPerSum += prTxMcsInfo->aucTxRatePer[j];
ucCnt++;
prTxMcsInfo->au2TxRateCode[j] = 0xFFFF;
}
}
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", HW_TX_RATE_CCK_STR[rate & 0x3]);
else if (txmode == TX_RATE_MODE_OFDM)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", hw_rate_ofdm_str(rate));
else if ((txmode == TX_RATE_MODE_HTMIX) ||
(txmode == TX_RATE_MODE_HTGF))
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"MCS%d, ", rate);
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"NSS%d_MCS%d, ", nsts, rate);
#if 0
if ((txmode == TX_RATE_MODE_CCK) ||
(txmode == TX_RATE_MODE_OFDM))
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", HW_TX_RATE_BW[0]);
else if (i > prHwWlanInfo->rWtblPeerCap.ucChangeBWAfterRateN)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
prHwWlanInfo->rWtblPeerCap.
ucFrequencyCapability < 4 ?
(prHwWlanInfo->rWtblPeerCap.
ucFrequencyCapability > BW_20 ?
HW_TX_RATE_BW[prHwWlanInfo->
rWtblPeerCap
.ucFrequencyCapability - 1] :
HW_TX_RATE_BW[prHwWlanInfo->rWtblPeerCap
.ucFrequencyCapability]) :
HW_TX_RATE_BW[4]);
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ",
prHwWlanInfo->rWtblPeerCap.
ucFrequencyCapability < 4 ?
HW_TX_RATE_BW[
prHwWlanInfo->rWtblPeerCap
.ucFrequencyCapability] :
HW_TX_RATE_BW[4]);
#endif
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", HW_TX_RATE_BW[bw]);
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", rate < 4 ? "LP" : "SP");
else if (txmode == TX_RATE_MODE_OFDM)
;
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, ", sgi == 0 ?
"LGI" : "SGI");
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten, i4TotalLen - i4BytesWritten,
"%s%s%s [PER: %02d%%]\t", txmode < 5 ?
HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[5],
stbc ? ", STBC, " : ", ",
((ldpc == 0) ||
(txmode == TX_RATE_MODE_CCK) ||
(txmode == TX_RATE_MODE_OFDM)) ?
"BCC" : "LDPC", ucPerSum/ucCnt);
for (j = 0; j < ucCnt; j++)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "*");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n");
}
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\nRx MCS:\n");
for (i = 0; i < MCS_INFO_SAMPLE_CNT; i++) {
if (au4RxV0[i] == 0xFFFFFFFF)
continue;
u4RxV0 = au4RxV0[i];
u4RxV1 = au4RxV1[i];
txmode = (u4RxV0 & RX_VT_RX_MODE_MASK) >> RX_VT_RX_MODE_OFFSET;
rate = (u4RxV0 & RX_VT_RX_RATE_MASK) >> RX_VT_RX_RATE_OFFSET;
frmode = (u4RxV0 & RX_VT_FR_MODE_MASK) >> RX_VT_FR_MODE_OFFSET;
nsts = ((u4RxV1 & RX_VT_NSTS_MASK) >> RX_VT_NSTS_OFFSET);
stbc = (u4RxV0 & RX_VT_STBC_MASK) >> RX_VT_STBC_OFFSET;
sgi = u4RxV0 & RX_VT_SHORT_GI;
ldpc = u4RxV0 & RX_VT_LDPC;
groupid = (u4RxV1 & RX_VT_GROUP_ID_MASK)
>> RX_VT_GROUP_ID_OFFSET;
if (groupid && groupid != 63) {
mu = 1;
} else {
mu = 0;
nsts += 1;
}
/* Distribution Calculation clear the same sample content */
ucCnt = 0;
for (j = 0; j < MCS_INFO_SAMPLE_CNT; j++) {
if ((u4RxV0 & RX_MCS_INFO_MASK) ==
(au4RxV0[j] & RX_MCS_INFO_MASK)) {
au4RxV0[j] = 0xFFFFFFFF;
ucCnt++;
}
}
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
rate < 4 ? HW_TX_RATE_CCK_STR[rate] :
HW_TX_RATE_CCK_STR[4]);
else if (txmode == TX_RATE_MODE_OFDM)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
hw_rate_ofdm_str(rate));
else if ((txmode == TX_RATE_MODE_HTMIX) ||
(txmode == TX_RATE_MODE_HTGF))
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "MCS%d, ", rate);
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "NSS%d_MCS%d, ",
nsts, rate);
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
frmode < 4 ? HW_TX_RATE_BW[frmode] : HW_TX_RATE_BW[4]);
if (txmode == TX_RATE_MODE_CCK)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
rate < 4 ? "LP" : "SP");
else if (txmode == TX_RATE_MODE_OFDM)
;
else
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, ",
sgi == 0 ? "LGI" : "SGI");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s",
stbc == 0 ? "" : "STBC, ");
if (mu) {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"%s, %s, %s (%d)\n",
txmode < 5 ?
HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[5],
ldpc == 0 ? "BCC" : "LDPC", "MU", groupid);
} else {
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%s, %s\n",
txmode < 5 ?
HW_TX_MODE_STR[txmode] : HW_TX_MODE_STR[5],
ldpc == 0 ? "BCC" : "LDPC");
}
for (j = 0; j < ucCnt; j++)
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "*");
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n");
}
return i4BytesWritten;
}
static int32_t priv_driver_get_mcs_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0, i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
struct PARAM_TX_MCS_INFO *prTxMcsInfo = NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (prAdapter->rRxMcsInfoTimer.pfMgmtTimeOutFunc == NULL) {
cnmTimerInitTimer(prAdapter,
&prAdapter->rRxMcsInfoTimer,
(PFN_MGMT_TIMEOUT_FUNC) wlanRxMcsInfoMonitor,
(unsigned long) NULL);
}
if (i4Argc >= 2) {
if (strnicmp(apcArgv[1], "START", strlen("START")) == 0) {
cnmTimerStartTimer(prAdapter,
&prAdapter->rRxMcsInfoTimer, MCS_INFO_SAMPLE_PERIOD);
prAdapter->fgIsMcsInfoValid = TRUE;
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nStart the MCS Info Function\n");
return i4BytesWritten;
} else if (strnicmp(apcArgv[1], "STOP", strlen("STOP")) == 0) {
cnmTimerStopTimer(prAdapter,
&prAdapter->rRxMcsInfoTimer);
prAdapter->fgIsMcsInfoValid = FALSE;
i4BytesWritten += kalScnprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nStop the MCS Info Function\n");
return i4BytesWritten;
}
}
if (prGlueInfo->prAdapter->fgIsMcsInfoValid != TRUE) {
i4BytesWritten += kalScnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nWARNING: Use GET_MCS_INFO [START/STOP]\n");
return i4BytesWritten;
}
if (rStatus != WLAN_STATUS_SUCCESS)
goto out;
prTxMcsInfo = (struct PARAM_TX_MCS_INFO *)kalMemAlloc(
sizeof(struct PARAM_TX_MCS_INFO), VIR_MEM_TYPE);
if (!prTxMcsInfo) {
DBGLOG(REQ, ERROR, "Allocate prTxMcsInfo failed!\n");
i4BytesWritten = -1;
goto out;
}
rStatus = kalIoctl(prGlueInfo, wlanoidTxQueryMcsInfo, prTxMcsInfo,
sizeof(struct PARAM_TX_MCS_INFO),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
goto out;
i4BytesWritten = priv_driver_last_sec_mcs_info(prGlueInfo->prAdapter,
pcCommand, i4TotalLen, prTxMcsInfo);
DBGLOG(REQ, INFO, "%s: command result is %s\n", __func__, pcCommand);
out:
if (prTxMcsInfo)
kalMemFree(prTxMcsInfo, VIR_MEM_TYPE,
sizeof(struct PARAM_TX_MCS_INFO));
return i4BytesWritten;
}
#endif /* CFG_SUPPORT_GET_MCS_INFO */
#if CFG_ENABLE_WIFI_DIRECT
static int priv_driver_set_p2p_ps(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t ucRoleIdx;
uint8_t ucBssIdx;
uint32_t u4CTwindowMs;
struct P2P_SPECIFIC_BSS_INFO *prP2pSpecBssInfo = NULL;
struct PARAM_CUSTOM_OPPPS_PARAM_STRUCT *rOppPsParam = NULL;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (i4Argc <= 2) {
DBGLOG(REQ, ERROR,
"Expect param: <role_idx> <CTW>. argc=%d now\n", i4Argc);
return -1;
}
if (kalkStrtou32(apcArgv[1], 0, &ucRoleIdx)) {
DBGLOG(REQ, ERROR, "parse ucRoleIdx error\n");
return -1;
}
if (kalkStrtou32(apcArgv[2], 0, &u4CTwindowMs)) {
DBGLOG(REQ, ERROR, "parse u4CTwindowMs error\n");
return -1;
}
/* get Bss Index from ndev */
if (p2pFuncRoleToBssIdx(prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "can't find ucBssIdx\n");
return -1;
}
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
if (!(prBssInfo->fgIsInUse) || (prBssInfo->eIftype != IFTYPE_P2P_GO)) {
DBGLOG(REQ, ERROR, "wrong bss InUse=%d, iftype=%d\n",
prBssInfo->fgIsInUse, prBssInfo->eIftype);
return -1;
}
DBGLOG(REQ, INFO, "ucRoleIdx=%d, ucBssIdx=%d, u4CTwindowMs=%d\n",
ucRoleIdx, ucBssIdx, u4CTwindowMs);
if (u4CTwindowMs > 0)
u4CTwindowMs |= BIT(7); /* FW checks BIT(7) for enable */
prP2pSpecBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo[ucRoleIdx];
rOppPsParam = &prP2pSpecBssInfo->rOppPsParam;
rOppPsParam->u4CTwindowMs = u4CTwindowMs;
rOppPsParam->ucBssIdx = ucBssIdx;
rStatus = kalIoctl(prGlueInfo, wlanoidSetOppPsParam, rOppPsParam,
sizeof(struct PARAM_CUSTOM_OPPPS_PARAM_STRUCT),
FALSE, FALSE, TRUE, &u4BufLen);
return !(rStatus == WLAN_STATUS_SUCCESS);
}
static int priv_driver_set_p2p_noa(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint8_t ucBssIdx;
uint32_t ucRoleIdx;
uint32_t u4NoaDurationMs;
uint32_t u4NoaIntervalMs;
uint32_t u4NoaCount;
struct P2P_SPECIFIC_BSS_INFO *prP2pSpecBssInfo = NULL;
struct PARAM_CUSTOM_NOA_PARAM_STRUCT *rNoaParam = NULL;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (i4Argc <= 4) {
DBGLOG(REQ, ERROR,
"SET_P2P_NOA <role_idx> <count> <interval> <duration>\n");
return -1;
}
if (kalkStrtou32(apcArgv[1], 0, &ucRoleIdx)) {
DBGLOG(REQ, ERROR, "parse ucRoleIdx error\n");
return -1;
}
if (kalkStrtou32(apcArgv[2], 0, &u4NoaCount)) {
DBGLOG(REQ, ERROR, "parse u4NoaCount error\n");
return -1;
}
if (kalkStrtou32(apcArgv[3], 0, &u4NoaIntervalMs)) {
DBGLOG(REQ, ERROR, "parse u4NoaIntervalMs error\n");
return -1;
}
if (kalkStrtou32(apcArgv[4], 0, &u4NoaDurationMs)) {
DBGLOG(REQ, ERROR, "parse u4NoaDurationMs error\n");
return -1;
}
/* get Bss Index from ndev */
if (p2pFuncRoleToBssIdx(prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "can't find ucBssIdx\n");
return -1;
}
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
if (!(prBssInfo->fgIsInUse) || (prBssInfo->eIftype != IFTYPE_P2P_GO)) {
DBGLOG(REQ, ERROR, "wrong bss InUse=%d, iftype=%d\n",
prBssInfo->fgIsInUse, prBssInfo->eIftype);
return -1;
}
DBGLOG(REQ, INFO,
"RoleIdx=%d, BssIdx=%d, count=%d, interval=%d, duration=%d\n",
ucRoleIdx, ucBssIdx, u4NoaCount, u4NoaIntervalMs,
u4NoaDurationMs);
prP2pSpecBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo[ucRoleIdx];
rNoaParam = &prP2pSpecBssInfo->rNoaParam;
rNoaParam->u4NoaCount = u4NoaCount;
rNoaParam->u4NoaIntervalMs = u4NoaIntervalMs;
rNoaParam->u4NoaDurationMs = u4NoaDurationMs;
rNoaParam->ucBssIdx = ucBssIdx;
rStatus = kalIoctl(prGlueInfo, wlanoidSetNoaParam, rNoaParam,
sizeof(struct PARAM_CUSTOM_NOA_PARAM_STRUCT),
FALSE, FALSE, TRUE, &u4BufLen);
return !(rStatus == WLAN_STATUS_SUCCESS);
}
#endif /* CFG_ENABLE_WIFI_DIRECT */
static int priv_driver_set_drv_ser(struct net_device *prNetDev,
char *pcCommand, int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t i4Argc = 0;
int32_t i4BytesWritten = 0;
uint32_t u4Num = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc <= 0) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR: Set driver SER\n", i4Argc);
return -1;
}
rStatus = kalIoctl(prGlueInfo, wlanoidSetDrvSer,
(void *)&u4Num, sizeof(uint32_t),
FALSE, FALSE, FALSE, &u4BufLen);
i4BytesWritten += snprintf(pcCommand, i4TotalLen,
"trigger driver SER\n");
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_set_amsdu_num(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t i4Argc = 0;
int32_t i4BytesWritten = 0;
int32_t u4Ret = 0;
uint32_t u4Num = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR: Sw Amsdu Num\n", i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Num);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse amsdu num error u4Ret=%d\n", u4Ret);
rStatus = kalIoctl(prGlueInfo,
wlanoidSetAmsduNum,
(void *)&u4Num, sizeof(uint32_t),
FALSE, FALSE, FALSE, &u4BufLen);
i4BytesWritten += snprintf(pcCommand, i4TotalLen,
"Set Sw Amsdu Num:%u\n", u4Num);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
static int priv_driver_set_amsdu_size(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t i4Argc = 0;
int32_t i4BytesWritten = 0;
int32_t u4Ret = 0;
uint32_t u4Size = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR, "Argc(%d) ERR: Sw Amsdu Max Size\n", i4Argc);
return -1;
}
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4Size);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse amsdu size error u4Ret=%d\n", u4Ret);
rStatus = kalIoctl(prGlueInfo,
wlanoidSetAmsduSize,
(void *)&u4Size, sizeof(uint32_t),
FALSE, FALSE, FALSE, &u4BufLen);
i4BytesWritten += snprintf(pcCommand, i4TotalLen,
"Set Sw Amsdu Max Size:%u\n", u4Size);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\n", rStatus);
return -1;
}
return i4BytesWritten;
}
#if CFG_SUPPORT_802_11V_BSS_TRANSITION_MGT
static int priv_driver_bss_transition_query(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
uint8_t *pucQueryReason = NULL;
if (strnicmp(pcCommand, "BSS-TRANSITION-QUERY", 20) == 0) {
if (strnicmp(pcCommand+20, " reason=", 8) == 0) {
pucQueryReason = pcCommand + 28;
DBGLOG(REQ, INFO,
"BSS-TRANSITION-QUERY, pucQueryReason=%s\r\n",
pucQueryReason);
}
}
if ((pucQueryReason != NULL) && (strlen(pucQueryReason) > 3)) {
DBGLOG(REQ, ERROR, "ERR: BTM query wrong reason!\r\n");
return -EFAULT;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prGlueInfo)
return -EFAULT;
if (!prGlueInfo->prAdapter->prAisBssInfo)
return -EFAULT;
rStatus = kalIoctl(prGlueInfo,
wlanoidSendBTMQuery,
(void *)pucQueryReason, 0,
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\r\n", rStatus);
return -1;
}
return i4BytesWritten;
}
#endif
#if CFG_SUPPORT_802_11K
static int priv_driver_neighbor_request(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = 0;
uint8_t *pucSSID = NULL;
if (strnicmp(pcCommand, "NEIGHBOR-REQUEST", 16) == 0) {
if (strnicmp(pcCommand+16, " SSID=", 6) == 0) {
pucSSID = pcCommand + 22;
DBGLOG(REQ, INFO,
"NEIGHBOR-REQUEST, ssid=%s\r\n", pucSSID);
}
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prGlueInfo)
return -EFAULT;
if (!prGlueInfo->prAdapter->prAisBssInfo)
return -EFAULT;
if (pucSSID == NULL)
rStatus = kalIoctl(prGlueInfo,
wlanoidSendNeighborRequest,
NULL, 0, FALSE, FALSE, TRUE, &u4BufLen);
else
rStatus = kalIoctl(prGlueInfo,
wlanoidSendNeighborRequest,
pucSSID, kalStrLen(pucSSID),
FALSE, FALSE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\r\n", rStatus);
return -1;
}
return i4BytesWritten;
}
#endif
int priv_driver_get_bsstable(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
int32_t i4BytesWritten = 0;
struct GLUE_INFO *prGlueInfo = NULL;
struct SCAN_INFO *prScanInfo;
struct LINK *prBSSDescList;
struct BSS_DESC *prBssDesc;
struct ADAPTER *prAdapter = NULL;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
prBSSDescList = &prScanInfo->rBSSDescList;
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"\nBSSID, rssi0, rssi1\n------\n");
LINK_FOR_EACH_ENTRY(prBssDesc, prBSSDescList, rLinkEntry,
struct BSS_DESC) {
LOGBUF(pcCommand, i4TotalLen, i4BytesWritten,
"%02x:%02x:%02x:%02x:%02x:%02x, %d, %d\n",
prBssDesc->aucBSSID[0], prBssDesc->aucBSSID[1],
prBssDesc->aucBSSID[2], prBssDesc->aucBSSID[3],
prBssDesc->aucBSSID[4], prBssDesc->aucBSSID[5],
RCPI_TO_dBm(prBssDesc->ucRCPI0),
RCPI_TO_dBm(prBssDesc->ucRCPI1));
}
return i4BytesWritten;
}
#ifdef CFG_SUPPORT_TIME_MEASURE
int priv_driver_start_ftm(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct PARAM_TM_T *prTmParam = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t u4Ret = 0;
int8_t *pucMac;
uint32_t u4BufLen;
uint8_t fgWaitResp = TRUE;
if (prNetDev == NULL)
return -EFAULT;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prTmParam =
(struct PARAM_TM_T *)kalMemAlloc(sizeof(struct PARAM_TM_T),
VIR_MEM_TYPE);
if (!prTmParam) {
DBGLOG(REQ, ERROR,
"Can not alloc memory for prTmParam\n");
return -ENOMEM;
}
kalMemZero(prTmParam, sizeof(struct PARAM_TM_T));
if (i4Argc >= 5) {
pucMac = apcArgv[1];
pucMac[2] = '\0';
u4Ret = kalkStrtou8(pucMac, 16, &prTmParam->aucRttPeerAddr[0]);
pucMac += 3;
pucMac[2] = '\0';
u4Ret = kalkStrtou8(pucMac, 16, &prTmParam->aucRttPeerAddr[1]);
pucMac += 3;
pucMac[2] = '\0';
u4Ret = kalkStrtou8(pucMac, 16, &prTmParam->aucRttPeerAddr[2]);
pucMac += 3;
pucMac[2] = '\0';
u4Ret = kalkStrtou8(pucMac, 16, &prTmParam->aucRttPeerAddr[3]);
pucMac += 3;
pucMac[2] = '\0';
u4Ret = kalkStrtou8(pucMac, 16, &prTmParam->aucRttPeerAddr[4]);
pucMac += 3;
pucMac[2] = '\0';
u4Ret = kalkStrtou8(pucMac, 16, &prTmParam->aucRttPeerAddr[5]);
u4Ret = kalkStrtou8(apcArgv[2], 0, &prTmParam->ucFTMBandwidth);
u4Ret = kalkStrtou8(apcArgv[3], 0, &prTmParam->ucFTMNum);
u4Ret = kalkStrtou8(apcArgv[4], 0,
&prTmParam->ucMinDeltaIn100US);
prTmParam->u4DistanceCm = 0;
prTmParam->u2NumOfValidResult = 0;
prTmParam->u8DistStdevSq = 0;
DBGLOG(REQ, INFO,
"TMR PeerMac["MACSTR"] BW[%d] ucFTMNum[%d] ucMinDeltaFtm[%d]\n",
MAC2STR(prTmParam->aucRttPeerAddr),
prTmParam->ucFTMBandwidth,
prTmParam->ucFTMNum,
prTmParam->ucMinDeltaIn100US);
if (strnicmp(apcArgv[0], CMD_START_FTM_NON_BLOCK,
strlen(CMD_START_FTM_NON_BLOCK)) == 0) {
fgWaitResp = FALSE;
prTmParam->u4DistanceCm = 1;
} else
fgWaitResp = TRUE;
u4Ret = kalIoctl(prGlueInfo, wlanoidQueryStartFtm, prTmParam,
sizeof(struct PARAM_TM_T), fgWaitResp,
fgWaitResp, TRUE, &u4BufLen);
}
if (prTmParam) {
i4BytesWritten = snprintf(pcCommand, i4TotalLen,
"["MACSTR"] Success = %d, Distance = %d (cm), STDEV = %lld",
MAC2STR(prTmParam->aucRttPeerAddr),
prTmParam->u2NumOfValidResult,
prTmParam->u4DistanceCm,
prTmParam->u8DistStdevSq);
}
kalMemFree(prTmParam, VIR_MEM_TYPE, sizeof(struct PARAM_TM_T));
return i4BytesWritten;
}
int priv_driver_get_ftm(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct PARAM_TM_T *prTmParam = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t u4Ret = 0;
uint32_t u4BufLen;
#if KERNEL_VERSION(4, 20, 0) <= LINUX_VERSION_CODE
struct timespec64 Ftmtv_raw;
#else
struct timespec Ftmtv_raw;
#endif
uint64_t u8SysClkns;
if (prNetDev == NULL)
return -EFAULT;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prTmParam = (struct PARAM_TM_T *)kalMemAlloc(
sizeof(struct PARAM_TM_T), VIR_MEM_TYPE);
if (!prTmParam) {
DBGLOG(REQ, ERROR, "Can not alloc memory for prTmParam\n");
return -ENOMEM;
}
kalMemZero(prTmParam, sizeof(struct PARAM_TM_T));
if (strnicmp(pcCommand, CMD_GET_TMR_AUDIOSYNC,
strlen(CMD_GET_TMR_AUDIOSYNC)) == 0) {
prTmParam->ucTmCategory = TM_ACTION_TMSYNC_QUERY;
} else if (strnicmp(pcCommand, CMD_GET_TMR_DISTANCE,
strlen(CMD_GET_TMR_DISTANCE)) == 0) {
prTmParam->ucTmCategory = TM_ACTION_DISTANCE_QUERY;
}
u4Ret = kalIoctl(prGlueInfo, wlanoidQueryFtm, prTmParam,
sizeof(struct PARAM_TM_T),
TRUE, TRUE, TRUE, &u4BufLen);
if (prTmParam) {
if (prTmParam->ucTmCategory == TM_ACTION_TMSYNC_QUERY) {
i4BytesWritten = snprintf(pcCommand, i4TotalLen,
"["MACSTR"] Success = %d\n\n",
MAC2STR(prTmParam->aucRttPeerAddr),
prTmParam->u2NumOfValidResult);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Clk Value = %lld (ps)\n",
prTmParam->u8Tsf);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Clk Offset = %lld (ps)\n",
prTmParam->i8ClockOffset);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"CODPer10ms = %lld (ps)\n",
prTmParam->i8ClkRateDiffRatioIn10ms);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Last ToA = %lld (ps)\n",
prTmParam->u8LastToA);
#if KERNEL_VERSION(4, 20, 0) <= LINUX_VERSION_CODE
ktime_get_raw_ts64(&Ftmtv_raw);
#else
getrawmonotonic(&Ftmtv_raw);
#endif
u8SysClkns = (uint64_t)(Ftmtv_raw.tv_sec * 1000000000LL
+ Ftmtv_raw.tv_nsec);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Cur SysClk = %lld (ns)\n",
u8SysClkns);
u8SysClkns = nicFtmRAWASCtrl(u8SysClkns);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"Cur GlbCnt = %lld (ps)\n",
u8SysClkns);
} else if (prTmParam->ucTmCategory ==
TM_ACTION_DISTANCE_QUERY) {
i4BytesWritten = snprintf(pcCommand, i4TotalLen,
"["MACSTR"] Success = %d, Distance = %d (cm), STDEV = %lld",
MAC2STR(prTmParam->aucRttPeerAddr),
prTmParam->u2NumOfValidResult,
prTmParam->u4DistanceCm,
prTmParam->u8DistStdevSq);
}
}
kalMemFree(prTmParam, VIR_MEM_TYPE, sizeof(struct PARAM_TM_T));
return i4BytesWritten;
}
int priv_driver_enable_tmr(IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct PARAM_TM_T *prTmParam = NULL;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t u4Ret = 0;
uint32_t u4BufLen;
if (prNetDev == NULL)
return -EFAULT;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
prTmParam = (struct PARAM_TM_T *)kalMemAlloc(
sizeof(struct PARAM_TM_T), VIR_MEM_TYPE);
if (!prTmParam) {
DBGLOG(REQ, ERROR,
"Can not alloc memory for prTmParam\n");
return -ENOMEM;
}
kalMemZero(prTmParam, sizeof(struct PARAM_TM_T));
if (i4Argc >= 2) {
u4Ret = kalkStrtou8(apcArgv[1], 0, &prTmParam->fgFtmEnable);
u4Ret = kalIoctl(prGlueInfo, wlanoidSetEnableTmr, prTmParam,
sizeof(struct PARAM_TM_T),
FALSE, FALSE, TRUE, &u4BufLen);
}
kalMemFree(prTmParam, VIR_MEM_TYPE, sizeof(struct PARAM_TM_T));
return i4BytesWritten;
}
#endif
#if CFG_SUPPORT_WAC
static int priv_driver_set_wac_ie_enable(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
struct BSS_INFO *prBssInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
int32_t Enable = -1;
uint8_t ucRoleIdx = 0, ucBssIdx = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
u4Ret = kalkStrtos32(apcArgv[1], 0, &Enable);
if (u4Ret)
DBGLOG(REQ, ERROR, "parse bEnable error u4Ret=%d\n", u4Ret);
if (Enable == 0) {
DBGLOG(REQ, INFO, "disable WAC IE!\n");
prAdapter->rWifiVar.fgEnableWACIE = FALSE;
} else if (Enable == 1) {
DBGLOG(REQ, INFO, "enable WAC IE!\n");
prAdapter->rWifiVar.fgEnableWACIE = TRUE;
} else {
DBGLOG(REQ, INFO, "invalid WAC IE enable flag!\n");
return -1;
}
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo, prNetDev, &ucRoleIdx) != 0) {
DBGLOG(REQ, ERROR, "Failed to get role index!\n");
return -1;
}
if (p2pFuncRoleToBssIdx(prAdapter, ucRoleIdx, &ucBssIdx) !=
WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "Failed to get Bss index!\n");
return -1;
}
prBssInfo = prAdapter->aprBssInfo[ucBssIdx];
bssUpdateBeaconContent(prAdapter, prBssInfo->ucBssIndex);
return 0;
}
#endif
#if CFG_SUPPORT_SCHED_SCAN
static int priv_driver_set_pno_interval(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int8_t i = 0;
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID +
CMD_ADVCTL_MMPS;
uint32_t u4NumOfInterval = 0;
uint32_t PNO_interval[10] = { 0 };
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, ERROR, "command is %s\n", pcCommand);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc <= 1) {
DBGLOG(REQ, ERROR,
"Argc(%d) ERR: SET_PNO_INTERVAL <Num_Interval> <Inval 0> ....(sec)\n",
i4Argc);
return -1;
} else if (i4Argc > 12) {
DBGLOG(REQ, ERROR,
"Argc(%d) ERR: Only support Max 10 interval at this stage\n",
i4Argc);
return -1;
}
/* To get the interval entery*/
u4Ret = kalkStrtou32(apcArgv[1], 0, &u4NumOfInterval);
if (u4Ret) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommand failed, invalid parameter");
return i4BytesWritten;
} else if (u4NumOfInterval == INFINITE_PNO_INTERVAL) {
u4Ret = kalkStrtou32(apcArgv[2], 0, PNO_interval);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n infinite PNO interval: %d sec", PNO_interval[0]);
} else if (u4NumOfInterval < 0 || u4NumOfInterval > 10) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Num of interval is out of range, only support Max 10 and 99 for infinite");
return i4BytesWritten;
}
/* reset the current Msp list */
prAdapter->ucCusMspEntryNum = 0;
kalMemZero(prAdapter->au2CusMspList, sizeof(prAdapter->au2CusMspList));
/* update new PNO interval */
if (u4NumOfInterval == INFINITE_PNO_INTERVAL) {
/* update the entery and interval in MspList */
prAdapter->ucCusMspEntryNum = u4NumOfInterval;
prAdapter->au2CusMspList[0] = PNO_interval[0];
} else {
for (i = 0; i < u4NumOfInterval; i++) {
u4Ret = kalkStrtou32(apcArgv[i+2], 0, PNO_interval+i);
prAdapter->au2CusMspList[i] = PNO_interval[i];
}
prAdapter->ucCusMspEntryNum = u4NumOfInterval;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Set %d time of PNO interval: %d %d %d %d %d %d %d %d %d %d (sec)",
u4NumOfInterval, PNO_interval[0], PNO_interval[1],
PNO_interval[2], PNO_interval[3], PNO_interval[4],
PNO_interval[5], PNO_interval[6], PNO_interval[7],
PNO_interval[8], PNO_interval[9]);
}
return i4BytesWritten;
}
int priv_driver_get_pno_interval(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int8_t i = 0;
if (prNetDev == NULL)
return -EFAULT;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc != 1) {
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:get_pno_interval");
return i4BytesWritten;
}
if (prAdapter->ucCusMspEntryNum == 0) {
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nNo customized PNO interval plan, running as default");
return i4BytesWritten;
} else if (prAdapter->ucCusMspEntryNum == 99) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\ninfinite PNO interval: %d sec",
prAdapter->au2CusMspList[0]);
} else {
/* print out the pno number and also detail pno interval*/
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCurrent PNO interval plan: Num of PNO interval:%d\n",
prAdapter->ucCusMspEntryNum);
for (i = 0; i < prAdapter->ucCusMspEntryNum ; i++) {
if (i == 5) {
i4BytesWritten +=
snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n");
}
i4BytesWritten +=
snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"interval %d: %d sec",
i, prAdapter->au2CusMspList[i]);
}
}
return i4BytesWritten;
}
static int priv_driver_set_dwell_time(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
int32_t u4Ret2 = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID +
CMD_ADVCTL_MMPS;
uint16_t u2DwellTime = 0, u2MinDwellTime = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
if (prNetDev == NULL) {
DBGLOG(REQ, ERROR, "prNetDev is NULL\n");
return -1;
}
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, ERROR, "command is %s\n", pcCommand);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc != 3) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nArgc(%d) ERR: SET_DWELL_TIME <dwell Time ms> <min dwell time ms>\n",
i4Argc);
return i4BytesWritten;
}
/* To get the interval entery*/
u4Ret = kalkStrtou16(apcArgv[1], 0, &u2DwellTime);
u4Ret2 = kalkStrtou16(apcArgv[2], 0, &u2MinDwellTime);
if (u4Ret2 != 0 || u4Ret != 0) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommand failed, invalid u4R4t(%d) u4Ret2(%d) in setting dwell time",
u4Ret, u4Ret2);
return i4BytesWritten;
}
if (u2DwellTime == 0 && u2MinDwellTime == 0) {
prAdapter->u2ChannelCusDwellTime = u2DwellTime;
prAdapter->u2ChannelCusMinDwellTime = u2MinDwellTime;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nDisable customized scan dwell time");
return i4BytesWritten;
} else if (u2MinDwellTime == 0) {
u2MinDwellTime = 42;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nmin dwell time (0) set to be default (42ms)\n");
}
if (u2DwellTime < u2MinDwellTime) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n dwell time (%d) is not allow to < min dwell time (%d)",
u2DwellTime, u2MinDwellTime);
return i4BytesWritten;
} else if (u2MinDwellTime < 8 || u2MinDwellTime > 64) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nmin dwell time (%d) is out of range < 8 ms > 64ms\n",
u2MinDwellTime);
return i4BytesWritten;
}
/* reset the current Msp list */
prAdapter->u2ChannelCusDwellTime = u2DwellTime;
prAdapter->u2ChannelCusMinDwellTime = u2MinDwellTime;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Set customized dwell time (%d) and min dwell time (%d)",
prAdapter->u2ChannelCusDwellTime,
prAdapter->u2ChannelCusMinDwellTime);
return i4BytesWritten;
}
int priv_driver_get_dwell_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
if (prNetDev == NULL)
return -1;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc != 1) {
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:get_dwell_time");
} else {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Get customized dwell time (%d) and min dwell time (%d)",
prAdapter->u2ChannelCusDwellTime,
prAdapter->u2ChannelCusMinDwellTime);
}
return i4BytesWritten;
}
static int priv_driver_set_pno_passive_dwell(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t u4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID +
CMD_ADVCTL_MMPS;
uint16_t u2PassiveDwellTime = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
if (prNetDev == NULL)
return -1;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, ERROR, "command is %s\n", pcCommand);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc != 2) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nArgc(%d) ERR: SET_PNO_PASSIVE_DWELL <dwell Time ms>\n",
i4Argc);
return i4BytesWritten;
}
/* To get the interval entery*/
u4Ret = kalkStrtou16(apcArgv[1], 0, &u2PassiveDwellTime);
if (u4Ret) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommand failed, invalid u4R4t(%d) in pno passive dwell time",
u4Ret);
return i4BytesWritten;
}
/* set the pno passive dwell time */
prAdapter->u2ChannelCusPassiveDwellTime = u2PassiveDwellTime;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Set customized pno passive dwell time (%d)",
prAdapter->u2ChannelCusPassiveDwellTime);
return i4BytesWritten;
}
int priv_driver_get_pno_passive_dwell(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
if (prNetDev == NULL)
return -1;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc != 1) {
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:get_pno_passive_dwell");
return i4BytesWritten;
}
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Get customized pno passive dwell time (%d)",
prAdapter->u2ChannelCusPassiveDwellTime);
return i4BytesWritten;
}
static int priv_driver_set_pno_wake_rssi(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
int32_t i4Ret = 0;
uint32_t u4Id = CMD_SW_DBGCTL_ADVCTL_SET_ID +
CMD_ADVCTL_MMPS;
int32_t i4Rssi = 0;
struct PARAM_CUSTOM_SW_CTRL_STRUCT rSwCtrlInfo;
if (prNetDev == NULL)
return -1;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, ERROR, "command is %s\n", pcCommand);
rSwCtrlInfo.u4Id = u4Id;
if (i4Argc != 2) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nArgc(%d) ERR: SET_PNO_WAKE_RSSI <rssi value>\n",
i4Argc);
return i4BytesWritten;
}
/* To get the interval entery*/
i4Ret = kalkStrtos32(apcArgv[1], 0, &i4Rssi);
if (i4Ret) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommand failed, invalid i4R4t(%d) in set rssi",
i4Ret);
return i4BytesWritten;
}
if (i4Rssi >= 0 || i4Rssi < -110) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nRSSI threshold is not in meaningful range (%d)",
i4Rssi);
return i4BytesWritten;
}
/* reset the current Msp list */
prAdapter->i4RssiThreshold = i4Rssi;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Set PNO wake RSSI : (%d)",
prAdapter->i4RssiThreshold);
return i4BytesWritten;
}
int priv_driver_get_pno_wake_rssi(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
if (prNetDev == NULL)
return -1;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc != 1) {
i4BytesWritten += scnprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:get_pno_wake_rssi");
} else {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n PNO Wake Threshold: (%d)",
prAdapter->i4RssiThreshold);
}
return i4BytesWritten;
}
#endif
#if IS_ENABLED(CFG_CCN7_SAP_EASYMESH)
int32_t MontorSendMsg(IN uint16_t msgtype,
IN void *pvmsgbuf, IN int32_t i4TotalLen)
{
struct sk_buff *skb;
struct nlmsghdr *nlh;
uint32_t u4Ret = 0;
DBGLOG(REQ, INFO, "send netlink msg start\n");
DBGLOG(INIT, TRACE, "msg len == %d", i4TotalLen);
skb = nlmsg_new(i4TotalLen, 0);
if (!skb) {
DBGLOG(REQ, ERROR, "netlink alloc failed\n");
return -1;
}
nlh = nlmsg_put(skb, 0, 0, NLMSG_DONE, i4TotalLen, 0);
if (nlh == NULL) {
DBGLOG(REQ, ERROR, "netlink msg put failed!\n");
kfree_skb(skb);
return -1;
}
NETLINK_CB(skb).dst_group = 5;
NETLINK_CB(skb).portid = 0;
nlh->nlmsg_type = msgtype;
memcpy(NLMSG_DATA(nlh), pvmsgbuf, i4TotalLen);
u4Ret = netlink_broadcast(nl_sk, skb, 0, 5, GFP_KERNEL);
if (u4Ret < 0) {
DBGLOG(REQ, ERROR,
"netlink sendmsg failed,msgtype is %x, ret is %d\n",
msgtype, u4Ret);
return u4Ret;
}
DBGLOG(REQ, INFO, "send netlink msg success!\n");
return u4Ret;
}
static void p2pFunBssStatusNotification(IN struct ADAPTER *prAdapter,
IN struct BSS_INFO *prBssInfo)
{
struct T_MULTI_AP_BSS_STATUS_REPORT *prBssReport;
struct PARAM_CUSTOM_GET_TX_POWER rGetTxPower;
bool fgSGIEnable = false;
uint8_t ucMaxBw = 0;
uint8_t ucNss = 0;
uint8_t ucNssLoop = 0;
uint8_t ucOffset = 0;
uint8_t ucMcsMap = 0;
uint32_t u4BufLen = 0;
int32_t i4Ret = 0;
fgSGIEnable = IS_FEATURE_ENABLED(prAdapter->rWifiVar.ucRxShortGI);
ucMaxBw = cnmGetBssMaxBw(prAdapter, prBssInfo->ucBssIndex);
ucNss = wlanGetSupportNss(prAdapter, prBssInfo->ucBssIndex);
prBssReport = kalMemAlloc(sizeof(*prBssReport), VIR_MEM_TYPE);
if (!prBssReport) {
DBGLOG(AAA, ERROR, "mem alloc fail\n");
return;
}
kalMemZero(prBssReport, sizeof(*prBssReport));
/* Interface Index */
i4Ret = sscanf(prAdapter->prGlueInfo->prP2PInfo[1]->prDevHandler->name,
"ap%u", &prBssReport->uIfIndex);
if (i4Ret != 1)
DBGLOG(P2P, WARN, "read sap index fail: %d\n", i4Ret);
/* Bssid */
COPY_MAC_ADDR(prBssReport->mBssid, prBssInfo->aucBSSID);
/* Status */
prBssReport->uStatus = prBssInfo->fgIsInUse;
/* Channel */
prBssReport->u8Channel = prBssInfo->ucPrimaryChannel;
/* Operation Class Table E-4 in IEEE802.11-2016. */
if (prBssInfo->ucPrimaryChannel < 14)
/* TODO: bandwidth? */
prBssReport->u8OperClass = 81;
else if (prBssInfo->ucPrimaryChannel >= 36
&& prBssInfo->ucPrimaryChannel <= 48)
prBssReport->u8OperClass = 115;
else if (prBssInfo->ucPrimaryChannel >= 52
&& prBssInfo->ucPrimaryChannel <= 64)
prBssReport->u8OperClass = 118;
else if (prBssInfo->ucPrimaryChannel >= 149
&& prBssInfo->ucPrimaryChannel <= 161)
prBssReport->u8OperClass = 124;
else
DBGLOG(P2P, WARN,
"unknown CH %d for op-class\n",
prBssInfo->ucPrimaryChannel);
/* TX Power */
/*
* THIS/CMD are both running in main_thread.
* Cannot get result by this CMD
*/
kalMemZero(&rGetTxPower, sizeof(struct PARAM_CUSTOM_GET_TX_POWER));
rGetTxPower.ucCenterChannel = prBssInfo->ucPrimaryChannel;
rGetTxPower.ucBand = prBssInfo->eBand;
rGetTxPower.ucDbdcIdx = ENUM_BAND_0;
wlanoidQueryGetTxPower(prAdapter,
&rGetTxPower,
sizeof(struct PARAM_CUSTOM_GET_TX_POWER), &u4BufLen);
prBssReport->u8Txpower = prAdapter->u4GetTxPower/2;
/* Band */
prBssReport->uBand = prBssInfo->eBand;
/* HT Capability */
if (RLM_NET_IS_11N(prBssInfo)) {
prBssReport->uHtCap = (
(ucNss << SAP_HTCAP_TXSTREAMNUM_OFFSET) |
(ucNss << SAP_HTCAP_RXSTREAMNUM_OFFSET) |
(fgSGIEnable << SAP_HTCAP_SGIFOR20M_OFFSET) |
((prBssInfo->fgAssoc40mBwAllowed ? fgSGIEnable : 0)
<< SAP_HTCAP_SGIFOR40M_OFFSET) |
((prBssInfo->fgAssoc40mBwAllowed ? 1 : 0)
<< SAP_HTCAP_HTFOR40M_OFFSET)
);
}
/* VHT Capability */
if (RLM_NET_IS_11AC(prBssInfo)) {
for (ucNssLoop = 1; ucNssLoop <= 8; ucNssLoop++) {
ucOffset = (ucNssLoop - 1) * 2;
ucMcsMap = (ucNssLoop <= ucNss ?
VHT_CAP_INFO_MCS_MAP_MCS9
: VHT_CAP_INFO_MCS_NOT_SUPPORTED);
prBssReport->u16VhtTxMcs |= (ucMcsMap << ucOffset);
prBssReport->u16VhtRxMcs |= (ucMcsMap << ucOffset);
}
prBssReport->u16VhtCap = (
(ucNss << SAP_VHTCAP_TXSTREAMNUM_OFFSET) |
(ucNss << SAP_VHTCAP_RXSTREAMNUM_OFFSET) |
((ucMaxBw >= MAX_BW_80MHZ ? fgSGIEnable : 0)
<< SAP_VHTCAP_SGIFOR80M_OFFSET) |
((ucMaxBw >= MAX_BW_160MHZ ? fgSGIEnable : 0)
<< SAP_VHTCAP_SGIFOR160M_OFFSET) |
((ucMaxBw == MAX_BW_80_80_MHZ)
<< SAP_VHTCAP_VHTFORDUAL80M_OFFSET) |
((ucMaxBw == MAX_BW_160MHZ)
<< SAP_VHTCAP_VHTFOR160M_OFFSET) |
(IS_FEATURE_ENABLED(prAdapter->rWifiVar.ucStaVhtBfer)
<< SAP_VHTCAP_SUBEAMFORMER_OFFSET) |
(0 << SAP_VHTCAP_MUBEAMFORMER_OFFSET)
);
}
/* HE Capability (not support) */
prBssReport->u8HeMcsNum = 0;
kalMemZero(&prBssReport->u8HeMcs, 16);
kalMemZero(&prBssReport->u16HeCap, sizeof(uint16_t));
DBGLOG(P2P, WARN,
"[SAP_Test] uIfIndex=%d\n", prBssReport->uIfIndex);
DBGLOG(P2P, WARN,
"[SAP_Test] mBssid=" MACSTR "\n", MAC2STR(prBssReport->mBssid));
DBGLOG(P2P, WARN,
"[SAP_Test] uStatus=%d\n", prBssReport->uStatus);
DBGLOG(P2P, WARN,
"[SAP_Test] u8Channel=%d\n", prBssReport->u8Channel);
DBGLOG(P2P, WARN,
"[SAP_Test] u8OperClass=%d\n", prBssReport->u8OperClass);
DBGLOG(P2P, WARN,
"[SAP_Test] u8Txpower=%d\n", prBssReport->u8Txpower);
DBGLOG(P2P, WARN,
"[SAP_Test] uBand=%d\n", prBssReport->uBand);
DBGLOG(P2P, WARN,
"[SAP_Test] uHtCap=0x%x\n", prBssReport->uHtCap);
DBGLOG(P2P, WARN,
"[SAP_Test] u16VhtTxMcs=0x%x\n", prBssReport->u16VhtTxMcs);
DBGLOG(P2P, WARN,
"[SAP_Test] u16VhtRxMcs=0x%x\n", prBssReport->u16VhtRxMcs);
DBGLOG(P2P, WARN,
"[SAP_Test] u16VhtCap=0x%x\n", prBssReport->u16VhtCap);
DBGLOG(P2P, WARN,
"[SAP_Test] u8HeMcsNum=%d\n", prBssReport->u8HeMcsNum);
DBGLOG_MEM8(P2P, WARN,
prBssReport->u8HeMcs, 16);
DBGLOG(P2P, WARN,
"[SAP_Test] u16HeCap=0x%x\n", prBssReport->u16HeCap);
i4Ret = MontorSendMsg(EV_WLAN_MULTIAP_BSS_STATUS_REPORT,
prBssReport, sizeof(*prBssReport));
if (i4Ret < 0)
DBGLOG(AAA, ERROR,
"EV_WLAN_MULTIAP_BSS_STATUS_REPORT nl send msg failed!\n");
kalMemFree(prBssReport, VIR_MEM_TYPE, sizeof(*prBssReport));
}
static int32_t priv_driver_bss_status_report(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
uint32_t u4Ret = 0;
uint8_t ucParam = 0;
uint8_t ucRoleIdx = 0;
uint8_t ucBssIdx = 0;
struct BSS_INFO *prBssInfo = NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
goto error;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get command */
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char)
goto error;
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
u4Ret = kalkStrtou8(this_char, 0, &ucParam);
DBGLOG(REQ, LOUD, "u4Ret = %d, ucParam = %d\n", u4Ret, ucParam);
if (u4Ret != 0) {
DBGLOG(INIT, ERROR,
"iwpriv wlanXX driver %s=[0|1]\n", CMD_BSS_REPORT_INFO);
goto error;
}
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo,
prGlueInfo->prP2PInfo[1]->prDevHandler,
&ucRoleIdx) != 0)
goto error;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter,
ucRoleIdx, &ucBssIdx) != WLAN_STATUS_SUCCESS)
goto error;
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIdx);
if (!prBssInfo) {
DBGLOG(REQ, WARN, "bss is not active\n");
goto error;
}
p2pFunBssStatusNotification(prAdapter, prBssInfo);
return i4BytesWritten;
error:
return -1;
}
static int32_t priv_driver_bss_report_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
uint32_t u4Ret = 0;
uint8_t ucParam = 0;
uint8_t ucRoleIdx = 0;
uint8_t ucBssIdx = 0;
int32_t i4Ret = 0;
struct BSS_INFO *prBssInfo = NULL;
struct T_MULTI_AP_BSS_METRICS_RESP sBssMetricsResp;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
goto error;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get command */
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char)
goto error;
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
u4Ret = kalkStrtou8(this_char, 0, &ucParam);
DBGLOG(REQ, LOUD, "u4Ret = %d, ucParam = %d\n", u4Ret, ucParam);
if (u4Ret != 0) {
DBGLOG(INIT, ERROR,
"iwpriv wlanXX driver %s=[0|1]\n", CMD_BSS_REPORT_INFO);
goto error;
}
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo,
prGlueInfo->prP2PInfo[1]->prDevHandler,
&ucRoleIdx) != 0)
goto error;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter,
ucRoleIdx, &ucBssIdx) != WLAN_STATUS_SUCCESS)
goto error;
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIdx);
if (!prBssInfo) {
DBGLOG(REQ, WARN, "bss is not active\n");
goto error;
}
schedule_delayed_work(
&prAdapter->prGlueInfo->rChanNoiseControlWork, 0);
/* 1. BSS Measurement */
/* Interface Index */
i4Ret = sscanf(prGlueInfo->prP2PInfo[1]->prDevHandler->name,
"ap%u", &sBssMetricsResp.uIfIndex);
if (i4Ret != 1)
DBGLOG(P2P, WARN, "read sap index fail: %d\n", i4Ret);
COPY_MAC_ADDR(sBssMetricsResp.mBssid, prBssInfo->aucBSSID);
sBssMetricsResp.u8Channel = prBssInfo->ucPrimaryChannel;
sBssMetricsResp.u16AssocStaNum =
bssGetClientCount(prAdapter, prBssInfo);
sBssMetricsResp.u8ChanUtil = prBssInfo->u4ChanUtil;
sBssMetricsResp.iChanNoise = prBssInfo->i4NoiseHistogram;
DBGLOG(REQ, WARN,
"[SAP_Test] uIfIndex = %u\n", sBssMetricsResp.uIfIndex);
DBGLOG(REQ, WARN,
"[SAP_Test] mBssid = " MACSTR "\n",
MAC2STR(sBssMetricsResp.mBssid));
DBGLOG(REQ, WARN,
"[SAP_Test] u8Channel = %d\n", sBssMetricsResp.u8Channel);
DBGLOG(REQ, WARN,
"[SAP_Test] u16AssocStaNum = %d\n",
sBssMetricsResp.u16AssocStaNum);
DBGLOG(REQ, WARN,
"[SAP_Test] u8ChanUtil = %d\n", sBssMetricsResp.u8ChanUtil);
DBGLOG(REQ, WARN,
"[SAP_Test] iChanNoise = %d\n", sBssMetricsResp.iChanNoise);
i4Ret = MontorSendMsg(EV_WLAN_MULTIAP_BSS_METRICS_RESPONSE,
&sBssMetricsResp, sizeof(sBssMetricsResp));
if (i4Ret < 0) {
DBGLOG(AAA, ERROR,
"EV_WLAN_MULTIAP_BSS_METRICS_RESPONSE nl send msg failed!\n");
return i4Ret;
}
return i4BytesWritten;
error:
return -1;
}
static int32_t priv_driver_sta_report_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int32_t i4Ret = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
uint8_t aucMacAddr[MAC_ADDR_LEN];
uint8_t ucRoleIdx = 0;
uint8_t ucBssIdx = 0;
struct BSS_INFO *prBssInfo = NULL;
struct STA_RECORD *prStaRec = NULL;
u_int32_t txmode, rate, frmode, sgi, nsts, groupid;
u_int32_t u4RxVector0 = 0, u4RxVector1 = 0;
u_int16_t u2RateCode = 0;
u_int32_t u4BufLen = 0;
u_int8_t ucWlanIndex, i;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
struct PARAM_GET_STA_STATISTICS *prQueryStaStatistics = NULL;
struct PARAM_HW_WLAN_INFO *prHwWlanInfo = NULL;
struct T_MULTI_AP_STA_ASSOC_METRICS_RESP *sStaAssocMetricsResp = NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE) {
i4BytesWritten = -1;
goto exit;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get command */
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD,
"argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char) {
i4BytesWritten = -1;
goto exit;
}
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
i4Ret = wlanHwAddrToBin(this_char, &aucMacAddr[0]);
if (i4Ret < 0) {
DBGLOG(INIT, ERROR,
"iwpriv wlanXX driver %s=STA_MAC\n",
CMD_STA_REPORT_INFO);
i4BytesWritten = -1;
goto exit;
}
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo,
prGlueInfo->prP2PInfo[1]->prDevHandler,
&ucRoleIdx) != 0) {
i4BytesWritten = -1;
goto exit;
}
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter,
ucRoleIdx, &ucBssIdx) != WLAN_STATUS_SUCCESS) {
i4BytesWritten = -1;
goto exit;
}
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIdx);
if (!prBssInfo) {
DBGLOG(REQ, WARN, "bss is not active\n");
i4BytesWritten = -1;
goto exit;
}
/* get Station Record */
prStaRec = bssGetClientByMac(prGlueInfo->prAdapter,
prBssInfo, aucMacAddr);
if (prStaRec == NULL) {
DBGLOG(REQ, WARN, "can't find station\n");
i4BytesWritten = -1;
goto exit;
}
/* Get WTBL info */
prHwWlanInfo = (struct PARAM_HW_WLAN_INFO *)
kalMemAlloc(sizeof(struct PARAM_HW_WLAN_INFO),
VIR_MEM_TYPE);
if (!prHwWlanInfo) {
DBGLOG(REQ, ERROR,
"Allocate memory for prHwWlanInfo failed!\n");
i4BytesWritten = -1;
goto exit;
}
prHwWlanInfo->u4Index = prStaRec->ucWlanIndex;
rStatus = kalIoctl(prGlueInfo,
wlanoidQueryWlanInfo,
prHwWlanInfo,
sizeof(struct PARAM_HW_WLAN_INFO),
TRUE, TRUE, TRUE,
&u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "Query prHwWlanInfo failed!\n");
i4BytesWritten = -1;
goto exit;
}
/* Get Statistics info */
prQueryStaStatistics = (struct PARAM_GET_STA_STATISTICS *)
kalMemAlloc(sizeof(struct PARAM_GET_STA_STATISTICS),
VIR_MEM_TYPE);
if (!prQueryStaStatistics) {
DBGLOG(REQ, ERROR,
"Allocate memory for prQueryStaStatistics failed!\n");
i4BytesWritten = -1;
goto exit;
}
ucWlanIndex = prStaRec->ucWlanIndex;
COPY_MAC_ADDR(prQueryStaStatistics->aucMacAddr, aucMacAddr);
DBGLOG(REQ, INFO, "ucWlanIndex = %d\n", ucWlanIndex);
DBGLOG(REQ, INFO,
"Query "MACSTR"\n", MAC2STR(prQueryStaStatistics->aucMacAddr));
rStatus = kalIoctl(prGlueInfo,
wlanoidQueryStaStatistics,
prQueryStaStatistics,
sizeof(struct PARAM_GET_STA_STATISTICS),
TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "Query prQueryStaStatistics failed!\n");
i4BytesWritten = -1;
goto exit;
}
sStaAssocMetricsResp = (struct T_MULTI_AP_STA_ASSOC_METRICS_RESP *)
kalMemAlloc(sizeof(
struct T_MULTI_AP_STA_ASSOC_METRICS_RESP),
VIR_MEM_TYPE);
if (sStaAssocMetricsResp == NULL) {
DBGLOG(INIT, ERROR, "alloc memory fail\n");
i4BytesWritten = -1;
goto exit;
}
/*2. Associated STA Measurement */
/* Interface Index */
i4Ret = sscanf(prGlueInfo->prP2PInfo[1]->prDevHandler->name,
"ap%u", &sStaAssocMetricsResp->uIfIndex);
if (i4Ret != 1)
DBGLOG(P2P, WARN, "read sap index fail: %d\n", i4Ret);
COPY_MAC_ADDR(sStaAssocMetricsResp->mBssid, prBssInfo->aucBSSID);
COPY_MAC_ADDR(sStaAssocMetricsResp->mStaMac, prStaRec->aucMacAddr);
sStaAssocMetricsResp->uBytesSent = prStaRec->u8TotalTxBytes;
sStaAssocMetricsResp->uBytesRecv = prStaRec->u8TotalRxBytes;
sStaAssocMetricsResp->uPktsSent =
prQueryStaStatistics->u4TransmitCount;
sStaAssocMetricsResp->uPktsRecv = prStaRec->u8TotalRxPkts;
sStaAssocMetricsResp->uPktsTxError =
prQueryStaStatistics->u4TransmitFailCount;
sStaAssocMetricsResp->uPktsRxError = 0;
sStaAssocMetricsResp->uRetransCnt = 0;
sStaAssocMetricsResp->iRssi =
RCPI_TO_dBm((prStaRec->u4RxVector3 & RX_VT_RCPI0_MASK)
>> RX_VT_RCPI0_OFFSET);
/* TxPhyRate */
for (i = 0; i < AUTO_RATE_NUM; i++) {
txmode =
HW_TX_RATE_TO_MODE(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i]);
if (txmode >= MAX_TX_MODE)
txmode = MAX_TX_MODE;
rate =
HW_TX_RATE_TO_MCS(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i], txmode);
nsts =
HW_TX_RATE_TO_NSS(
prHwWlanInfo->rWtblRateInfo.au2RateCode[i]) + 1;
frmode = prHwWlanInfo->rWtblPeerCap.ucFrequencyCapability;
sgi = priv_driver_get_sgi_info(&prHwWlanInfo->rWtblPeerCap);
if (prHwWlanInfo->rWtblRateInfo.ucRateIdx != i)
continue;
else {
u2RateCode = nicRateInfo2RateCode(txmode, rate);
if (u2RateCode > 0) {
sStaAssocMetricsResp->uPhyTxRate =
nicRateCode2PhyRate(u2RateCode,
frmode + 4, sgi,
nsts - 1) / 10;
} else {
DBGLOG(REQ, WARN, "convert RateInfo fail\n");
sStaAssocMetricsResp->uPhyTxRate = 0;
}
}
}
/* RxPhyRate */
u4RxVector0 = prStaRec->u4RxVector0;
u4RxVector1 = prStaRec->u4RxVector1;
txmode = (u4RxVector0 & RX_VT_RX_MODE_MASK) >> RX_VT_RX_MODE_OFFSET;
rate = (u4RxVector0 & RX_VT_RX_RATE_MASK) >> RX_VT_RX_RATE_OFFSET;
frmode = (u4RxVector0 & RX_VT_FR_MODE_MASK) >> RX_VT_FR_MODE_OFFSET;
nsts = ((u4RxVector1 & RX_VT_NSTS_MASK) >> RX_VT_NSTS_OFFSET);
sgi = (u4RxVector0 & RX_VT_SHORT_GI) >> 19;
groupid = (u4RxVector1 & RX_VT_GROUP_ID_MASK) >> RX_VT_GROUP_ID_OFFSET;
if (!(groupid && groupid != 63))
nsts += 1;
u2RateCode = nicRateInfo2RateCode(txmode, rate);
if (u2RateCode > 0) {
sStaAssocMetricsResp->uPhyRxRate =
nicRateCode2PhyRate(u2RateCode,
frmode + 4, sgi, nsts - 1) / 10;
} else {
DBGLOG(REQ, WARN, "convert RateInfo fail\n");
sStaAssocMetricsResp->uPhyRxRate = 0;
}
sStaAssocMetricsResp->uAssocRate = 0;
sStaAssocMetricsResp->uDeltaTime = kalGetTimeTick()
- prStaRec->u8GetDataRateTime;
DBGLOG(REQ, WARN,
"[SAP_Test] uIfIndex = %u\n",
sStaAssocMetricsResp->uIfIndex);
DBGLOG(REQ, WARN,
"[SAP_Test] mBssid = " MACSTR "\n",
sStaAssocMetricsResp->mBssid);
DBGLOG(REQ, WARN,
"[SAP_Test] mStaMac = " MACSTR "\n",
sStaAssocMetricsResp->mStaMac);
DBGLOG(REQ, WARN,
"[SAP_Test] uBytesSent = %llu\n",
sStaAssocMetricsResp->uBytesSent);
DBGLOG(REQ, WARN,
"[SAP_Test] uBytesRecv = %llu\n",
sStaAssocMetricsResp->uBytesRecv);
DBGLOG(REQ, WARN,
"[SAP_Test] uPktsSent = %llu\n",
sStaAssocMetricsResp->uPktsSent);
DBGLOG(REQ, WARN,
"[SAP_Test] uPktsRecv = %llu\n",
sStaAssocMetricsResp->uPktsRecv);
DBGLOG(REQ, WARN,
"[SAP_Test] uPktsTxError = %llu\n",
sStaAssocMetricsResp->uPktsTxError);
DBGLOG(REQ, WARN,
"[SAP_Test] uPktsRxError = %u\n",
sStaAssocMetricsResp->uPktsRxError);
DBGLOG(REQ, WARN,
"[SAP_Test] uRetransCnt = %u\n",
sStaAssocMetricsResp->uRetransCnt);
DBGLOG(REQ, WARN,
"[SAP_Test] iRssi = %d\n",
sStaAssocMetricsResp->iRssi);
DBGLOG(REQ, WARN,
"[SAP_Test] uPhyTxRate = %u\n",
sStaAssocMetricsResp->uPhyTxRate);
DBGLOG(REQ, WARN,
"[SAP_Test] uPhyRxRate = %u\n",
sStaAssocMetricsResp->uPhyRxRate);
DBGLOG(REQ, WARN,
"[SAP_Test] uAssocRate = %u\n",
sStaAssocMetricsResp->uAssocRate);
DBGLOG(REQ, WARN,
"[SAP_Test] uDeltaTime = %u\n",
sStaAssocMetricsResp->uDeltaTime);
i4Ret = MontorSendMsg(EV_WLAN_MULTIAP_ASSOC_STA_METRICS_RESPONSE,
sStaAssocMetricsResp, sizeof(*sStaAssocMetricsResp));
if (i4Ret < 0) {
DBGLOG(AAA, ERROR,
"EV_WLAN_MULTIAP_ASSOC_STA_METRICS_RESPONSE nl send msg failed!\n");
return i4Ret;
}
kalMemFree(sStaAssocMetricsResp,
VIR_MEM_TYPE,
sizeof(struct T_MULTI_AP_STA_ASSOC_METRICS_RESP));
exit:
if (prHwWlanInfo)
kalMemFree(prHwWlanInfo,
VIR_MEM_TYPE,
sizeof(PARAM_HW_WLAN_INFO));
if (prQueryStaStatistics)
kalMemFree(prQueryStaStatistics,
VIR_MEM_TYPE,
sizeof(PARAM_GET_STA_STATISTICS));
return i4BytesWritten;
}
static int32_t priv_driver_sta_measurement_control(
IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
uint32_t u4Ret = 0;
uint8_t ucParam = 0;
uint8_t ucRoleIdx = 0;
uint8_t ucBssIdx = 0;
struct BSS_INFO *prBssInfo = NULL;
uint16_t ucMeasureDuration = 0;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
goto error;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get command */
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char)
goto error;
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
u4Ret = kalkStrtou8(this_char, 0, &ucParam);
DBGLOG(REQ, LOUD, "u4Ret = %d, ucParam = %d\n", u4Ret, ucParam);
if (u4Ret != 0) {
DBGLOG(INIT, ERROR,
"iwpriv wlanXX driver %s=[0|1] duration(ms)\n",
CMD_STA_MEASUREMENT_ENABLE);
goto error;
}
if (ucParam) {
if (apcArgv[1]) {
u4Ret = kalkStrtou16(apcArgv[1], 0, &ucMeasureDuration);
if (u4Ret != 0) {
DBGLOG(REQ, ERROR,
"parse ucMeasureDuration error u4Ret=%d\n",
u4Ret);
goto error;
}
} else {
DBGLOG(REQ, ERROR, "ucMeasureDuration is NULL\n");
goto error;
}
}
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo,
prGlueInfo->prP2PInfo[1]->prDevHandler,
&ucRoleIdx) != 0)
goto error;
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter,
ucRoleIdx, &ucBssIdx) != WLAN_STATUS_SUCCESS)
goto error;
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIdx);
if (!prBssInfo) {
DBGLOG(REQ, WARN, "bss is not active\n");
goto error;
}
/* direct probe req to host or FW */
snprintf(pcCommand, i4TotalLen, "%s %s %d",
CMD_SET_CHIP, "N9ProbReq2Host", ucParam);
priv_driver_set_chip_config(prNetDev, pcCommand, i4TotalLen);
if (ucParam) {
DBGLOG(REQ, INFO, "Unassociated STA Measurement start...\n");
if (timerPendingTimer(&prBssInfo->rUnassocStaMeasureTimer)) {
cnmTimerStopTimer(prAdapter,
&prBssInfo->rUnassocStaMeasureTimer);
DBGLOG(REQ, WARN,
"update UnassocStaMeasureTimer\n");
}
cnmTimerInitTimer(prAdapter,
&prBssInfo->rUnassocStaMeasureTimer,
(PFN_MGMT_TIMEOUT_FUNC) aaaUnassocStaMeasureTimeout,
(unsigned long) prBssInfo);
cnmTimerStartTimer(prAdapter,
&prBssInfo->rUnassocStaMeasureTimer, ucMeasureDuration);
DBGLOG(REQ, INFO,
"ucMeasureDuration = %d ms\n", ucMeasureDuration);
} else {
/* reset Rx filter */
nicUpdateBss(prAdapter, prBssInfo->ucBssIndex);
kalMemZero(prBssInfo->arUnAssocSTA,
sizeof(struct T_MULTI_AP_STA_UNASSOC_METRICS)
* SAP_UNASSOC_METRICS_STA_MAX);
DBGLOG(REQ, INFO, "Unassociated STA Measurement stop...\n");
}
return i4BytesWritten;
error:
return -1;
}
static int32_t priv_driver_sta_measurement_info(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct ADAPTER *prAdapter = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
int32_t i4Ret = 0;
uint32_t u4Ret = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
uint8_t aucMacAddr[MAC_ADDR_LEN];
uint8_t ucRoleIdx = 0;
uint8_t ucBssIdx = 0;
uint8_t ucMeasureIdx = 0;
struct BSS_INFO *prBssInfo = NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE) {
i4BytesWritten = -1;
goto exit;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get command */
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD,
"argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
if (i4Argc != 2) {
DBGLOG(REQ, ERROR,
"argc %i is not equal to 2\n", i4Argc);
i4BytesWritten = -1;
goto exit;
}
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char) {
i4BytesWritten = -1;
goto exit;
}
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
i4Ret = wlanHwAddrToBin(this_char, &aucMacAddr[0]);
if (i4Ret < 0) {
DBGLOG(INIT, ERROR,
"iwpriv wlanXX driver %s=STA_MAC [IDX]\n",
CMD_STA_MEASUREMENT_INFO);
i4BytesWritten = -1;
goto exit;
}
u4Ret = kalkStrtou8(apcArgv[1], 0, &ucMeasureIdx);
if (u4Ret != 0) {
DBGLOG(REQ, LOUD,
"parse ucMeasureIdx error u4Ret=%d\n", u4Ret);
i4BytesWritten = -1;
goto exit;
}
if (ucMeasureIdx > 15 || ucMeasureIdx < 0) {
DBGLOG(REQ, ERROR, "ucMeasureIdx number error\n");
i4BytesWritten = -1;
goto exit;
}
/* get Bss Index from ndev */
if (mtk_Netdev_To_RoleIdx(prGlueInfo,
prGlueInfo->prP2PInfo[1]->prDevHandler,
&ucRoleIdx) != 0) {
i4BytesWritten = -1;
goto exit;
}
if (p2pFuncRoleToBssIdx(prGlueInfo->prAdapter,
ucRoleIdx, &ucBssIdx) != WLAN_STATUS_SUCCESS) {
i4BytesWritten = -1;
goto exit;
}
DBGLOG(REQ, INFO, "ucRoleIdx = %d\n", ucRoleIdx);
prBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, ucBssIdx);
if (!prBssInfo) {
DBGLOG(REQ, WARN, "bss is not active\n");
i4BytesWritten = -1;
goto exit;
}
COPY_MAC_ADDR(prBssInfo->arUnAssocSTA[ucMeasureIdx].mStaMac,
aucMacAddr);
DBGLOG(REQ, WARN,
"[SAP_Test] "MACSTR" IDX = %d\n",
MAC2STR(aucMacAddr), ucMeasureIdx);
exit:
return i4BytesWritten;
}
static int32_t priv_driver_set_white_sta(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
IN struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Ret = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
uint8_t *this_char = NULL;
int i = 0;
uint8_t aucMacAddr[MAC_ADDR_LEN];
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE) {
i4Ret = -1;
goto exit;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
/* get command */
DBGLOG(INIT, INFO, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(INIT, INFO,
"argc is %d, apcArgv[0] = %s\n\n",
i4Argc, *apcArgv);
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char) {
i4Ret = -1;
goto exit;
}
this_char++;
i4Ret = sscanf(this_char,
"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
&aucMacAddr[0], &aucMacAddr[1],
&aucMacAddr[2], &aucMacAddr[3],
&aucMacAddr[4], &aucMacAddr[5]);
DBGLOG(INIT, ERROR, "thisChar=%s\n", this_char);
DBGLOG(INIT, ERROR,
"Removing MAC="MACSTR" from BlackList !!\n",
MAC2STR(aucMacAddr));
for (i = 0; i < KAL_P2P_NUM; i++) {
DBGLOG(INIT, ERROR,
"Removing MAC="MACSTR
" from BlackList !! P2P NUM=%d\n",
&aucMacAddr[0], i);
i4Ret |= kalP2PSetBlackList(prGlueInfo,
aucMacAddr, 0, i);
}
exit:
return i4Ret;
}
static int32_t priv_driver_set_Black_sta(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
IN struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Ret = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
uint8_t *this_char = NULL;
int i = 0;
uint8_t aucMacAddr[MAC_ADDR_LEN];
IN struct ADAPTER *prAdapter = NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE) {
i4Ret = -1;
goto exit;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
prAdapter = prGlueInfo->prAdapter;
/* get command */
DBGLOG(INIT, INFO, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(INIT, INFO, "argc is %d, apcArgv[0] = %s\n", i4Argc, *apcArgv);
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char) {
i4Ret = -1;
goto exit;
}
this_char++;
i4Ret = sscanf(this_char,
"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
&aucMacAddr[0], &aucMacAddr[1],
&aucMacAddr[2], &aucMacAddr[3],
&aucMacAddr[4], &aucMacAddr[5]);
DBGLOG(INIT, ERROR, "thisChar=%s\n", this_char);
DBGLOG(INIT, ERROR,
"Adding MAC="MACSTR" to BlackList !!\n",
MAC2STR(aucMacAddr));
for (i = 0; i < KAL_P2P_NUM; i++) {
DBGLOG(INIT, ERROR,
"Adding MAC="MACSTR" to BlackList !! P2P NUM=%d\n",
&aucMacAddr[0], i);
i4Ret |= kalP2PSetBlackList(prGlueInfo, aucMacAddr, 1, i);
}
exit:
return i4Ret;
}
#endif /* CFG_CCN7_SAP_EASYMESH */
#if IS_ENABLED(CFG_AP_80211K_SUPPORT)
static int32_t priv_driver_beacon_report_request(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
int32_t i4Argc = 0;
uint32_t u4Ret = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint8_t i;
uint8_t ucTmpReqElemNum = 0;
struct PARAM_CUSTOM_BCN_REP_REQ_STRUCT *prSetBcnRepReqInfo = NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE) {
i4BytesWritten = -1;
goto exit;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
/* get command */
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD,
"argc is %d, apcArgv[0] = %s\n",
i4Argc, *apcArgv);
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char) {
i4BytesWritten = -1;
goto exit;
}
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
prSetBcnRepReqInfo = (struct PARAM_CUSTOM_BCN_REP_REQ_STRUCT *)
kalMemAlloc(sizeof(
struct PARAM_CUSTOM_BCN_REP_REQ_STRUCT),
VIR_MEM_TYPE);
if (prSetBcnRepReqInfo == NULL) {
DBGLOG(INIT, ERROR, "alloc memory fail\n");
i4BytesWritten = -1;
goto exit;
}
kalMemZero(prSetBcnRepReqInfo,
sizeof(struct PARAM_CUSTOM_BCN_REP_REQ_STRUCT));
#define TEMP_TEMPLATE \
"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx-%u-%u-%u-"\
"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx-%u-%u-%u-%u-%u-%u-%u-%u"\
"-%" INT_TO_STR(PARAM_MAX_LEN_SSID) "s"
i4BytesWritten = sscanf(this_char, TEMP_TEMPLATE,
&prSetBcnRepReqInfo->aucPeerMac[0],
&prSetBcnRepReqInfo->aucPeerMac[1],
&prSetBcnRepReqInfo->aucPeerMac[2],
&prSetBcnRepReqInfo->aucPeerMac[3],
&prSetBcnRepReqInfo->aucPeerMac[4],
&prSetBcnRepReqInfo->aucPeerMac[5],
&prSetBcnRepReqInfo->u2Repetition,
&prSetBcnRepReqInfo->u2MeasureDuration,
&prSetBcnRepReqInfo->ucOperClass,
&prSetBcnRepReqInfo->aucBssid[0],
&prSetBcnRepReqInfo->aucBssid[1],
&prSetBcnRepReqInfo->aucBssid[2],
&prSetBcnRepReqInfo->aucBssid[3],
&prSetBcnRepReqInfo->aucBssid[4],
&prSetBcnRepReqInfo->aucBssid[5],
&prSetBcnRepReqInfo->ucChannel,
&prSetBcnRepReqInfo->u2RandomInterval,
&prSetBcnRepReqInfo->ucMeasurementMode,
&prSetBcnRepReqInfo->ucReportCondition,
&prSetBcnRepReqInfo->ucReportReference,
&prSetBcnRepReqInfo->ucReportingDetail,
&prSetBcnRepReqInfo->ucNumberOfRequest,
&prSetBcnRepReqInfo->ucNumberOfAPChanReport,
&prSetBcnRepReqInfo->aucSsid);
#undef TEMP_TEMPLATE
DBGLOG(REQ, WARN,
"[SAP_Test] aucPeerMac = " MACSTR"\n",
prSetBcnRepReqInfo->aucPeerMac);
DBGLOG(REQ, INFO,
"[SAP_Test] u2Repetition = %u\n",
prSetBcnRepReqInfo->u2Repetition);
DBGLOG(REQ, INFO,
"[SAP_Test] u2MeasureDuration = %u\n",
prSetBcnRepReqInfo->u2MeasureDuration);
DBGLOG(REQ, INFO,
"[SAP_Test] ucOperClass = %u\n",
prSetBcnRepReqInfo->ucOperClass);
DBGLOG(REQ, WARN,
"[SAP_Test] aucBssid = " MACSTR "\n",
prSetBcnRepReqInfo->aucBssid);
DBGLOG(REQ, INFO,
"[SAP_Test] ucChannel = %u\n",
prSetBcnRepReqInfo->ucChannel);
DBGLOG(REQ, INFO,
"[SAP_Test] u2RandomInterval = %u\n",
prSetBcnRepReqInfo->u2RandomInterval);
DBGLOG(REQ, INFO,
"[SAP_Test] ucMeasurementMode = %u\n",
prSetBcnRepReqInfo->ucMeasurementMode);
DBGLOG(REQ, INFO,
"[SAP_Test] ucReportCondition = %u\n",
prSetBcnRepReqInfo->ucReportCondition);
DBGLOG(REQ, INFO,
"[SAP_Test] ucReportReference = %u\n",
prSetBcnRepReqInfo->ucReportReference);
DBGLOG(REQ, INFO,
"[SAP_Test] ucReportingDetail = %u\n",
prSetBcnRepReqInfo->ucReportingDetail);
DBGLOG(REQ, INFO,
"[SAP_Test] ucNumberOfRequest = %u\n",
prSetBcnRepReqInfo->ucNumberOfRequest);
DBGLOG(REQ, INFO,
"[SAP_Test] ucNumberOfAPChanReport = %u\n",
prSetBcnRepReqInfo->ucNumberOfAPChanReport);
DBGLOG(REQ, INFO,
"[SAP_Test] aucSsid = %s\n", prSetBcnRepReqInfo->aucSsid);
if (i4Argc != prSetBcnRepReqInfo->ucNumberOfRequest +
prSetBcnRepReqInfo->ucNumberOfAPChanReport + 1) {
DBGLOG(INIT, ERROR,
"read Request Element and AP Channel List fail !!\n");
i4BytesWritten = -1;
goto exit;
}
ucTmpReqElemNum = prSetBcnRepReqInfo->ucNumberOfRequest;
if (prSetBcnRepReqInfo->ucReportingDetail != 1) {
prSetBcnRepReqInfo->ucNumberOfRequest = 0;
kalMemZero(prSetBcnRepReqInfo->ucRequestElemList,
sizeof(uint8_t) * ELEM_LEN_MAX);
} else {
for (i = 1;
i < prSetBcnRepReqInfo->ucNumberOfRequest + 1;
i++) {
u4Ret = kalkStrtou8(apcArgv[i],
0, &prSetBcnRepReqInfo->ucRequestElemList[i-1]);
if (u4Ret != 0) {
DBGLOG(INIT, ERROR,
"parse Request Element List fail\n");
i4BytesWritten = -1;
goto exit;
}
DBGLOG(REQ, INFO,
"[SAP_Test] ucRequestElemList[%d] = %u\n", i-1,
prSetBcnRepReqInfo->ucRequestElemList[i-1]);
}
}
if (prSetBcnRepReqInfo->ucChannel != 255) {
prSetBcnRepReqInfo->ucNumberOfAPChanReport = 0;
kalMemZero(prSetBcnRepReqInfo->ucChanList,
sizeof(uint8_t) * MAX_CHN_NUM);
} else {
for (i = ucTmpReqElemNum + 1; i < i4Argc; i++) {
u4Ret = kalkStrtou8(apcArgv[i], 0,
&prSetBcnRepReqInfo
->ucChanList[i-(ucTmpReqElemNum + 1)]);
if (u4Ret != 0) {
DBGLOG(INIT, ERROR,
"parse AP Channel List fail\n");
i4BytesWritten = -1;
goto exit;
}
DBGLOG(REQ, INFO,
"[SAP_Test] ucChanList[%d] = %u\n",
i-(ucTmpReqElemNum + 1),
prSetBcnRepReqInfo
->ucChanList[i-(ucTmpReqElemNum + 1)]);
}
}
/*4. Beacon Report */
rStatus = kalIoctl(prGlueInfo,
wlanoidSendBeaconReportRequest,
prSetBcnRepReqInfo,
sizeof(struct PARAM_CUSTOM_BCN_REP_REQ_STRUCT),
FALSE, FALSE, TRUE,
&i4BytesWritten);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\r\n", rStatus);
i4BytesWritten = -1;
goto exit;
}
exit:
if (prSetBcnRepReqInfo)
kalMemFree(prSetBcnRepReqInfo,
VIR_MEM_TYPE,
sizeof(struct PARAM_CUSTOM_BCN_REP_REQ_STRUCT));
return i4BytesWritten;
}
#endif /* CFG_AP_80211K_SUPPORT */
#if IS_ENABLED(CFG_AP_80211V_SUPPORT)
static int32_t priv_driver_BTM_request(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Ret = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = {0};
int8_t *this_char = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
uint8_t i;
struct PARAM_CUSTOM_BTM_REQ_STRUCT *prSetBtmReqInfo = NULL;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE) {
i4Ret = -1;
goto exit;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
/* get command */
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD,
"argc is %d, apcArgv[0] = %s\n\n", i4Argc, *apcArgv);
/* get param */
this_char = kalStrStr(*apcArgv, "=");
if (!this_char) {
i4Ret = -1;
goto exit;
}
this_char++;
DBGLOG(REQ, LOUD, "string = %s\n", this_char);
prSetBtmReqInfo = (struct PARAM_CUSTOM_BTM_REQ_STRUCT *)
kalMemAlloc(sizeof(struct PARAM_CUSTOM_BTM_REQ_STRUCT),
VIR_MEM_TYPE);
if (prSetBtmReqInfo == NULL) {
DBGLOG(INIT, ERROR, "alloc memory fail\n");
i4Ret = -1;
goto exit;
}
kalMemZero(prSetBtmReqInfo, sizeof(struct PARAM_CUSTOM_BTM_REQ_STRUCT));
#define TEMP_TEMPLATE \
"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx-%u-%u-%u-%u-%u-%255s"
i4Ret = sscanf(this_char, TEMP_TEMPLATE,
&prSetBtmReqInfo->aucPeerMac[0],
&prSetBtmReqInfo->aucPeerMac[1],
&prSetBtmReqInfo->aucPeerMac[2],
&prSetBtmReqInfo->aucPeerMac[3],
&prSetBtmReqInfo->aucPeerMac[4],
&prSetBtmReqInfo->aucPeerMac[5],
&prSetBtmReqInfo->ucEssImm,
&prSetBtmReqInfo->u2DisassocTimer,
&prSetBtmReqInfo->ucAbridged,
&prSetBtmReqInfo->ucValidityInterval,
&prSetBtmReqInfo->ucTargetBSSIDCnt,
(char *) &prSetBtmReqInfo->aucSessionUrl);
#undef TEMP_TEMPLATE
DBGLOG(REQ, WARN,
"[SAP_Test] aucPeerMac = " MACSTR "\n",
prSetBtmReqInfo->aucPeerMac);
DBGLOG(REQ, INFO,
"[SAP_Test] u4EssImm = %u\n",
prSetBtmReqInfo->ucEssImm);
DBGLOG(REQ, INFO,
"[SAP_Test] u2DisassocTimer = %u\n",
prSetBtmReqInfo->u2DisassocTimer);
DBGLOG(REQ, INFO,
"[SAP_Test] ucAbridged = %u\n",
prSetBtmReqInfo->ucAbridged);
DBGLOG(REQ, INFO,
"[SAP_Test] ucValidityInterval = %u\n",
prSetBtmReqInfo->ucValidityInterval);
DBGLOG(REQ, INFO,
"[SAP_Test] ucTargetBSSIDCnt = %u\n",
prSetBtmReqInfo->ucTargetBSSIDCnt);
DBGLOG(REQ, INFO,
"[SAP_Test] aucSessionUrl = %s\n",
prSetBtmReqInfo->aucSessionUrl);
if (prSetBtmReqInfo->ucTargetBSSIDCnt < 1
|| prSetBtmReqInfo->ucTargetBSSIDCnt > DEST_BSSID_NUM_MAX) {
DBGLOG(INIT, ERROR,
"Candidate BSSID number invalid, skip send BTM Req\n");
i4Ret = -1;
goto exit;
}
if (i4Argc != prSetBtmReqInfo->ucTargetBSSIDCnt + 1) {
DBGLOG(INIT, ERROR,
"Read Candicate BSSID List Fail, count not match !!!\n");
i4Ret = -1;
goto exit;
}
for (i = 1; i < i4Argc; i++) {
i4Ret = sscanf(apcArgv[i],
"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx-%x-%u-%u-%x-%u",
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].mMac[0],
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].mMac[1],
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].mMac[2],
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].mMac[3],
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].mMac[4],
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].mMac[5],
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].u4BSSIDInfo,
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].ucOperClass,
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].ucChannel,
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].ucPhyType,
&prSetBtmReqInfo->ucTargetBSSIDList[i-1].ucPreference);
if (i4Ret != 11) {
DBGLOG(INIT, ERROR, "parse Target BSSID List fail\n");
i4Ret = -1;
goto exit;
}
DBGLOG(REQ, INFO,
"[SAP_Test] TargetBSSIDList[%u] = " MACSTR"\n",
i-1,
MAC2STR(prSetBtmReqInfo->ucTargetBSSIDList[i-1].mMac));
DBGLOG(REQ, INFO, "[SAP_Test] u4BSSIDInfo = %x\n",
prSetBtmReqInfo->ucTargetBSSIDList[i-1].u4BSSIDInfo);
DBGLOG(REQ, INFO, "[SAP_Test] ucOperClass = %u\n",
prSetBtmReqInfo->ucTargetBSSIDList[i-1].ucOperClass);
DBGLOG(REQ, INFO, "[SAP_Test] ucChannel = %u\n",
prSetBtmReqInfo->ucTargetBSSIDList[i-1].ucChannel);
DBGLOG(REQ, INFO, "[SAP_Test] ucPhyType = %x\n",
prSetBtmReqInfo->ucTargetBSSIDList[i-1].ucPhyType);
DBGLOG(REQ, INFO, "[SAP_Test] ucPreference = %u\n",
prSetBtmReqInfo->ucTargetBSSIDList[i-1].ucPreference);
}
/*5. BTM Request */
rStatus = kalIoctl(prGlueInfo,
wlanoidSendBTMRequest,
prSetBtmReqInfo,
sizeof(struct PARAM_CUSTOM_BTM_REQ_STRUCT),
FALSE, FALSE, TRUE, &i4Ret);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(REQ, ERROR, "ERR: kalIoctl fail (%d)\r\n", rStatus);
i4Ret = -1;
goto exit;
}
exit:
if (prSetBtmReqInfo)
kalMemFree(prSetBtmReqInfo,
VIR_MEM_TYPE,
sizeof(struct PARAM_CUSTOM_BTM_REQ_STRUCT));
return i4Ret;
}
#endif /* CFG_AP_80211V_SUPPORT */
#if CFG_SUPPORT_EXT_PTA_DEBUG_COMMAND
static int priv_driver_ext_pta_config(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
uint32_t rStatus = WLAN_STATUS_SUCCESS;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
struct CMD_EXT_PTA_CONFIG *cmd = NULL;
int32_t i4BytesWritten = 0;
uint32_t u4Val = 0;
int32_t u4Ret = 0;
int32_t i = 0;
uint32_t u4BufLen = 0;
uint32_t u4TotalReqCnt = 0;
DBGLOG(REQ, LOUD, "%s(%s)>\n", __func__, pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (i4Argc < 2)
goto set_ext_pta_invalid;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prGlueInfo)
goto set_ext_pta_invalid;
cmd = (struct CMD_EXT_PTA_CONFIG *)
kalMemAlloc(sizeof(struct CMD_GET_TRAFFIC_REPORT),
VIR_MEM_TYPE);
if (!cmd)
goto set_ext_pta_invalid;
memset(cmd, 0, sizeof(*cmd));
cmd->u2Type = CMD_EXT_PTA_CONFIG_TYPE;
cmd->u2Len = sizeof(*cmd);
if ((strnicmp(apcArgv[1], "SET", strlen("SET")) == 0) &&
(i4Argc >= 4) && !(i4Argc & 1)) {
cmd->u2Type |= CMD_ADV_CONTROL_SET;
/* parsing parameters (data value) */
for (i = 2; i < i4Argc; i += 2) {
/* value field */
u4Ret = kalkStrtou32(apcArgv[i+1], 0, &u4Val);
if (u4Ret) {
i4BytesWritten += snprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nparsing err(%d) %s %s", u4Ret,
apcArgv[i], apcArgv[i+1]);
goto set_ext_pta_invalid;
}
DBGLOG(REQ, LOUD, "arg[%d] %s %s (0x%x)\n", i,
apcArgv[i], apcArgv[i+1], u4Val);
/* data field*/
if (strnicmp(apcArgv[i], "ENABLE",
strlen("ENABLE")) == 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_EXT_PTA;
cmd->u4ExtPtaConfig = u4Val;
} else if (strnicmp(apcArgv[i], "LOTX", strlen("LOTX"))
== 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_LO_TX_TAG;
cmd->u4ZbLoTxTag = u4Val;
} else if (strnicmp(apcArgv[i], "HITX", strlen("HITX"))
== 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_HI_TX_TAG;
cmd->u4ZbHiTxTag = u4Val;
} else if (strnicmp(apcArgv[i], "LORX", strlen("LORX"))
== 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_LO_RX_TAG;
cmd->u4ZbLoRxTag = u4Val;
} else if (strnicmp(apcArgv[i], "HIRX", strlen("HIRX"))
== 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_HI_RX_TAG;
cmd->u4ZbHiRxTag = u4Val;
} else if (strnicmp(apcArgv[i],
"COMM_ACT_ZB_BT_UNSAFE",
strlen("COMM_ACT_ZB_BT_UNSAFE")) == 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_COMM_ACT_ZB_BT_UNSAFE;
cmd->u4CommActZbBtUnsafe = u4Val;
} else if (strnicmp(apcArgv[i], "COMM_ACT_ZB_BT_HSF",
strlen("COMM_ACT_ZB_BT_HSF")) == 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_COMM_ACT_ZB_BT_HSF;
cmd->u4CommActZbBtHsf = u4Val;
} else if (strnicmp(apcArgv[i],
"COMM_ACT_ZB_WF0_UNSAFE",
strlen("COMM_ACT_ZB_WF0_UNSAFE")) == 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_COMM_ACT_ZB_WF0_UNSAFE;
cmd->u4CommActZbWf0Unsafe = u4Val;
} else if (strnicmp(apcArgv[i], "COMM_ACT_ZB_WF0_HSF",
strlen("COMM_ACT_ZB_WF0_HSF")) == 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_COMM_ACT_ZB_WF0_HSF;
cmd->u4CommActZbWf0Hsf = u4Val;
} else if (strnicmp(apcArgv[i],
"COMM_ACT_ZB_WF1_UNSAFE".
strlen("COMM_ACT_ZB_WF1_UNSAFE")) == 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_COMM_ACT_ZB_WF1_UNSAFE;
cmd->u4CommActZbWf1Unsafe = u4Val;
} else if (strnicmp(apcArgv[i], "COMM_ACT_ZB_WF1_HSF",
strlen("COMM_ACT_ZB_WF1_HSF")) == 0) {
cmd->u4ConfigMask |=
CMD_EXT_PTA_CONFIG_COMM_ACT_ZB_WF1_HSF;
cmd->u4CommActZbWf1Hsf = u4Val;
} else {
i4BytesWritten += snprintf(
pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nunknown parameter %s %s",
apcArgv[i], apcArgv[i+1]);
goto set_ext_pta_invalid;
}
}
/* send to FW */
rStatus = wlanSendSetQueryCmd(prGlueInfo->prAdapter,
CMD_ID_ADV_CONTROL,
TRUE,
FALSE,
FALSE,
NULL,
NULL,
sizeof(*cmd),
(uint8_t *) cmd,
NULL,
0);
} else if (strnicmp(apcArgv[1], "GET", strlen("GET")) == 0) {
rStatus = kalIoctl(prGlueInfo,
wlanoidAdvCtrl,
cmd,
sizeof(*cmd),
TRUE,
TRUE,
TRUE,
&u4BufLen);
} else {
goto set_ext_pta_invalid;
}
if ((rStatus != WLAN_STATUS_SUCCESS) &&
(rStatus != WLAN_STATUS_PENDING)) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\ncommand failed %x",
rStatus);
} else if (!(cmd->u2Type & CMD_ADV_CONTROL_SET)) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\nPriority stat:");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n ZB Lo TX : %d",
cmd->u4ZbLoTxTag);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n ZB Hi TX : %d",
cmd->u4ZbHiTxTag);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n ZB Lo RX : %d",
cmd->u4ZbLoRxTag);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n ZB Hi RX : %d",
cmd->u4ZbHiRxTag);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n BT : %d TX(%d) RX(%d)", cmd->u4BtTag & BITS(0, 15),
(cmd->u4BtTag & BITS(24, 31)) >> 24,
(cmd->u4BtTag & BITS(16, 23)) >> 16);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0 : %d TX(%d) RX(%d)",
cmd->u4Wf0Tag & BITS(0, 15),
(cmd->u4Wf0Tag & BITS(24, 31)) >> 24,
(cmd->u4Wf0Tag & BITS(16, 23)) >> 16);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1 : %d TX(%d) RX(%d)",
cmd->u4Wf1Tag & BITS(0, 15),
(cmd->u4Wf1Tag & BITS(24, 31)) >> 24,
(cmd->u4Wf1Tag & BITS(16, 23)) >> 16);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nCommon action stat (1:allow, 0:not allow):");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n Unsafe arb mode");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n ZB_TX vs BT_RX[b0]: %d",
(cmd->u4CommActZbBtUnsafe & BIT(0)) >> 0);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n ZB_RX vs BT_TX[b1]: %d",
(cmd->u4CommActZbBtUnsafe & BIT(1)) >> 1);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n ZB_RX vs BT_RX[b2]: %d",
(cmd->u4CommActZbBtUnsafe & BIT(2)) >> 2);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n ZB_TX vs BT_TX[b3]: %d\n",
(cmd->u4CommActZbBtUnsafe & BIT(3)) >> 3);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0_TX vs ZB_RX[b0]: %d",
(cmd->u4CommActZbWf0Unsafe & BIT(0)) >> 0);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0_RX vs ZB_TX[b1]: %d",
(cmd->u4CommActZbWf0Unsafe & BIT(1)) >> 1);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0_RX vs ZB_RX[b2]: %d",
(cmd->u4CommActZbWf0Unsafe & BIT(2)) >> 2);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0_TX vs ZB_TX[b3]: %d\n",
(cmd->u4CommActZbWf0Unsafe & BIT(3)) >> 3);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1_TX vs ZB_RX[b0]: %d",
(cmd->u4CommActZbWf1Unsafe & BIT(0)) >> 0);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1_RX vs ZB_TX[b1]: %d",
(cmd->u4CommActZbWf1Unsafe & BIT(1)) >> 1);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1_RX vs ZB_RX[b2]: %d",
(cmd->u4CommActZbWf1Unsafe & BIT(2)) >> 2);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1_TX vs ZB_TX[b3]: %d\n",
(cmd->u4CommActZbWf1Unsafe & BIT(3)) >> 3);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n half-safe arb mode");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n ZB_TX vs BT_RX[b0]: %d",
(cmd->u4CommActZbBtHsf & BIT(0)) >> 0);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n ZB_RX vs BT_TX[b1]: %d",
(cmd->u4CommActZbBtHsf & BIT(1)) >> 1);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n ZB_RX vs BT_RX[b2]: %d",
(cmd->u4CommActZbBtHsf & BIT(2)) >> 2);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n ZB_TX vs BT_TX[b3]: %d\n",
(cmd->u4CommActZbBtHsf & BIT(3)) >> 3);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0_TX vs ZB_RX[b0]: %d",
(cmd->u4CommActZbWf0Hsf & BIT(0)) >> 0);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0_RX vs ZB_TX[b1]: %d",
(cmd->u4CommActZbWf0Hsf & BIT(1)) >> 1);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0_RX vs ZB_RX[b2]: %d",
(cmd->u4CommActZbWf0Hsf & BIT(2)) >> 2);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF0_TX vs ZB_TX[b3]: %d\n",
(cmd->u4CommActZbWf0Hsf & BIT(3)) >> 3);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1_TX vs ZB_RX[b0]: %d",
(cmd->u4CommActZbWf1Hsf & BIT(0)) >> 0);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1_RX vs ZB_TX[b1]: %d",
(cmd->u4CommActZbWf1Hsf & BIT(1)) >> 1);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1_RX vs ZB_RX[b2]: %d",
(cmd->u4CommActZbWf1Hsf & BIT(2)) >> 2);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n WF1_TX vs ZB_TX[b3]: %d",
(cmd->u4CommActZbWf1Hsf & BIT(3)) >> 3);
if (cmd->u4ConfigMask & CMD_EXT_PTA_CONFIG_EXT_PTA) {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\nCounter stat:");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n Grant cnt: %d",
cmd->u4ZbGntCnt);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\n Abort cnt: %d",
cmd->u4ZbAbtCnt);
u4TotalReqCnt = cmd->u4ZbLoTxReqCnt +
cmd->u4ZbHiTxReqCnt + cmd->u4ZbLoRxReqCnt +
cmd->u4ZbHiRxReqCnt;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen -
i4BytesWritten, "\n Denied cnt: %d",
u4TotalReqCnt - cmd->u4ZbGntCnt);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Lo tx req cnt: %d", cmd->u4ZbLoTxReqCnt);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Hi tx req cnt: %d", cmd->u4ZbHiTxReqCnt);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Lo rx req cnt: %d", cmd->u4ZbLoRxReqCnt);
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Hi rx req cnt: %d", cmd->u4ZbHiRxReqCnt);
} else {
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\n Counters not enabled");
}
} else
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "\ncommand sent %x",
rStatus);
if (cmd)
kalMemFree(cmd, VIR_MEM_TYPE,
sizeof(struct CMD_EXT_PTA_CONFIG));
return i4BytesWritten;
set_ext_pta_invalid:
if (cmd)
kalMemFree(cmd, VIR_MEM_TYPE,
sizeof(struct CMD_EXT_PTA_CONFIG));
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
"\nformat:ext_pta_config set [enable 1|0][lotx val][hitx val]");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten, "\n\t[lorx val][hirx val]");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n\t[comm_act_zb_bt_unsafe val][comm_act_zb_bt_hsf val]");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n\t[comm_act_zb_wf0_unsafe val][comm_act_zb_wf0_hsf val]");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n\t[comm_act_zb_wf1_unsafe val][comm_act_zb_wf1_hsf val]");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten, "\n [enable val]: enable EXT PTA(1) or not(0)");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten, "\n [lotx val<0~15>]: priority tag for lo tx");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten, "\n [hitx val<0~15>]: priority tag for hi tx");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten, "\n [lorx val<0~15>]: priority tag for lo rx");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten, "\n [hirx val<0~15>]: priority tag for lo tx");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n [comm_act_zb_bt_unsafe val<0~15>]: zb&bt unsafe common action");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n [comm_act_zb_bt_hsf val<0~15>]: zb&bt hsf common action");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n [comm_act_zb_wf0_unsafe val<0~15>]: zb&wf0 unsafe common action");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n [comm_act_zb_wf0_hsf val<0~15>]: zb&wf0 hsf common action");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n [comm_act_zb_wf1_unsafe val<0~15>]: zb&wf1 unsafe common action");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\n [comm_act_zb_wf1_hsf val<0~15>]: zb&wf1 hsf common action");
i4BytesWritten += snprintf(pcCommand + i4BytesWritten, i4TotalLen -
i4BytesWritten,
"\nformat(%d):pta_config get", i4Argc);
return i4BytesWritten;
}
#endif
int32_t priv_driver_cmds(IN struct net_device *prNetDev, IN int8_t *pcCommand,
IN int32_t i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = 0;
if (g_u4HaltFlag) {
DBGLOG(REQ, WARN, "wlan is halt, skip priv_driver_cmds\n");
return -1;
}
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (strnicmp(pcCommand, CMD_RSSI, strlen(CMD_RSSI)) == 0) {
/* i4BytesWritten =
* wl_android_get_rssi(net, command, i4TotalLen);
*/
} else if (strnicmp(pcCommand, CMD_AP_START,
strlen(CMD_AP_START)) == 0) {
i4BytesWritten = priv_driver_set_ap_start(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_LINKSPEED,
strlen(CMD_LINKSPEED)) == 0) {
i4BytesWritten = priv_driver_get_linkspeed(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_PNOSSIDCLR_SET,
strlen(CMD_PNOSSIDCLR_SET)) == 0) {
/* ToDo:: Nothing */
} else if (strnicmp(pcCommand, CMD_PNOSETUP_SET,
strlen(CMD_PNOSETUP_SET)) == 0) {
/* ToDo:: Nothing */
} else if (strnicmp(pcCommand, CMD_PNOENABLE_SET,
strlen(CMD_PNOENABLE_SET)) == 0) {
/* ToDo:: Nothing */
} else if (strnicmp(pcCommand, CMD_SETSUSPENDOPT,
strlen(CMD_SETSUSPENDOPT)) == 0) {
/* i4BytesWritten = wl_android_set_suspendopt(net,
* pcCommand, i4TotalLen);
*/
} else if (strnicmp(pcCommand, CMD_SETSUSPENDMODE,
strlen(CMD_SETSUSPENDMODE)) == 0) {
i4BytesWritten = priv_driver_set_suspend_mode(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SETBAND,
strlen(CMD_SETBAND)) == 0) {
i4BytesWritten = priv_driver_set_band(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GETBAND,
strlen(CMD_GETBAND)) == 0) {
/* i4BytesWritten = wl_android_get_band(net, pcCommand,
* i4TotalLen);
*/
} else if (strnicmp(pcCommand, CMD_SET_TXPOWER,
strlen(CMD_SET_TXPOWER)) == 0) {
i4BytesWritten = priv_driver_set_txpower(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_COUNTRY,
strlen(CMD_COUNTRY)) == 0) {
i4BytesWritten = priv_driver_set_country(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_CSA,
strlen(CMD_CSA)) == 0) {
i4BytesWritten = priv_driver_set_csa(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_COUNTRY,
strlen(CMD_GET_COUNTRY)) == 0) {
i4BytesWritten = priv_driver_get_country(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_CHANNELS,
strlen(CMD_GET_CHANNELS)) == 0) {
i4BytesWritten = priv_driver_get_channels(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_AP_CHANNELS,
strlen(CMD_GET_AP_CHANNELS)) == 0) {
i4BytesWritten = priv_driver_get_ap_channels(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_MIRACAST,
strlen(CMD_MIRACAST)) == 0) {
i4BytesWritten = priv_driver_set_miracast(prNetDev,
pcCommand, i4TotalLen);
}
/* Mediatek private command */
else if (strnicmp(pcCommand, CMD_SET_SW_CTRL,
strlen(CMD_SET_SW_CTRL)) == 0) {
i4BytesWritten = priv_driver_set_sw_ctrl(prNetDev,
pcCommand, i4TotalLen);
#if (CFG_SUPPORT_RA_GEN == 1)
} else if (strnicmp(pcCommand, CMD_SET_FIXED_FALLBACK,
strlen(CMD_SET_FIXED_FALLBACK)) == 0) {
i4BytesWritten = priv_driver_set_fixed_fallback(
prNetDev, pcCommand,
i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_RA_DBG,
strlen(CMD_SET_RA_DBG)) == 0) {
i4BytesWritten = priv_driver_set_ra_debug_proc(prNetDev,
pcCommand, i4TotalLen);
#endif
#if (CFG_SUPPORT_TXPOWER_INFO == 1)
} else if (strnicmp(pcCommand, CMD_GET_TX_POWER_INFO,
strlen(CMD_GET_TX_POWER_INFO)) == 0) {
i4BytesWritten = priv_driver_get_txpower_info(prNetDev,
pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_CSI
} else if (strnicmp(pcCommand,
CMD_SET_CSI, strlen(CMD_SET_CSI)) == 0) {
i4BytesWritten = priv_driver_set_csi(prNetDev,
pcCommand, i4TotalLen);
#endif
} else if (strnicmp(pcCommand, CMD_SET_FIXED_RATE,
strlen(CMD_SET_FIXED_RATE)) == 0) {
i4BytesWritten = priv_driver_set_fixed_rate(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_IPI,
strlen(CMD_GET_IPI)) == 0) {
i4BytesWritten = priv_driver_get_ipi(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_SW_CTRL,
strlen(CMD_GET_SW_CTRL)) == 0) {
i4BytesWritten = priv_driver_get_sw_ctrl(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_MCR,
strlen(CMD_SET_MCR)) == 0) {
i4BytesWritten = priv_driver_set_mcr(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_MCR,
strlen(CMD_GET_MCR)) == 0) {
i4BytesWritten = priv_driver_get_mcr(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_DONGLE_TYPE,
strlen(CMD_GET_DONGLE_TYPE)) == 0) {
i4BytesWritten = priv_driver_get_dongle_type(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_DRV_MCR,
strlen(CMD_SET_DRV_MCR)) == 0) {
i4BytesWritten = priv_driver_set_drv_mcr(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_DRV_MCR,
strlen(CMD_GET_DRV_MCR)) == 0) {
i4BytesWritten = priv_driver_get_drv_mcr(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_TEST_MODE,
strlen(CMD_SET_TEST_MODE)) == 0) {
i4BytesWritten = priv_driver_set_test_mode(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_TEST_CMD,
strlen(CMD_SET_TEST_CMD)) == 0) {
i4BytesWritten = priv_driver_set_test_cmd(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_TEST_RESULT,
strlen(CMD_GET_TEST_RESULT)) == 0) {
i4BytesWritten = priv_driver_get_test_result(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_STA_STAT2,
strlen(CMD_GET_STA_STAT2)) == 0) {
i4BytesWritten = priv_driver_get_sta_stat2(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_STA_STAT,
strlen(CMD_GET_STA_STAT)) == 0) {
i4BytesWritten = priv_driver_get_sta_stat(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_STA_RX_STAT,
strlen(CMD_GET_STA_RX_STAT)) == 0) {
i4BytesWritten = priv_driver_show_rx_stat(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_ACL_POLICY,
strlen(CMD_SET_ACL_POLICY)) == 0) {
i4BytesWritten = priv_driver_set_acl_policy(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_ADD_ACL_ENTRY,
strlen(CMD_ADD_ACL_ENTRY)) == 0) {
i4BytesWritten = priv_driver_add_acl_entry(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_DEL_ACL_ENTRY,
strlen(CMD_DEL_ACL_ENTRY)) == 0) {
i4BytesWritten = priv_driver_del_acl_entry(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SHOW_ACL_ENTRY,
strlen(CMD_SHOW_ACL_ENTRY)) == 0) {
i4BytesWritten = priv_driver_show_acl_entry(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_CLEAR_ACL_ENTRY,
strlen(CMD_CLEAR_ACL_ENTRY)) == 0) {
i4BytesWritten = priv_driver_clear_acl_entry(prNetDev,
pcCommand, i4TotalLen);
}
#if (CFG_SUPPORT_DFS_MASTER == 1)
else if (strnicmp(pcCommand, CMD_SHOW_DFS_STATE,
strlen(CMD_SHOW_DFS_STATE)) == 0) {
i4BytesWritten = priv_driver_show_dfs_state(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SHOW_DFS_RADAR_PARAM,
strlen(CMD_SHOW_DFS_RADAR_PARAM)) == 0) {
i4BytesWritten = priv_driver_show_dfs_radar_param(
prNetDev, pcCommand,
i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SHOW_DFS_HELP,
strlen(CMD_SHOW_DFS_HELP)) == 0) {
i4BytesWritten = priv_driver_show_dfs_help(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SHOW_DFS_CAC_TIME,
strlen(CMD_SHOW_DFS_CAC_TIME)) == 0) {
i4BytesWritten = priv_driver_show_dfs_cac_time(prNetDev,
pcCommand, i4TotalLen);
}
#endif
#if CFG_SUPPORT_CAL_RESULT_BACKUP_TO_HOST
else if (strnicmp(pcCommand,
CMD_SET_CALBACKUP_TEST_DRV_FW,
strlen(CMD_SET_CALBACKUP_TEST_DRV_FW)) == 0)
i4BytesWritten = priv_driver_set_calbackup_test_drv_fw(
prNetDev, pcCommand,
i4TotalLen);
#endif
#if CFG_WOW_SUPPORT
else if (strnicmp(pcCommand, CMD_WOW_START,
strlen(CMD_WOW_START)) == 0)
i4BytesWritten = priv_driver_set_wow(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_WOW_ENABLE,
strlen(CMD_SET_WOW_ENABLE)) == 0)
i4BytesWritten = priv_driver_set_wow_enable(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_WOW_PAR,
strlen(CMD_SET_WOW_PAR)) == 0)
i4BytesWritten = priv_driver_set_wow_par(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_WOW_UDP,
strlen(CMD_SET_WOW_UDP)) == 0)
i4BytesWritten = priv_driver_set_wow_udpport(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_WOW_TCP,
strlen(CMD_SET_WOW_TCP)) == 0)
i4BytesWritten = priv_driver_set_wow_tcpport(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_WOW_PORT,
strlen(CMD_GET_WOW_PORT)) == 0)
i4BytesWritten = priv_driver_get_wow_port(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_WOW_REASON,
strlen(CMD_GET_WOW_PORT)) == 0)
i4BytesWritten = priv_driver_get_wow_reason(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_SUSP_CMD,
strlen(CMD_SET_SUSP_CMD)) == 0)
i4BytesWritten = priv_driver_set_suspend_cmd(prNetDev,
pcCommand, i4TotalLen);
#if CFG_SUPPORT_MDNS_OFFLOAD
else if (strnicmp(pcCommand, CMD_ENABLE_MDNS,
strlen(CMD_ENABLE_MDNS)) == 0)
i4BytesWritten = priv_driver_enable_mdns_offload(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_DISABLE_MDNS,
strlen(CMD_DISABLE_MDNS)) == 0)
i4BytesWritten = priv_driver_disable_mdns_offload(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_MDNS_SET_WAKE_FLAG,
strlen(CMD_MDNS_SET_WAKE_FLAG)) == 0)
i4BytesWritten = priv_driver_set_mdns_wake_flag(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SHOW_MDNS_RECORD,
strlen(CMD_SHOW_MDNS_RECORD)) == 0)
i4BytesWritten = priv_driver_show_mdns_record(
prNetDev, pcCommand, i4TotalLen);
#if TEST_CODE_FOR_MDNS
/* test code for mdns offload */
else if (strnicmp(pcCommand, CMD_SEND_MDNS_RECORD,
strlen(CMD_SEND_MDNS_RECORD)) == 0)
i4BytesWritten = priv_driver_send_mdns_record(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_ADD_MDNS_RECORD,
strlen(CMD_ADD_MDNS_RECORD)) == 0)
i4BytesWritten = priv_driver_add_mdns_record(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, TEST_ADD_MDNS_RECORD,
strlen(TEST_ADD_MDNS_RECORD)) == 0)
i4BytesWritten = priv_driver_test_add_mdns_record(
prNetDev, pcCommand, i4TotalLen);
#endif
#endif
#endif
else if (strnicmp(pcCommand, CMD_SET_ADV_PWS,
strlen(CMD_SET_ADV_PWS)) == 0)
i4BytesWritten = priv_driver_set_adv_pws(
prNetDev, pcCommand,
i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_MDTIM,
strlen(CMD_SET_MDTIM)) == 0)
i4BytesWritten = priv_driver_set_mdtim(
prNetDev, pcCommand,
i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_DSLP_CNT,
strlen(CMD_GET_DSLP_CNT)) == 0)
i4BytesWritten = priv_driver_get_deep_sleep_cnt(
prNetDev, pcCommand,
i4TotalLen);
else if (strnicmp(pcCommand,
CMD_ENFORCE_POWER_MODE,
strlen(CMD_ENFORCE_POWER_MODE)) == 0)
i4BytesWritten =
priv_driver_enforce_power_mode(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_POWER_MODE,
strlen(CMD_GET_POWER_MODE)) == 0)
i4BytesWritten =
priv_driver_get_power_mode(
prNetDev, pcCommand, i4TotalLen);
#ifdef CFG_SUPPORT_ADJUST_MCC_STAY_TIME
else if (strnicmp(pcCommand, CMD_MCCTIME,
strlen(CMD_MCCTIME)) == 0)
i4BytesWritten = priv_driver_set_mcc_time(prNetDev,
pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_ADJUST_MCC_MODE_SET
else if (strnicmp(pcCommand, CMD_SET_MCC_MODE,
strlen(CMD_SET_MCC_MODE)) == 0)
i4BytesWritten = priv_driver_set_mcc_mode(prNetDev,
pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_ANT_DIV
else if (strnicmp(pcCommand, CMD_GET_ANT_DIV,
strlen(CMD_GET_ANT_DIV)) == 0)
i4BytesWritten = priv_driver_ant_diversity_config(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_DETC_ANT_DIV,
strlen(CMD_DETC_ANT_DIV)) == 0)
i4BytesWritten = priv_driver_ant_diversity_config(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SWH_ANT_DIV,
strlen(CMD_SWH_ANT_DIV)) == 0)
i4BytesWritten = priv_driver_ant_diversity_config(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_ANT_DIV,
strlen(CMD_SET_ANT_DIV)) == 0)
i4BytesWritten = priv_driver_ant_diversity_config(
prNetDev, pcCommand, i4TotalLen);
#endif
#if CFG_CHIP_RESET_HANG
else if (strnicmp(pcCommand, CMD_SET_RST_HANG,
strlen(CMD_SET_RST_HANG)) == 0)
i4BytesWritten = priv_driver_set_rst_hang(
prNetDev, pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_QA_TOOL
else if (strnicmp(pcCommand, CMD_GET_RX_STATISTICS,
strlen(CMD_GET_RX_STATISTICS)) == 0)
i4BytesWritten = priv_driver_get_rx_statistics(
prNetDev, pcCommand,
i4TotalLen);
#if CFG_SUPPORT_BUFFER_MODE
else if (strnicmp(pcCommand, CMD_SETBUFMODE,
strlen(CMD_SETBUFMODE)) == 0)
i4BytesWritten = priv_driver_set_efuse_buffer_mode(
prNetDev, pcCommand,
i4TotalLen);
#endif
#endif
#if CFG_SUPPORT_MSP
#if 0
else if (strnicmp(pcCommand, CMD_GET_STAT,
strlen(CMD_GET_STAT)) == 0)
i4BytesWritten = priv_driver_get_stat(prNetDev,
pcCommand, i4TotalLen);
#endif
else if (strnicmp(pcCommand, CMD_GET_STA_STATISTICS,
strlen(CMD_GET_STA_STATISTICS)) == 0)
i4BytesWritten = priv_driver_get_sta_statistics(
prNetDev, pcCommand,
i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_BSS_STATISTICS,
strlen(CMD_GET_BSS_STATISTICS)) == 0)
i4BytesWritten = priv_driver_get_bss_statistics(
prNetDev, pcCommand,
i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_STA_IDX,
strlen(CMD_GET_STA_IDX)) == 0)
i4BytesWritten = priv_driver_get_sta_index(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_STA_INFO,
strlen(CMD_GET_STA_INFO)) == 0)
i4BytesWritten = priv_driver_get_sta_info(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_WTBL_INFO,
strlen(CMD_GET_WTBL_INFO)) == 0)
i4BytesWritten = priv_driver_get_wtbl_info(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_MIB_INFO,
strlen(CMD_GET_MIB_INFO)) == 0)
i4BytesWritten = priv_driver_get_mib_info(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_FW_LOG,
strlen(CMD_SET_FW_LOG)) == 0)
i4BytesWritten = priv_driver_set_fw_log(prNetDev,
pcCommand, i4TotalLen);
#endif
else if (strnicmp(pcCommand, CMD_SET_CFG,
strlen(CMD_SET_CFG)) == 0) {
i4BytesWritten = priv_driver_set_cfg(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_CFG,
strlen(CMD_GET_CFG)) == 0) {
i4BytesWritten = priv_driver_get_cfg(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_COEX_CONTROL,
strlen(CMD_COEX_CONTROL)) == 0) {
i4BytesWritten = priv_driver_coex_ctrl(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_CHIP,
strlen(CMD_SET_CHIP)) == 0) {
i4BytesWritten = priv_driver_set_chip_config(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_CHIP,
strlen(CMD_GET_CHIP)) == 0) {
i4BytesWritten = priv_driver_get_chip_config(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_VERSION,
strlen(CMD_GET_VERSION)) == 0) {
i4BytesWritten = priv_driver_get_version(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_CNM,
strlen(CMD_GET_CNM)) == 0) {
i4BytesWritten = priv_driver_get_cnm(prNetDev,
pcCommand, i4TotalLen);
#if CFG_SUPPORT_DBDC
} else if (strnicmp(pcCommand, CMD_SET_DBDC,
strlen(CMD_SET_DBDC)) == 0) {
i4BytesWritten = priv_driver_set_dbdc(prNetDev,
pcCommand, i4TotalLen);
#endif /*CFG_SUPPORT_DBDC*/
#if CFG_SUPPORT_BATCH_SCAN
} else if (strnicmp(pcCommand, CMD_BATCH_SET,
strlen(CMD_BATCH_SET)) == 0) {
kalIoctl(prGlueInfo, wlanoidSetBatchScanReq,
(void *) pcCommand, i4TotalLen,
FALSE, FALSE, TRUE, &i4BytesWritten);
} else if (strnicmp(pcCommand, CMD_BATCH_GET,
strlen(CMD_BATCH_GET)) == 0) {
/* strcpy(pcCommand, "BATCH SCAN DATA FROM FIRMWARE");
*/
/* i4BytesWritten =
* strlen("BATCH SCAN DATA FROM FIRMWARE")
* + 1;
*/
/* i4BytesWritten = priv_driver_get_linkspeed (prNetDev,
* pcCommand, i4TotalLen);
*/
uint32_t u4BufLen;
int i;
/* int rlen=0; */
for (i = 0; i < CFG_BATCH_MAX_MSCAN; i++) {
/* for get which mscan */
g_rEventBatchResult[i].ucScanCount = i + 1;
kalIoctl(prGlueInfo,
wlanoidQueryBatchScanResult,
(void *)&g_rEventBatchResult[i],
sizeof(struct EVENT_BATCH_RESULT),
TRUE, TRUE, TRUE, &u4BufLen);
}
#if 0
DBGLOG(SCN, INFO,
"Batch Scan Results, scan count = %u\n",
g_rEventBatchResult.ucScanCount);
for (i = 0; i < g_rEventBatchResult.ucScanCount; i++) {
prEntry = &g_rEventBatchResult.arBatchResult[i];
DBGLOG(SCN, INFO, "Entry %u\n", i);
DBGLOG(SCN, INFO, " BSSID = " MACSTR "\n",
MAC2STR(prEntry->aucBssid));
DBGLOG(SCN, INFO, " SSID = %s\n",
prEntry->aucSSID);
DBGLOG(SCN, INFO, " SSID len = %u\n",
prEntry->ucSSIDLen);
DBGLOG(SCN, INFO, " RSSI = %d\n",
prEntry->cRssi);
DBGLOG(SCN, INFO, " Freq = %u\n",
prEntry->ucFreq);
}
#endif
batchConvertResult(&g_rEventBatchResult[0], pcCommand,
i4TotalLen, &i4BytesWritten);
/* Dump for debug */
/* print_hex_dump(KERN_INFO,
* "BATCH", DUMP_PREFIX_ADDRESS, 16, 1, pcCommand,
* i4BytesWritten, TRUE);
*/
} else if (strnicmp(pcCommand, CMD_BATCH_STOP,
strlen(CMD_BATCH_STOP)) == 0) {
kalIoctl(prGlueInfo, wlanoidSetBatchScanReq,
(void *) pcCommand, i4TotalLen,
FALSE, FALSE, TRUE, &i4BytesWritten);
#endif
}
#if CFG_SUPPORT_SNIFFER
else if (strnicmp(pcCommand, CMD_SETMONITOR,
strlen(CMD_SETMONITOR)) == 0)
i4BytesWritten = priv_driver_set_monitor(prNetDev,
pcCommand, i4TotalLen);
#endif
else if (strnicmp(pcCommand, CMD_GET_QUE_INFO,
strlen(CMD_GET_QUE_INFO)) == 0)
i4BytesWritten = priv_driver_get_que_info(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_MEM_INFO,
strlen(CMD_GET_MEM_INFO)) == 0)
i4BytesWritten = priv_driver_get_mem_info(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_HIF_INFO,
strlen(CMD_GET_HIF_INFO)) == 0)
i4BytesWritten = priv_driver_get_hif_info(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_TP_INFO,
strlen(CMD_GET_TP_INFO)) == 0)
i4BytesWritten = priv_driver_get_tp_info(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_CNM,
strlen(CMD_GET_CNM)) == 0)
i4BytesWritten = priv_driver_get_cnm(prNetDev,
pcCommand, i4TotalLen);
#if CFG_AUTO_CHANNEL_SEL_SUPPORT
else if (strnicmp(pcCommand, CMD_GET_CH_RANK_LIST,
strlen(CMD_GET_CH_RANK_LIST)) == 0)
i4BytesWritten = priv_driver_get_ch_rank_list(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_CH_DIRTINESS,
strlen(CMD_GET_CH_DIRTINESS)) == 0)
i4BytesWritten = priv_driver_get_ch_dirtiness(prNetDev,
pcCommand, i4TotalLen);
#endif
else if (strnicmp(pcCommand, CMD_EFUSE,
sizeof(CMD_EFUSE)-1) == 0)
i4BytesWritten = priv_driver_efuse_ops(prNetDev,
pcCommand, i4TotalLen);
#if defined(_HIF_SDIO) && (MTK_WCN_HIF_SDIO == 0)
else if (strnicmp(pcCommand, CMD_CCCR,
strlen(CMD_CCCR)) == 0)
i4BytesWritten = priv_driver_cccr_ops(prNetDev,
pcCommand, i4TotalLen);
#endif /* _HIF_SDIO && (MTK_WCN_HIF_SDIO == 0) */
#if CFG_SUPPORT_ADVANCE_CONTROL
else if (strnicmp(pcCommand, CMD_SET_NOISE,
strlen(CMD_SET_NOISE)) == 0)
i4BytesWritten = priv_driver_set_noise(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_NOISE,
strlen(CMD_GET_NOISE)) == 0)
i4BytesWritten = priv_driver_get_noise(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_TRAFFIC_REPORT,
strlen(CMD_TRAFFIC_REPORT)) == 0)
i4BytesWritten = priv_driver_get_traffic_report(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_POP,
strlen(CMD_SET_POP)) == 0)
i4BytesWritten = priv_driver_set_pop(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_POP,
strlen(CMD_GET_POP)) == 0)
i4BytesWritten = priv_driver_get_pop(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_ED,
strlen(CMD_SET_ED)) == 0)
i4BytesWritten = priv_driver_set_ed(prNetDev, pcCommand,
i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_ED,
strlen(CMD_GET_ED)) == 0)
i4BytesWritten = priv_driver_get_ed(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_PD,
strlen(CMD_SET_PD)) == 0)
i4BytesWritten = priv_driver_set_pd(prNetDev, pcCommand,
i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_PD,
strlen(CMD_GET_PD)) == 0)
i4BytesWritten = priv_driver_get_pd(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_MAX_RFGAIN,
strlen(CMD_SET_MAX_RFGAIN)) == 0)
i4BytesWritten = priv_driver_set_maxrfgain(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_MAX_RFGAIN,
strlen(CMD_GET_MAX_RFGAIN)) == 0)
i4BytesWritten = priv_driver_get_maxrfgain(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_NOISE_HISTOGRAM,
strlen(CMD_NOISE_HISTOGRAM)) == 0)
i4BytesWritten = priv_driver_noise_histogram(prNetDev,
pcCommand, i4TotalLen);
#if CFG_RX_SINGLE_CHAIN_SUPPORT
else if (strnicmp(pcCommand, CMD_SET_RXC,
strlen(CMD_SET_RXC)) == 0)
i4BytesWritten = priv_driver_set_rxchain(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_RXC,
strlen(CMD_GET_RXC)) == 0)
i4BytesWritten = priv_driver_get_rxchain(prNetDev,
pcCommand, i4TotalLen);
#endif
else if (strnicmp(pcCommand, CMD_SET_ADM_CTRL,
strlen(CMD_SET_ADM_CTRL)) == 0)
i4BytesWritten = priv_driver_set_adm_ctrl(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_ADM_CTRL,
strlen(CMD_GET_ADM_CTRL)) == 0)
i4BytesWritten = priv_driver_get_adm_ctrl(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_BCN_TH,
strlen(CMD_SET_BCN_TH)) == 0)
i4BytesWritten = priv_driver_set_bcn_th(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_BCN_TH,
strlen(CMD_GET_BCN_TH)) == 0)
i4BytesWritten = priv_driver_get_bcn_th(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_BCNTIMEOUT_NUM,
strlen(CMD_GET_BCNTIMEOUT_NUM)) == 0)
i4BytesWritten = priv_driver_get_bcntimeout_cnt(
prNetDev, pcCommand, i4TotalLen);
#if CFG_ENABLE_1RPD_MMPS_CTRL
else if (strnicmp(pcCommand, CMD_SET_1RPD,
strlen(CMD_SET_1RPD)) == 0)
i4BytesWritten = priv_driver_set_1rpd(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_1RPD,
strlen(CMD_GET_1RPD)) == 0)
i4BytesWritten = priv_driver_get_1rpd(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_MMPS,
strlen(CMD_SET_MMPS)) == 0)
i4BytesWritten = priv_driver_set_mmps(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_MMPS,
strlen(CMD_GET_MMPS)) == 0)
i4BytesWritten = priv_driver_get_mmps(prNetDev,
pcCommand, i4TotalLen);
#endif /* CFG_ENABLE_1RPD_MMPS_CTRL */
#if CFG_ENABLE_DEWEIGHTING_CTRL
else if (strnicmp(pcCommand, CMD_SET_DEWEIGHTING_TH,
strlen(CMD_SET_DEWEIGHTING_TH)) == 0)
i4BytesWritten = priv_driver_set_deweighting_th(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_DEWEIGHTING_TH,
strlen(CMD_GET_DEWEIGHTING_TH)) == 0)
i4BytesWritten = priv_driver_get_deweighting_th(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_DEWEIGHTING_NOISE,
strlen(CMD_GET_DEWEIGHTING_NOISE)) == 0)
i4BytesWritten = priv_driver_get_deweighting_noise(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_GET_DEWEIGHTING_WEIGHT,
strlen(CMD_GET_DEWEIGHTING_WEIGHT))
== 0)
i4BytesWritten = priv_driver_get_deweighting_weight(
prNetDev, pcCommand, i4TotalLen);
#endif /* CFG_ENABLE_DEWEIGHTING_CTRL */
#endif /* CFG_SUPPORT_ADVANCE_CONTROL */
#if CFG_SUPPORT_GET_MCS_INFO
else if (strnicmp(pcCommand, CMD_GET_MCS_INFO,
strlen(CMD_GET_MCS_INFO)) == 0)
i4BytesWritten = priv_driver_get_mcs_info(prNetDev,
pcCommand, i4TotalLen);
#endif
#if IS_ENABLED(CFG_CCN7_SAP_EASYMESH)
else if (strnicmp(pcCommand, CMD_BSS_STATUS_REPORT,
strlen(CMD_BSS_STATUS_REPORT)) == 0)
i4BytesWritten = priv_driver_bss_status_report(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_BSS_REPORT_INFO,
strlen(CMD_BSS_REPORT_INFO)) == 0)
i4BytesWritten = priv_driver_bss_report_info(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_STA_REPORT_INFO,
strlen(CMD_STA_REPORT_INFO)) == 0)
i4BytesWritten = priv_driver_sta_report_info(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_STA_MEASUREMENT_ENABLE,
strlen(CMD_STA_MEASUREMENT_ENABLE)) == 0)
i4BytesWritten = priv_driver_sta_measurement_control(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_STA_MEASUREMENT_INFO,
strlen(CMD_STA_MEASUREMENT_INFO)) == 0)
i4BytesWritten = priv_driver_sta_measurement_info(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_WHITELIST_STA,
strlen(CMD_WHITELIST_STA)) == 0)
i4BytesWritten = priv_driver_set_white_sta(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_BLACKLIST_STA,
strlen(CMD_BLACKLIST_STA)) == 0)
i4BytesWritten = priv_driver_set_Black_sta(
prNetDev, pcCommand, i4TotalLen);
#endif /* CFG_CCN7_SAP_EASYMESH */
#if IS_ENABLED(CFG_AP_80211K_SUPPORT)
else if (strnicmp(pcCommand, CMD_STA_BEACON_REQUEST,
strlen(CMD_STA_BEACON_REQUEST)) == 0)
i4BytesWritten = priv_driver_beacon_report_request(
prNetDev, pcCommand, i4TotalLen);
#endif /* CFG_AP_80211K_SUPPORT */
#if IS_ENABLED(CFG_AP_80211V_SUPPORT)
else if (strnicmp(pcCommand, CMD_STA_BTM_REQUEST,
strlen(CMD_STA_BTM_REQUEST)) == 0)
i4BytesWritten = priv_driver_BTM_request(
prNetDev, pcCommand, i4TotalLen);
#endif /* CFG_AP_80211V_SUPPORT */
#if CFG_ENABLE_WIFI_DIRECT
else if (strnicmp(pcCommand, CMD_P2P_SET_PS,
strlen(CMD_P2P_SET_PS)) == 0)
i4BytesWritten = priv_driver_set_p2p_ps(prNetDev,
pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_P2P_SET_NOA,
strlen(CMD_P2P_SET_NOA)) == 0)
i4BytesWritten = priv_driver_set_p2p_noa(prNetDev,
pcCommand, i4TotalLen);
#endif /* CFG_ENABLE_WIFI_DIRECT */
else if (strnicmp(pcCommand, CMD_SET_DRV_SER,
strlen(CMD_SET_DRV_SER)) == 0)
i4BytesWritten = priv_driver_set_drv_ser(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_SW_AMSDU_NUM,
strlen(CMD_SET_SW_AMSDU_NUM)) == 0)
i4BytesWritten = priv_driver_set_amsdu_num(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_SET_SW_AMSDU_SIZE,
strlen(CMD_SET_SW_AMSDU_SIZE)) == 0)
i4BytesWritten = priv_driver_set_amsdu_size(
prNetDev, pcCommand, i4TotalLen);
else if (strnicmp(pcCommand, CMD_DBG_SHOW_TR_INFO,
strlen(CMD_DBG_SHOW_TR_INFO)) == 0) {
kalIoctl(prGlueInfo,
wlanoidShowPdmaInfo,
(void *) pcCommand, i4TotalLen,
FALSE, FALSE, TRUE, &i4BytesWritten);
} else if (strnicmp(pcCommand, CMD_DBG_SHOW_PLE_INFO,
strlen(CMD_DBG_SHOW_PLE_INFO)) == 0) {
kalIoctl(prGlueInfo,
wlanoidShowPleInfo,
(void *) pcCommand, i4TotalLen,
FALSE, FALSE, TRUE, &i4BytesWritten);
} else if (strnicmp(pcCommand, CMD_DBG_SHOW_PSE_INFO,
strlen(CMD_DBG_SHOW_PSE_INFO)) == 0) {
kalIoctl(prGlueInfo,
wlanoidShowPseInfo,
(void *) pcCommand, i4TotalLen,
FALSE, FALSE, TRUE, &i4BytesWritten);
} else if (strnicmp(pcCommand, CMD_DBG_SHOW_CSR_INFO,
strlen(CMD_DBG_SHOW_CSR_INFO)) == 0) {
kalIoctl(prGlueInfo,
wlanoidShowCsrInfo,
(void *) pcCommand, i4TotalLen,
FALSE, FALSE, TRUE, &i4BytesWritten);
} else if (strnicmp(pcCommand, CMD_DBG_SHOW_DMASCH_INFO,
strlen(CMD_DBG_SHOW_DMASCH_INFO)) == 0) {
kalIoctl(prGlueInfo,
wlanoidShowDmaschInfo,
(void *) pcCommand, i4TotalLen,
FALSE, FALSE, TRUE, &i4BytesWritten);
} else if (!strnicmp(pcCommand, CMD_DUMP_TS,
strlen(CMD_DUMP_TS)) ||
!strnicmp(pcCommand, CMD_ADD_TS,
strlen(CMD_ADD_TS)) ||
!strnicmp(pcCommand, CMD_DEL_TS,
strlen(CMD_DEL_TS))) {
kalIoctl(prGlueInfo, wlanoidTspecOperation,
(void *)pcCommand, i4TotalLen, FALSE, FALSE,
FALSE, &i4BytesWritten);
} else if (kalStrStr(pcCommand, "-IT ")) {
kalIoctl(prGlueInfo, wlanoidPktProcessIT,
(void *)pcCommand, i4TotalLen, FALSE, FALSE,
FALSE, &i4BytesWritten);
} else if (!strnicmp(pcCommand, CMD_FW_EVENT, 9)) {
kalIoctl(prGlueInfo, wlanoidFwEventIT,
(void *)(pcCommand + 9), i4TotalLen - 9, FALSE,
FALSE, FALSE, &i4BytesWritten);
} else if (!strnicmp(pcCommand, CMD_DUMP_UAPSD,
strlen(CMD_DUMP_UAPSD))) {
kalIoctl(prGlueInfo, wlanoidDumpUapsdSetting,
(void *)pcCommand, i4TotalLen, FALSE, FALSE,
FALSE, &i4BytesWritten);
#if CFG_SUPPORT_802_11K
} else if (!strnicmp(pcCommand, CMD_NEIGHBOR_REQ,
strlen(CMD_NEIGHBOR_REQ))) {
i4BytesWritten = priv_driver_neighbor_request(
prNetDev, pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_802_11V_BSS_TRANSITION_MGT
} else if (!strnicmp(pcCommand, CMD_BTM_QUERY,
strlen(CMD_BTM_QUERY))) {
i4BytesWritten = priv_driver_bss_transition_query(
prNetDev, pcCommand, i4TotalLen);
#endif
} else if (strnicmp(pcCommand, CMD_GET_BSS_TABLE,
strlen(CMD_GET_BSS_TABLE)) == 0) {
i4BytesWritten = priv_driver_get_bsstable(prNetDev,
pcCommand, i4TotalLen);
#ifdef CFG_SUPPORT_TIME_MEASURE
} else if (strnicmp(pcCommand, CMD_START_FTM_NON_BLOCK,
strlen(CMD_START_FTM_NON_BLOCK)) == 0) {
i4BytesWritten = priv_driver_start_ftm(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_START_FTM,
strlen(CMD_START_FTM)) == 0) {
i4BytesWritten = priv_driver_start_ftm(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_TMR_DISTANCE,
strlen(CMD_GET_TMR_DISTANCE)) == 0) {
i4BytesWritten = priv_driver_get_ftm(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_TMR_AUDIOSYNC,
strlen(CMD_GET_TMR_AUDIOSYNC)) == 0) {
i4BytesWritten = priv_driver_get_ftm(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_ENABLE_TMR,
strlen(CMD_ENABLE_TMR)) == 0) {
i4BytesWritten = priv_driver_enable_tmr(prNetDev,
pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_WAC
} else if (strnicmp(pcCommand, CMD_SET_WAC_IE_ENABLE,
strlen(CMD_SET_WAC_IE_ENABLE)) == 0) {
i4BytesWritten = priv_driver_set_wac_ie_enable(prNetDev,
pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_SCHED_SCAN
} else if (strnicmp(pcCommand, CMD_SET_PNO_INTERVAL,
strlen(CMD_SET_PNO_INTERVAL)) == 0) {
i4BytesWritten = priv_driver_set_pno_interval(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_PNO_INTERVAL,
strlen(CMD_GET_PNO_INTERVAL)) == 0) {
i4BytesWritten = priv_driver_get_pno_interval(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_DWELL_TIME,
strlen(CMD_SET_DWELL_TIME)) == 0) {
i4BytesWritten = priv_driver_set_dwell_time(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_DWELL_TIME,
strlen(CMD_GET_DWELL_TIME)) == 0) {
i4BytesWritten = priv_driver_get_dwell_time(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand,
CMD_SET_PNO_PASSIVE_DWELL,
strlen(CMD_SET_PNO_PASSIVE_DWELL)) == 0) {
i4BytesWritten =
priv_driver_set_pno_passive_dwell(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand,
CMD_GET_PNO_PASSIVE_DWELL,
strlen(CMD_GET_PNO_PASSIVE_DWELL)) == 0) {
i4BytesWritten =
priv_driver_get_pno_passive_dwell(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_SET_PNO_WAKE_RSSI,
strlen(CMD_SET_PNO_WAKE_RSSI)) == 0) {
i4BytesWritten = priv_driver_set_pno_wake_rssi(prNetDev,
pcCommand, i4TotalLen);
} else if (strnicmp(pcCommand, CMD_GET_PNO_WAKE_RSSI,
strlen(CMD_GET_PNO_WAKE_RSSI)) == 0) {
i4BytesWritten = priv_driver_get_pno_wake_rssi(prNetDev,
pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_ADVANCE_CONTROL
} else if (strnicmp(pcCommand, CMD_GET_SNR,
strlen(CMD_GET_SNR)) == 0) {
i4BytesWritten = priv_driver_get_snr(prGlueInfo,
pcCommand, i4TotalLen);
#endif
#if CFG_SUPPORT_EXT_PTA_DEBUG_COMMAND
} else if (strnicmp(pcCommand, CMD_EXT_PTA_CFG,
strlen(CMD_EXT_PTA_CFG)) == 0) {
i4BytesWritten = priv_driver_ext_pta_config(prNetDev,
pcCommand, i4TotalLen);
#endif
#if (CFG_SUPPORT_TSF_SYNC == 1)
} else if (strnicmp(pcCommand, CMD_GET_TSF_VALUE,
strlen(CMD_GET_TSF_VALUE)) == 0) {
i4BytesWritten = priv_driver_get_tsf_value(prNetDev,
pcCommand, i4TotalLen);
#endif
} else
i4BytesWritten = priv_cmd_not_support
(prNetDev, pcCommand, i4TotalLen);
if (i4BytesWritten >= 0) {
if ((i4BytesWritten == 0) && (i4TotalLen > 0)) {
/* reset the command buffer */
pcCommand[0] = '\0';
}
if (i4BytesWritten >= i4TotalLen) {
DBGLOG(REQ, INFO,
"%s: i4BytesWritten %d > i4TotalLen < %d\n",
__func__, i4BytesWritten, i4TotalLen);
i4BytesWritten = i4TotalLen;
} else {
pcCommand[i4BytesWritten] = '\0';
i4BytesWritten++;
}
}
return i4BytesWritten;
} /* priv_driver_cmds */
#ifdef CFG_ANDROID_AOSP_PRIV_CMD
int android_private_support_driver_cmd(IN struct net_device *prNetDev,
IN OUT struct ifreq *prReq, IN int i4Cmd)
{
struct android_wifi_priv_cmd priv_cmd;
char *command = NULL;
int ret = 0, bytes_written = 0;
if (!prReq->ifr_data)
return -EINVAL;
if (copy_from_user(&priv_cmd, prReq->ifr_data, sizeof(priv_cmd)))
return -EFAULT;
/* total_len is controlled by the user. need check length */
if (priv_cmd.total_len <= 0)
return -EINVAL;
command = kzalloc(priv_cmd.total_len, GFP_KERNEL);
if (!command) {
DBGLOG(REQ, WARN, "%s, alloc mem failed\n", __func__);
return -ENOMEM;
}
if (copy_from_user(command, priv_cmd.buf, priv_cmd.total_len)) {
ret = -EFAULT;
goto FREE;
}
bytes_written = priv_driver_cmds(prNetDev, command, priv_cmd.total_len);
if (bytes_written == -EOPNOTSUPP) {
/* Report positive status */
bytes_written = kalSnprintf(command, priv_cmd.total_len,
"%s", "NotSupport");
}
if (bytes_written >= 0) {
/* priv_cmd in but no response */
if ((bytes_written == 0) && (priv_cmd.total_len > 0))
command[0] = '\0';
if (bytes_written >= priv_cmd.total_len)
bytes_written = priv_cmd.total_len;
else
bytes_written++;
priv_cmd.used_len = bytes_written;
if (copy_to_user(priv_cmd.buf, command, bytes_written))
ret = -EFAULT;
} else
ret = bytes_written;
FREE:
kfree(command);
return ret;
}
#endif /* CFG_ANDROID_AOSP_PRIV_CMD */
int priv_support_driver_cmd(IN struct net_device *prNetDev,
IN OUT struct ifreq *prReq, IN int i4Cmd)
{
struct GLUE_INFO *prGlueInfo = NULL;
int ret = 0;
char *pcCommand = NULL;
struct priv_driver_cmd_s *priv_cmd = NULL;
int i4BytesWritten = 0;
int i4TotalLen = 0;
if (!prReq->ifr_data) {
ret = -EINVAL;
goto exit;
}
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prGlueInfo) {
DBGLOG(REQ, WARN, "No glue info\n");
ret = -EFAULT;
goto exit;
}
if (prGlueInfo->u4ReadyFlag == 0) {
ret = -EINVAL;
goto exit;
}
priv_cmd = kzalloc(sizeof(struct priv_driver_cmd_s), GFP_KERNEL);
if (!priv_cmd) {
DBGLOG(REQ, WARN, "%s, alloc mem failed\n", __func__);
return -ENOMEM;
}
if (copy_from_user(priv_cmd, prReq->ifr_data,
sizeof(struct priv_driver_cmd_s))) {
DBGLOG(REQ, INFO, "%s: copy_from_user fail\n", __func__);
ret = -EFAULT;
goto exit;
}
i4TotalLen = priv_cmd->total_len;
if (i4TotalLen <= 0 || i4TotalLen > PRIV_CMD_SIZE) {
ret = -EINVAL;
DBGLOG(REQ, INFO, "%s: i4TotalLen invalid\n", __func__);
goto exit;
}
priv_cmd->buf[PRIV_CMD_SIZE - 1] = '\0';
pcCommand = priv_cmd->buf;
DBGLOG(REQ, INFO, "%s: driver cmd \"%s\" on %s\n", __func__, pcCommand,
prReq->ifr_name);
i4BytesWritten = priv_driver_cmds(prNetDev, pcCommand, i4TotalLen);
if (i4BytesWritten < 0) {
DBGLOG(REQ, INFO, "%s: command %s Written is %d\n", __func__,
pcCommand, i4BytesWritten);
if (i4TotalLen >= 3) {
snprintf(pcCommand, 3, "OK");
i4BytesWritten = strlen("OK");
}
}
exit:
kfree(priv_cmd);
return ret;
} /* priv_support_driver_cmd */
#if (CFG_SUPPORT_MDNS_OFFLOAD && CFG_SUPPORT_MDNS_OFFLOAD_TV)
int priv_support_mdns_offload(IN struct net_device *prNetDev,
IN OUT struct ifreq *prReq, IN int i4Cmd)
{
struct GLUE_INFO *prGlueInfo = NULL;
struct MDNS_INFO_UPLAYER_T *prMdnsUplayerInfo = NULL;
int ret = 0;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
if (!prReq->ifr_data) {
DBGLOG(REQ, ERROR, "%s: prReq->ifr_data is NULL.\n", __func__);
return -EINVAL;
}
prMdnsUplayerInfo = kzalloc(sizeof(struct MDNS_INFO_UPLAYER_T),
GFP_KERNEL);
if (!prMdnsUplayerInfo) {
DBGLOG(REQ, WARN, "%s, alloc mem failed\n", __func__);
return -ENOMEM;
}
if (copy_from_user(prMdnsUplayerInfo,
prReq->ifr_data, sizeof(struct MDNS_INFO_UPLAYER_T))) {
DBGLOG(REQ, ERROR, "%s: copy_from_user fail\n", __func__);
ret = -EFAULT;
goto exit;
}
kalMdnsProcess(prGlueInfo, prMdnsUplayerInfo);
exit:
kfree(prMdnsUplayerInfo);
return ret;
}
#endif
#if CFG_SUPPORT_NCHO
/* NCHO related command definition. Setting by supplicant */
#define CMD_NCHO_ROAM_TRIGGER_GET "GETROAMTRIGGER"
#define CMD_NCHO_ROAM_TRIGGER_SET "SETROAMTRIGGER"
#define CMD_NCHO_ROAM_DELTA_GET "GETROAMDELTA"
#define CMD_NCHO_ROAM_DELTA_SET "SETROAMDELTA"
#define CMD_NCHO_ROAM_SCAN_PERIOD_GET "GETROAMSCANPERIOD"
#define CMD_NCHO_ROAM_SCAN_PERIOD_SET "SETROAMSCANPERIOD"
#define CMD_NCHO_ROAM_SCAN_CHANNELS_GET "GETROAMSCANCHANNELS"
#define CMD_NCHO_ROAM_SCAN_CHANNELS_SET "SETROAMSCANCHANNELS"
#define CMD_NCHO_ROAM_SCAN_CONTROL_GET "GETROAMSCANCONTROL"
#define CMD_NCHO_ROAM_SCAN_CONTROL_SET "SETROAMSCANCONTROL"
#define CMD_NCHO_SCAN_CHANNEL_TIME_GET "GETSCANCHANNELTIME"
#define CMD_NCHO_SCAN_CHANNEL_TIME_SET "SETSCANCHANNELTIME"
#define CMD_NCHO_SCAN_HOME_TIME_GET "GETSCANHOMETIME"
#define CMD_NCHO_SCAN_HOME_TIME_SET "SETSCANHOMETIME"
#define CMD_NCHO_SCAN_HOME_AWAY_TIME_GET "GETSCANHOMEAWAYTIME"
#define CMD_NCHO_SCAN_HOME_AWAY_TIME_SET "SETSCANHOMEAWAYTIME"
#define CMD_NCHO_SCAN_NPROBES_GET "GETSCANNPROBES"
#define CMD_NCHO_SCAN_NPROBES_SET "SETSCANNPROBES"
#define CMD_NCHO_REASSOC_SEND "REASSOC"
#define CMD_NCHO_ACTION_FRAME_SEND "SENDACTIONFRAME"
#define CMD_NCHO_WES_MODE_GET "GETWESMODE"
#define CMD_NCHO_WES_MODE_SET "SETWESMODE"
#define CMD_NCHO_BAND_GET "GETBAND"
#define CMD_NCHO_BAND_SET "SETBAND"
#define CMD_NCHO_DFS_SCAN_MODE_GET "GETDFSSCANMODE"
#define CMD_NCHO_DFS_SCAN_MODE_SET "SETDFSSCANMODE"
#define CMD_NCHO_DFS_SCAN_MODE_GET "GETDFSSCANMODE"
#define CMD_NCHO_DFS_SCAN_MODE_SET "SETDFSSCANMODE"
#define CMD_NCHO_ENABLE "NCHOENABLE"
#define CMD_NCHO_DISABLE "NCHODISABLE"
static int
priv_driver_enable_ncho(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen);
static int
priv_driver_disable_ncho(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen);
int
priv_driver_set_ncho_roam_trigger(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Param = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t u4SetInfoLen = 0;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtos32(apcArgv[1], 0, &i4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set roam trigger cmd %d\n", i4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoRoamTrigger,
&i4Param, sizeof(int32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO set roam trigger fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE,
"NCHO set roam trigger successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int
priv_driver_get_ncho_roam_trigger(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
int32_t i4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct CMD_HEADER cmdV1Header;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoRoamTrigger,
&cmdV1Header, sizeof(cmdV1Header),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoRoamTrigger fail 0x%x\n", rStatus);
return i4BytesWritten;
}
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %s\n", cmdV1Header.buffer);
i4BytesWritten = kalkStrtou32(cmdV1Header.buffer, 0, &i4Param);
if (i4BytesWritten) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d!\n",
i4BytesWritten);
i4BytesWritten = -1;
} else {
i4Param = RCPI_TO_dBm(i4Param); /* RCPI to DB */
DBGLOG(INIT, TRACE, "NCHO query RoamTrigger is %d\n", i4Param);
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%d", i4Param);
}
return i4BytesWritten;
}
int priv_driver_set_ncho_roam_delta(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtos32(apcArgv[1], 0, &i4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR,
"NCHO parse u4Param error %d\n", i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set roam delta cmd %d\n", i4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoRoamDelta,
&i4Param, sizeof(int32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO set roam delta fail 0x%x\n", rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE, "NCHO set roam delta successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_roam_delta(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
int32_t i4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoRoamDelta,
&i4Param, sizeof(int32_t),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoRoamDelta fail 0x%x\n", rStatus);
} else {
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %d\n", i4Param);
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%d", i4Param);
}
return i4BytesWritten;
}
int priv_driver_set_ncho_roam_scn_period(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set roam period cmd %d\n", u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoRoamScnPeriod,
&u4Param, sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO set roam period fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE, "NCHO set roam period successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_roam_scn_period(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoRoamScnPeriod,
&u4Param, sizeof(uint32_t),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoRoamScnPeriod fail 0x%x\n",
rStatus);
} else {
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %d\n", u4Param);
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u", u4Param);
}
return i4BytesWritten;
}
int priv_driver_set_ncho_roam_scn_chnl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4ChnlInfo = 0;
uint8_t i = 1;
uint8_t t = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct _CFG_NCHO_SCAN_CHNL_T rRoamScnChnl;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, cmd is %s\n", i4Argc,
apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4ChnlInfo);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
rRoamScnChnl.ucChannelListNum = u4ChnlInfo;
DBGLOG(REQ, ERROR, "NCHO ChannelListNum is %d\n", u4ChnlInfo);
if (i4Argc != u4ChnlInfo + 2) {
DBGLOG(REQ, ERROR, "NCHO param mismatch %d\n",
u4ChnlInfo);
return -1;
}
for (i = 2; i < i4Argc; i++) {
i4Ret = kalkStrtou32(apcArgv[i], 0, &u4ChnlInfo);
if (i4Ret) {
while (i != 2) {
rRoamScnChnl.arChnlInfoList[i]
.ucChannelNum = 0;
i--;
}
DBGLOG(REQ, ERROR,
"NCHO parse chnl num error %d\n", i4Ret);
return -1;
}
if (u4ChnlInfo != 0) {
DBGLOG(INIT, TRACE,
"NCHO t = %d, channel value=%d\n",
t, u4ChnlInfo);
if ((u4ChnlInfo >= 1) && (u4ChnlInfo <= 14))
rRoamScnChnl.arChnlInfoList[t].eBand =
BAND_2G4;
else
rRoamScnChnl.arChnlInfoList[t].eBand =
BAND_5G;
rRoamScnChnl.arChnlInfoList[t].ucChannelNum =
u4ChnlInfo;
t++;
}
}
DBGLOG(INIT, TRACE, "NCHO set roam scan channel cmd\n");
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoRoamScnChnl,
&rRoamScnChnl,
sizeof(struct _CFG_NCHO_SCAN_CHNL_T),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO set roam scan channel fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE,
"NCHO set roam scan channel successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_roam_scn_chnl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint8_t i = 0;
uint32_t u4BufLen = 0;
int32_t i4BytesWritten = -1;
int32_t i4Argc = 0;
uint32_t u4ChnlInfo = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
struct _CFG_NCHO_SCAN_CHNL_T rRoamScnChnl;
uint32_t rStatus = WLAN_STATUS_FAILURE;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoRoamScnChnl,
&rRoamScnChnl, sizeof(struct _CFG_NCHO_SCAN_CHNL_T),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoRoamScnChnl fail 0x%x\n", rStatus);
} else {
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %d\n",
rRoamScnChnl.ucChannelListNum);
u4ChnlInfo = rRoamScnChnl.ucChannelListNum;
i4BytesWritten = 0;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten, "%u",
u4ChnlInfo);
for (i = 0; i < rRoamScnChnl.ucChannelListNum; i++) {
u4ChnlInfo =
rRoamScnChnl.arChnlInfoList[i].ucChannelNum;
i4BytesWritten += snprintf(pcCommand + i4BytesWritten,
i4TotalLen - i4BytesWritten,
" %u", u4ChnlInfo);
}
}
DBGLOG(REQ, TRACE, "NCHO i4BytesWritten is %d and channel list is %s\n",
i4BytesWritten, pcCommand);
return i4BytesWritten;
}
int priv_driver_set_ncho_roam_scn_ctrl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set roam scan control cmd %d\n",
u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoRoamScnCtrl,
&u4Param, sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO set roam scan control fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE,
"NCHO set roam scan control successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_roam_scn_ctrl(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoRoamScnCtrl,
&u4Param, sizeof(uint32_t),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoRoamScnCtrl fail 0x%x\n", rStatus);
} else {
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %d\n", u4Param);
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u", u4Param);
}
return i4BytesWritten;
}
int priv_driver_set_ncho_scn_chnl_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set scan channel time cmd %d\n",
u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoScnChnlTime,
&u4Param, sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO set scan channel time fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE,
"NCHO set scan channel time successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_scn_chnl_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct CMD_HEADER cmdV1Header;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoScnChnlTime,
&cmdV1Header, sizeof(cmdV1Header),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoScnChnlTime fail 0x%x\n", rStatus);
} else {
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %s\n",
cmdV1Header.buffer);
i4BytesWritten = kalkStrtou32(cmdV1Header.buffer, 0, &u4Param);
if (i4BytesWritten) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d!\n",
i4BytesWritten);
i4BytesWritten = -1;
} else {
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u",
u4Param);
}
}
return i4BytesWritten;
}
int priv_driver_set_ncho_scn_home_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc,
apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set scan home time cmd %d\n",
u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoScnHomeTime,
&u4Param, sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO set scan home time fail 0x%x\n", rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE,
"NCHO set scan home time successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_scn_home_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct CMD_HEADER cmdV1Header;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoScnHomeTime,
&cmdV1Header, sizeof(cmdV1Header),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoScnChnlTime fail 0x%x\n", rStatus);
} else {
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %s\n",
cmdV1Header.buffer);
i4BytesWritten = kalkStrtou32(cmdV1Header.buffer, 0, &u4Param);
if (i4BytesWritten) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d!\n",
i4BytesWritten);
i4BytesWritten = -1;
} else {
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u",
u4Param);
}
}
return i4BytesWritten;
}
int priv_driver_set_ncho_scn_home_away_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set scan home away time cmd %d\n",
u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoScnHomeAwayTime,
&u4Param, sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO set scan home away time fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE,
"NCHO set scan home away time successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_scn_home_away_time(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct CMD_HEADER cmdV1Header;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoScnHomeAwayTime,
&cmdV1Header, sizeof(cmdV1Header),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoScnHomeAwayTime fail 0x%x\n",
rStatus);
return i4BytesWritten;
}
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %s\n", cmdV1Header.buffer);
i4BytesWritten = kalkStrtou32(cmdV1Header.buffer, 0, &u4Param);
if (i4BytesWritten) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d!\n",
i4BytesWritten);
i4BytesWritten = -1;
} else {
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u", u4Param);
}
return i4BytesWritten;
}
int priv_driver_set_ncho_scn_nprobes(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set scan nprobes cmd %d\n", u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoScnNprobes,
&u4Param, sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO set scan nprobes fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE,
"NCHO set scan nprobes successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_scn_nprobes(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct CMD_HEADER cmdV1Header;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoScnNprobes,
&cmdV1Header, sizeof(cmdV1Header),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoScnNprobes fail 0x%x\n", rStatus);
return i4BytesWritten;
}
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %s\n", cmdV1Header.buffer);
i4BytesWritten = kalkStrtou32(cmdV1Header.buffer, 0, &u4Param);
if (i4BytesWritten) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d!\n",
i4BytesWritten);
i4BytesWritten = -1;
} else {
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u", u4Param);
}
return i4BytesWritten;
}
/* handle this command as framework roaming */
int priv_driver_send_ncho_reassoc(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Ret = -1;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct _CFG_NCHO_RE_ASSOC_T rReAssoc;
struct PARAM_CONNECT rParamConn;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc == 3) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s %s\n", i4Argc,
apcArgv[1], apcArgv[2]);
i4Ret = kalkStrtou32(apcArgv[2], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO send reassoc cmd %d\n", u4Param);
kalMemZero(&rReAssoc, sizeof(struct _CFG_NCHO_RE_ASSOC_T));
rReAssoc.u4CenterFreq = nicChannelNum2Freq(u4Param);
CmdStringMacParse(apcArgv[1], (uint8_t **)&apcArgv[1],
&u4SetInfoLen, rReAssoc.aucBssid);
DBGLOG(INIT, TRACE, "NCHO Bssid " MACSTR " to roam\n",
MAC2STR(rReAssoc.aucBssid));
rParamConn.pucBssid = (uint8_t *)rReAssoc.aucBssid;
rParamConn.pucSsid = (uint8_t *)rReAssoc.aucSsid;
rParamConn.u4SsidLen = rReAssoc.u4SsidLen;
rParamConn.u4CenterFreq = rReAssoc.u4CenterFreq;
rStatus = kalIoctl(prGlueInfo, wlanoidGetNchoReassocInfo,
&rParamConn, sizeof(struct PARAM_CONNECT),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO get reassoc information fail 0x%x\n",
rStatus);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO ssid %s to roam\n",
rParamConn.pucSsid);
rStatus = kalIoctl(prGlueInfo, wlanoidSetConnect, &rParamConn,
sizeof(struct PARAM_CONNECT),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO send reassoc fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE, "NCHO send reassoc successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int
nchoRemainOnChannel(IN struct ADAPTER *prAdapter, IN uint8_t ucChannelNum,
IN uint32_t u4DewellTime)
{
int32_t i4Ret = -1;
struct MSG_REMAIN_ON_CHANNEL *prMsgChnlReq =
(struct MSG_REMAIN_ON_CHANNEL *) NULL;
do {
if (!prAdapter)
break;
prMsgChnlReq = cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
sizeof(struct MSG_REMAIN_ON_CHANNEL));
if (prMsgChnlReq == NULL) {
ASSERT(FALSE);
DBGLOG(REQ, ERROR,
"NCHO there is no memory for message channel req\n");
return i4Ret;
}
kalMemZero(prMsgChnlReq, sizeof(struct MSG_REMAIN_ON_CHANNEL));
prMsgChnlReq->rMsgHdr.eMsgId = MID_MNY_AIS_REMAIN_ON_CHANNEL;
prMsgChnlReq->u4DurationMs = u4DewellTime;
prMsgChnlReq->u8Cookie = 0;
prMsgChnlReq->ucChannelNum = ucChannelNum;
if ((ucChannelNum >= 1) && (ucChannelNum <= 14))
prMsgChnlReq->eBand = BAND_2G4;
else
prMsgChnlReq->eBand = BAND_5G;
mboxSendMsg(prAdapter, MBOX_ID_0,
(struct MSG_HDR *) prMsgChnlReq,
MSG_SEND_METHOD_BUF);
i4Ret = 0;
} while (FALSE);
return i4Ret;
}
int
nchoSendActionFrame(IN struct ADAPTER *prAdapter,
struct _NCHO_ACTION_FRAME_PARAMS_T *prParamActionFrame)
{
int32_t i4Ret = -1;
struct MSG_MGMT_TX_REQUEST *prMsgTxReq =
(struct MSG_MGMT_TX_REQUEST *) NULL;
if (!prAdapter || !prParamActionFrame)
return i4Ret;
do {
/* Channel & Channel Type & Wait time are ignored. */
prMsgTxReq = cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
sizeof(struct MSG_MGMT_TX_REQUEST));
if (prMsgTxReq == NULL) {
ASSERT(FALSE);
DBGLOG(REQ, ERROR,
"NCHO there is no memory for message tx req\n");
return i4Ret;
}
prMsgTxReq->fgNoneCckRate = FALSE;
prMsgTxReq->fgIsWaitRsp = TRUE;
prMsgTxReq->u8Cookie = 0;
prMsgTxReq->rMsgHdr.eMsgId = MID_MNY_AIS_NCHO_ACTION_FRAME;
mboxSendMsg(prAdapter, MBOX_ID_0, (struct MSG_HDR *) prMsgTxReq,
MSG_SEND_METHOD_BUF);
i4Ret = 0;
} while (FALSE);
if ((i4Ret != 0) && (prMsgTxReq != NULL)) {
if (prMsgTxReq->prMgmtMsduInfo != NULL)
cnmMgtPktFree(prAdapter, prMsgTxReq->prMgmtMsduInfo);
cnmMemFree(prAdapter, prMsgTxReq);
}
return i4Ret;
}
uint32_t nchoParseActionFrame(
IN struct _NCHO_ACTION_FRAME_PARAMS_T *prParamActionFrame,
IN char *pcCommand)
{
uint32_t u4SetInfoLen = 0;
uint32_t u4Num = 0;
struct _NCHO_AF_INFO_T *prAfInfo = NULL;
if (!prParamActionFrame || !pcCommand)
return WLAN_STATUS_FAILURE;
prAfInfo = (struct _NCHO_AF_INFO_T *)(pcCommand +
kalStrLen(CMD_NCHO_ACTION_FRAME_SEND) + 1);
if (prAfInfo->i4len > CMD_NCHO_AF_DATA_LENGTH) {
DBGLOG(INIT, ERROR, "NCHO AF data length is %d\n",
prAfInfo->i4len);
return WLAN_STATUS_FAILURE;
}
prParamActionFrame->i4len = prAfInfo->i4len;
prParamActionFrame->i4channel = prAfInfo->i4channel;
prParamActionFrame->i4DwellTime = prAfInfo->i4DwellTime;
kalMemZero(prParamActionFrame->aucData, CMD_NCHO_AF_DATA_LENGTH/2);
u4SetInfoLen = prAfInfo->i4len;
while (u4SetInfoLen > 0 && u4Num < CMD_NCHO_AF_DATA_LENGTH/2) {
*(prParamActionFrame->aucData + u4Num) =
CmdString2HexParse(prAfInfo->pucData,
(uint8_t **)&prAfInfo->pucData,
(uint8_t *)&u4SetInfoLen);
u4Num++;
}
DBGLOG(INIT, TRACE, "NCHO MAC str is %s\n", prAfInfo->aucBssid);
CmdStringMacParse(prAfInfo->aucBssid,
(uint8_t **)&prAfInfo->aucBssid,
&u4SetInfoLen,
prParamActionFrame->aucBssid);
return WLAN_STATUS_SUCCESS;
}
int
priv_driver_send_ncho_action_frame(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
NCHO_ACTION_FRAME_PARAMS rParamActionFrame;
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4Ret = -1;
uint32_t u4SetInfoLen = 0;
unsigned long ulTimer = 0;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = nchoParseActionFrame(&rParamActionFrame, pcCommand);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO action frame parse error\n");
return -1;
}
DBGLOG(INIT, TRACE, "NCHO MAC is " MACSTR "\n",
MAC2STR(rParamActionFrame.aucBssid));
rStatus = kalIoctl(prGlueInfo,
wlanoidSendNchoActionFrameStart,
&rParamActionFrame,
sizeof(NCHO_ACTION_FRAME_PARAMS),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO send action fail 0x%x\n", rStatus);
return -1;
}
reinit_completion(&prGlueInfo->rAisChGrntComp);
i4Ret = nchoRemainOnChannel(prGlueInfo->prAdapter,
rParamActionFrame.i4channel,
rParamActionFrame.i4DwellTime);
ulTimer = wait_for_completion_timeout(&prGlueInfo->rAisChGrntComp,
msecs_to_jiffies(CMD_NCHO_COMP_TIMEOUT));
if (ulTimer) {
rStatus = kalIoctl(prGlueInfo,
wlanoidSendNchoActionFrameEnd,
NULL, 0, FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO send action fail 0x%x\n",
rStatus);
return -1;
}
i4Ret = nchoSendActionFrame(prGlueInfo->prAdapter,
&rParamActionFrame);
} else {
i4Ret = -1;
DBGLOG(INIT, ERROR, "NCHO req channel timeout\n");
}
return i4Ret;
}
int
priv_driver_set_ncho_wes_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
uint8_t puCommondBuf[WLAN_CFG_ARGV_MAX];
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
/*If WES mode is 1, enable NCHO*/
/*If WES mode is 0, disable NCHO*/
if (u4Param == TRUE &&
prGlueInfo->prAdapter->rNchoInfo.fgECHOEnabled == FALSE) {
kalSnprintf(puCommondBuf, WLAN_CFG_ARGV_MAX, "%s %d",
CMD_NCHO_ENABLE, 1);
priv_driver_enable_ncho(prNetDev, puCommondBuf,
sizeof(puCommondBuf));
} else if (u4Param == FALSE &&
prGlueInfo->prAdapter->rNchoInfo.fgECHOEnabled == TRUE) {
kalSnprintf(puCommondBuf, WLAN_CFG_ARGV_MAX, "%s",
CMD_NCHO_DISABLE);
priv_driver_disable_ncho(prNetDev, puCommondBuf,
sizeof(puCommondBuf));
}
DBGLOG(INIT, INFO, "NCHO set WES mode cmd %d\n", u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoWesMode, &u4Param,
sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO set WES mode fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE, "NCHO set WES mode successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_wes_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -WLAN_STATUS_FAILURE;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoWesMode, &u4Param,
sizeof(uint32_t),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO wlanoidQueryNchoWesMode fail 0x%x\n",
rStatus);
} else {
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %d\n", u4Param);
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u", u4Param);
}
DBGLOG(REQ, TRACE, "NCHO get result is %s\n", pcCommand);
return i4BytesWritten;
}
int priv_driver_set_ncho_band(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set band cmd %d\n", u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoBand, &u4Param,
sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO set band fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE, "NCHO set band successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int priv_driver_get_ncho_band(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoBand, &u4Param,
sizeof(uint32_t),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO wlanoidQueryNchoBand fail 0x%x\n",
rStatus);
} else {
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %d\n", u4Param);
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u", u4Param);
}
return i4BytesWritten;
}
int priv_driver_set_ncho_dfs_scn_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
uint32_t u4SetInfoLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4Ret = -1;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4Ret;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc, apcArgv[1]);
i4Ret = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4Ret) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4Ret);
return -1;
}
DBGLOG(INIT, TRACE, "NCHO set DFS scan cmd %d\n", u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoDfsScnMode,
&u4Param, sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO set DFS scan fail 0x%x\n",
rStatus);
i4Ret = -1;
} else {
DBGLOG(INIT, TRACE, "NCHO set DFS scan successed\n");
i4Ret = 0;
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4Ret;
}
int
priv_driver_get_ncho_dfs_scn_mode(IN struct net_device *prNetDev,
IN char *pcCommand, IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct CMD_HEADER cmdV1Header;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO Error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoDfsScnMode, &cmdV1Header,
sizeof(struct CMD_HEADER),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidQueryNchoDfsScnMode fail 0x%x\n", rStatus);
return i4BytesWritten;
}
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %s\n", cmdV1Header.buffer);
i4BytesWritten = kalkStrtou32(cmdV1Header.buffer, 0, &u4Param);
if (i4BytesWritten) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d!\n",
i4BytesWritten);
i4BytesWritten = -1;
} else {
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u", u4Param);
}
return i4BytesWritten;
}
int
priv_driver_enable_ncho(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t u4Param = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX];
int32_t i4BytesWritten = -1;
uint32_t u4SetInfoLen = 0;
uint32_t rStatus = WLAN_STATUS_FAILURE;
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus == WLAN_STATUS_SUCCESS && i4Argc >= 2) {
DBGLOG(REQ, TRACE, "NCHO argc is %i, %s\n", i4Argc,
apcArgv[1]);
i4BytesWritten = kalkStrtou32(apcArgv[1], 0, &u4Param);
if (i4BytesWritten) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d\n",
i4BytesWritten);
i4BytesWritten = -1;
} else {
DBGLOG(INIT, TRACE, "NCHO set enable cmd %d\n",
u4Param);
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoEnable,
&u4Param, sizeof(uint32_t),
FALSE, FALSE, TRUE, FALSE, &u4SetInfoLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO set enable fail 0x%x\n", rStatus);
i4BytesWritten = -1;
} else {
DBGLOG(INIT, TRACE,
"NCHO set enable successed\n");
i4BytesWritten = 0;
}
}
} else {
DBGLOG(REQ, ERROR, "NCHO set failed\n");
}
return i4BytesWritten;
}
int
priv_driver_disable_ncho(IN struct net_device *prNetDev, IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
int32_t i4BytesWritten = -1;
uint32_t u4Param = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t rStatus = WLAN_STATUS_FAILURE;
struct CMD_HEADER cmdV1Header;
DBGLOG(INIT, TRACE, "NCHO command is %s\n", pcCommand);
ASSERT(prNetDev);
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return i4BytesWritten;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
rStatus = wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
if (rStatus != WLAN_STATUS_SUCCESS || i4Argc >= 2) {
DBGLOG(REQ, ERROR, "NCHO error input parameter %d\n", i4Argc);
return i4BytesWritten;
}
/*<1> Set NCHO Disable to FW*/
u4Param = FALSE;
rStatus = kalIoctl(prGlueInfo, wlanoidSetNchoEnable, &u4Param,
sizeof(uint32_t), FALSE, FALSE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR,
"NCHO wlanoidSetNchoEnable :%d fail 0x%x\n",
u4Param, rStatus);
return i4BytesWritten;
}
/*<2> Query NCHOEnable Satus*/
rStatus = kalIoctl(prGlueInfo, wlanoidQueryNchoEnable,
&cmdV1Header, sizeof(cmdV1Header),
TRUE, TRUE, TRUE, FALSE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS) {
DBGLOG(INIT, ERROR, "NCHO wlanoidQueryNchoEnable fail 0x%x\n",
rStatus);
return i4BytesWritten;
}
DBGLOG(REQ, TRACE, "NCHO query ok and ret is %s\n", cmdV1Header.buffer);
i4BytesWritten = kalkStrtou32(cmdV1Header.buffer, 0, &u4Param);
if (i4BytesWritten) {
DBGLOG(REQ, ERROR, "NCHO parse u4Param error %d!\n",
i4BytesWritten);
i4BytesWritten = -1;
} else {
i4BytesWritten = snprintf(pcCommand, i4TotalLen, "%u", u4Param);
}
return i4BytesWritten;
}
/*Check NCHO is enable or not.*/
u_int8_t
priv_driver_auto_enable_ncho(IN struct net_device *prNetDev)
{
uint8_t puCommondBuf[WLAN_CFG_ARGV_MAX];
struct GLUE_INFO *prGlueInfo = NULL;
ASSERT(prNetDev);
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
ASSERT(prGlueInfo);
kalSnprintf(puCommondBuf, WLAN_CFG_ARGV_MAX, "%s %d", CMD_NCHO_ENABLE,
1);
#if CFG_SUPPORT_NCHO_AUTO_ENABLE
if (prGlueInfo->prAdapter->rNchoInfo.fgECHOEnabled == FALSE) {
DBGLOG(INIT, INFO,
"NCHO is unavailable now! Start to NCHO Enable CMD\n");
priv_driver_enable_ncho(prNetDev, puCommondBuf,
sizeof(puCommondBuf));
}
#endif
return TRUE;
}
#endif
#if (CFG_SUPPORT_TSF_SYNC == 1)
int priv_driver_get_tsf_value(
IN struct net_device *prNetDev,
IN char *pcCommand,
IN int i4TotalLen)
{
struct GLUE_INFO *prGlueInfo = NULL;
uint32_t rStatus = WLAN_STATUS_SUCCESS;
int32_t i4BytesWritten = 0;
uint32_t u4BufLen = 0;
int32_t i4Argc = 0;
int8_t *apcArgv[WLAN_CFG_ARGV_MAX] = { 0 };
uint32_t status = 0;
struct CMD_TSF_SYNC rTsfSync;
uint8_t ucBssIdx = 0;
if (GLUE_CHK_PR2(prNetDev, pcCommand) == FALSE)
return -1;
prGlueInfo = *((struct GLUE_INFO **) netdev_priv(prNetDev));
DBGLOG(REQ, LOUD, "command is %s\n", pcCommand);
wlanCfgParseArgument(pcCommand, &i4Argc, apcArgv);
DBGLOG(REQ, LOUD, "argc is %i\n", i4Argc);
if (i4Argc != 2) {
DBGLOG(REQ, ERROR, "argc(%d) is error\n", i4Argc);
return -1;
}
status = kalkStrtou8(apcArgv[1], 0, &ucBssIdx);
if (status) {
DBGLOG(REQ, ERROR, "parse ucBssIdx error u4Ret=%d\n", status);
ucBssIdx = 0;
}
if (ucBssIdx >= MAX_BSS_INDEX) {
DBGLOG(REQ, ERROR, "invalid bss index %d\n", ucBssIdx);
return -1;
}
/* get the tsf value and to pull the tsf gpio */
kalMemZero(&rTsfSync, sizeof(struct CMD_TSF_SYNC));
rTsfSync.ucCmdVer = 0;
rTsfSync.u2CmdLen = sizeof(struct CMD_TSF_SYNC);
rTsfSync.fgIsLatch = 1;
rTsfSync.ucBssIndex = ucBssIdx;
rStatus = kalIoctl(prGlueInfo, wlanoidLatchTSF, &rTsfSync,
sizeof(rTsfSync), TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "Fail");
else {
DBGLOG_LIMITED(REQ, LOUD,
"tsfvaluse: %llu\n", rTsfSync.u8TsfValue);
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "%llu",
rTsfSync.u8TsfValue);
}
/* get the tsf value and to release the tsf gpio */
kalMemZero(&rTsfSync, sizeof(struct CMD_TSF_SYNC));
rTsfSync.ucCmdVer = 0;
rTsfSync.u2CmdLen = sizeof(struct CMD_TSF_SYNC);
rTsfSync.fgIsLatch = 0;
rStatus = kalIoctl(prGlueInfo, wlanoidLatchTSF, &rTsfSync,
sizeof(rTsfSync), TRUE, TRUE, TRUE, &u4BufLen);
if (rStatus != WLAN_STATUS_SUCCESS)
i4BytesWritten = kalSnprintf(pcCommand, i4TotalLen, "Fail");
else
DBGLOG_LIMITED(REQ, LOUD,
"tsfvaluse: %llu\n", rTsfSync.u8TsfValue);
return i4BytesWritten;
}
#endif