qcacld-3.0: Featurize RMC

Featurize RMC and disable for Genoa

Change-Id: I66b17622c89dd5736f152c4cd9506ce2706b4604
CRs-Fixed: 2304269
This commit is contained in:
Rachit Kankane 2018-08-02 13:19:34 +05:30 • committed by nshrivas
commit ee1735c905
9 changed files with 234 additions and 199 deletions

1
Kbuild
View file

@ -1941,6 +1941,7 @@ cppflags-$(CONFIG_FEATURE_STATS_EXT) += -DWLAN_FEATURE_STATS_EXT
cppflags-$(CONFIG_QCACLD_FEATURE_NAN) += -DWLAN_FEATURE_NAN
cppflags-$(CONFIG_QCA_IBSS_SUPPORT) += -DQCA_IBSS_SUPPORT
cppflags-$(CONFIG_WLAN_SYSFS) += -DWLAN_SYSFS
cppflags-$(CONFIG_FEATURE_WLAN_RMC) += -DFEATURE_WLAN_RMC
#Enable OL debug and wmi unified functions
cppflags-$(CONFIG_ATH_PERF_PWR_OFFLOAD) += -DATH_PERF_PWR_OFFLOAD

View file

@ -414,6 +414,7 @@ CONFIG_FEATURE_AP_MCC_CH_AVOIDANCE := y
else
CONFIG_QCOM_ESE := y
CONFIG_QCA_IBSS_SUPPORT := y
CONFIG_FEATURE_WLAN_RMC := y
CONFIG_WLAN_OPEN_P2P_INTERFACE := y
CONFIG_WLAN_ENABLE_SOCIAL_CHANNELS_5G_ONLY := y
endif

View file

@ -7,6 +7,7 @@ CONFIG_FEATURE_STATS_EXT := n
CONFIG_QCA_IBSS_SUPPORT := y
#required features
CONFIG_FEATURE_WLAN_RMC := n
CONFIG_QCACLD_WLAN_LFR2 := y
CONFIG_QCACLD_WLAN_LFR3 := n
CONFIG_QCOM_TDLS := y

View file

@ -238,150 +238,6 @@ static int hdd_get_tsm_stats(struct hdd_adapter *adapter,
}
#endif /*FEATURE_WLAN_ESE */
/* Function header is left blank intentionally */
static int hdd_parse_setrmcenable_command(uint8_t *pValue,
uint8_t *pRmcEnable)
{
uint8_t *inPtr = pValue;
int tempInt;
int v = 0;
char buf[32];
*pRmcEnable = 0;
inPtr = strnchr(pValue, strlen(pValue), SPACE_ASCII_VALUE);
if (NULL == inPtr)
return 0;
else if (SPACE_ASCII_VALUE != *inPtr)
return 0;
while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr))
inPtr++;
if ('\0' == *inPtr)
return 0;
v = sscanf(inPtr, "%31s ", buf);
if (1 != v)
return -EINVAL;
v = kstrtos32(buf, 10, &tempInt);
if (v < 0)
return -EINVAL;
*pRmcEnable = tempInt;
hdd_debug("ucRmcEnable: %d", *pRmcEnable);
return 0;
}
/* Function header is left blank intentionally */
static int hdd_parse_setrmcactionperiod_command(uint8_t *pValue,
uint32_t *pActionPeriod)
{
uint8_t *inPtr = pValue;
int tempInt;
int v = 0;
char buf[32];
*pActionPeriod = 0;
inPtr = strnchr(pValue, strlen(pValue), SPACE_ASCII_VALUE);
if (NULL == inPtr)
return -EINVAL;
else if (SPACE_ASCII_VALUE != *inPtr)
return -EINVAL;
while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr))
inPtr++;
if ('\0' == *inPtr)
return 0;
v = sscanf(inPtr, "%31s ", buf);
if (1 != v)
return -EINVAL;
v = kstrtos32(buf, 10, &tempInt);
if (v < 0)
return -EINVAL;
if ((tempInt < WNI_CFG_RMC_ACTION_PERIOD_FREQUENCY_STAMIN) ||
(tempInt > WNI_CFG_RMC_ACTION_PERIOD_FREQUENCY_STAMAX))
return -EINVAL;
*pActionPeriod = tempInt;
hdd_debug("uActionPeriod: %d", *pActionPeriod);
return 0;
}
/* Function header is left blank intentionally */
static int hdd_parse_setrmcrate_command(uint8_t *pValue,
uint32_t *pRate,
enum tx_rate_info *pTxFlags)
{
uint8_t *inPtr = pValue;
int tempInt;
int v = 0;
char buf[32];
*pRate = 0;
*pTxFlags = 0;
inPtr = strnchr(pValue, strlen(pValue), SPACE_ASCII_VALUE);
if (NULL == inPtr)
return -EINVAL;
else if (SPACE_ASCII_VALUE != *inPtr)
return -EINVAL;
while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr))
inPtr++;
if ('\0' == *inPtr)
return 0;
v = sscanf(inPtr, "%31s ", buf);
if (1 != v)
return -EINVAL;
v = kstrtos32(buf, 10, &tempInt);
if (v < 0)
return -EINVAL;
switch (tempInt) {
default:
hdd_warn("Unsupported rate: %d", tempInt);
return -EINVAL;
case 0:
case 6:
case 9:
case 12:
case 18:
case 24:
case 36:
case 48:
case 54:
*pTxFlags = TX_RATE_LEGACY;
*pRate = tempInt * 10;
break;
case 65:
*pTxFlags = TX_RATE_HT20;
*pRate = tempInt * 10;
break;
case 72:
*pTxFlags = TX_RATE_HT20 | TX_RATE_SGI;
*pRate = 722;
break;
}
hdd_debug("Rate: %d", *pRate);
return 0;
}
/**
* hdd_get_ibss_peer_info_cb() - IBSS peer Info request callback
* @UserData: Adapter private data
@ -5012,6 +4868,151 @@ exit:
return ret;
}
#ifdef FEATURE_WLAN_RMC
/* Function header is left blank intentionally */
static int hdd_parse_setrmcenable_command(uint8_t *pValue,
uint8_t *pRmcEnable)
{
uint8_t *inPtr = pValue;
int tempInt;
int v = 0;
char buf[32];
*pRmcEnable = 0;
inPtr = strnchr(pValue, strlen(pValue), SPACE_ASCII_VALUE);
if (NULL == inPtr)
return 0;
else if (SPACE_ASCII_VALUE != *inPtr)
return 0;
while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr))
inPtr++;
if ('\0' == *inPtr)
return 0;
v = sscanf(inPtr, "%31s ", buf);
if (1 != v)
return -EINVAL;
v = kstrtos32(buf, 10, &tempInt);
if (v < 0)
return -EINVAL;
*pRmcEnable = tempInt;
hdd_debug("ucRmcEnable: %d", *pRmcEnable);
return 0;
}
/* Function header is left blank intentionally */
static int hdd_parse_setrmcactionperiod_command(uint8_t *pValue,
uint32_t *pActionPeriod)
{
uint8_t *inPtr = pValue;
int tempInt;
int v = 0;
char buf[32];
*pActionPeriod = 0;
inPtr = strnchr(pValue, strlen(pValue), SPACE_ASCII_VALUE);
if (NULL == inPtr)
return -EINVAL;
else if (SPACE_ASCII_VALUE != *inPtr)
return -EINVAL;
while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr))
inPtr++;
if ('\0' == *inPtr)
return 0;
v = sscanf(inPtr, "%31s ", buf);
if (1 != v)
return -EINVAL;
v = kstrtos32(buf, 10, &tempInt);
if (v < 0)
return -EINVAL;
if ((tempInt < WNI_CFG_RMC_ACTION_PERIOD_FREQUENCY_STAMIN) ||
(tempInt > WNI_CFG_RMC_ACTION_PERIOD_FREQUENCY_STAMAX))
return -EINVAL;
*pActionPeriod = tempInt;
hdd_debug("uActionPeriod: %d", *pActionPeriod);
return 0;
}
/* Function header is left blank intentionally */
static int hdd_parse_setrmcrate_command(uint8_t *pValue,
uint32_t *pRate,
enum tx_rate_info *pTxFlags)
{
uint8_t *inPtr = pValue;
int tempInt;
int v = 0;
char buf[32];
*pRate = 0;
*pTxFlags = 0;
inPtr = strnchr(pValue, strlen(pValue), SPACE_ASCII_VALUE);
if (NULL == inPtr)
return -EINVAL;
else if (SPACE_ASCII_VALUE != *inPtr)
return -EINVAL;
while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr))
inPtr++;
if ('\0' == *inPtr)
return 0;
v = sscanf(inPtr, "%31s ", buf);
if (1 != v)
return -EINVAL;
v = kstrtos32(buf, 10, &tempInt);
if (v < 0)
return -EINVAL;
switch (tempInt) {
default:
hdd_warn("Unsupported rate: %d", tempInt);
return -EINVAL;
case 0:
case 6:
case 9:
case 12:
case 18:
case 24:
case 36:
case 48:
case 54:
*pTxFlags = TX_RATE_LEGACY;
*pRate = tempInt * 10;
break;
case 65:
*pTxFlags = TX_RATE_HT20;
*pRate = tempInt * 10;
break;
case 72:
*pTxFlags = TX_RATE_HT20 | TX_RATE_SGI;
*pRate = 722;
break;
}
hdd_debug("Rate: %d", *pRate);
return 0;
}
static int drv_cmd_set_rmc_enable(struct hdd_adapter *adapter,
struct hdd_context *hdd_ctx,
uint8_t *command,
@ -5118,6 +5119,60 @@ exit:
return ret;
}
static int drv_cmd_set_rmc_tx_rate(struct hdd_adapter *adapter,
struct hdd_context *hdd_ctx,
uint8_t *command,
uint8_t command_len,
struct hdd_priv_data *priv_data)
{
int ret = 0;
uint8_t *value = command;
uint32_t uRate = 0;
enum tx_rate_info txFlags = 0;
tSirRateUpdateInd rateUpdateParams = {0};
int status;
struct hdd_config *pConfig = hdd_ctx->config;
if ((QDF_IBSS_MODE != adapter->device_mode) &&
(QDF_SAP_MODE != adapter->device_mode)) {
hdd_err("Received SETRMCTXRATE cmd in invalid mode %s(%d)",
hdd_device_mode_to_string(adapter->device_mode),
adapter->device_mode);
hdd_err("SETRMCTXRATE cmd is allowed only in IBSS/SOFTAP mode");
ret = -EINVAL;
goto exit;
}
status = hdd_parse_setrmcrate_command(value, &uRate, &txFlags);
if (status) {
hdd_err("Invalid SETRMCTXRATE command");
ret = -EINVAL;
goto exit;
}
hdd_debug("uRate %d", uRate);
/* -1 implies ignore this param */
rateUpdateParams.ucastDataRate = -1;
/*
* Fill the user specifieed RMC rate param
* and the derived tx flags.
*/
rateUpdateParams.nss = (pConfig->enable2x2 == 0) ? 0 : 1;
rateUpdateParams.reliableMcastDataRate = uRate;
rateUpdateParams.reliableMcastDataRateTxFlag = txFlags;
rateUpdateParams.dev_mode = adapter->device_mode;
rateUpdateParams.bcastDataRate = -1;
memcpy(rateUpdateParams.bssid.bytes,
adapter->mac_addr.bytes,
sizeof(rateUpdateParams.bssid));
status = sme_send_rate_update_ind(hdd_ctx->mac_handle,
&rateUpdateParams);
exit:
return ret;
}
#endif /* FEATURE_WLAN_RMC */
static int drv_cmd_get_ibss_peer_info_all(struct hdd_adapter *adapter,
struct hdd_context *hdd_ctx,
uint8_t *command,
@ -5331,59 +5386,6 @@ exit:
return ret;
}
static int drv_cmd_set_rmc_tx_rate(struct hdd_adapter *adapter,
struct hdd_context *hdd_ctx,
uint8_t *command,
uint8_t command_len,
struct hdd_priv_data *priv_data)
{
int ret = 0;
uint8_t *value = command;
uint32_t uRate = 0;
enum tx_rate_info txFlags = 0;
tSirRateUpdateInd rateUpdateParams = {0};
int status;
struct hdd_config *pConfig = hdd_ctx->config;
if ((QDF_IBSS_MODE != adapter->device_mode) &&
(QDF_SAP_MODE != adapter->device_mode)) {
hdd_err("Received SETRMCTXRATE cmd in invalid mode %s(%d)",
hdd_device_mode_to_string(adapter->device_mode),
adapter->device_mode);
hdd_err("SETRMCTXRATE cmd is allowed only in IBSS/SOFTAP mode");
ret = -EINVAL;
goto exit;
}
status = hdd_parse_setrmcrate_command(value, &uRate, &txFlags);
if (status) {
hdd_err("Invalid SETRMCTXRATE command");
ret = -EINVAL;
goto exit;
}
hdd_debug("uRate %d", uRate);
/* -1 implies ignore this param */
rateUpdateParams.ucastDataRate = -1;
/*
* Fill the user specifieed RMC rate param
* and the derived tx flags.
*/
rateUpdateParams.nss = (pConfig->enable2x2 == 0) ? 0 : 1;
rateUpdateParams.reliableMcastDataRate = uRate;
rateUpdateParams.reliableMcastDataRateTxFlag = txFlags;
rateUpdateParams.dev_mode = adapter->device_mode;
rateUpdateParams.bcastDataRate = -1;
memcpy(rateUpdateParams.bssid.bytes,
adapter->mac_addr.bytes,
sizeof(rateUpdateParams.bssid));
status = sme_send_rate_update_ind(hdd_ctx->mac_handle,
&rateUpdateParams);
exit:
return ret;
}
static int drv_cmd_set_ibss_tx_fail_event(struct hdd_adapter *adapter,
struct hdd_context *hdd_ctx,
uint8_t *command,
@ -7353,11 +7355,13 @@ static const struct hdd_drv_cmd hdd_drv_cmds[] = {
{"SETDWELLTIME", drv_cmd_set_dwell_time, true},
{"MIRACAST", drv_cmd_miracast, true},
{"SETIBSSBEACONOUIDATA", drv_cmd_set_ibss_beacon_oui_data, true},
#ifdef FEATURE_WLAN_RMC
{"SETRMCENABLE", drv_cmd_set_rmc_enable, true},
{"SETRMCACTIONPERIOD", drv_cmd_set_rmc_action_period, true},
{"SETRMCTXRATE", drv_cmd_set_rmc_tx_rate, true},
#endif
{"GETIBSSPEERINFOALL", drv_cmd_get_ibss_peer_info_all, false},
{"GETIBSSPEERINFO", drv_cmd_get_ibss_peer_info, true},
{"SETRMCTXRATE", drv_cmd_set_rmc_tx_rate, true},
{"SETIBSSTXFAILEVENT", drv_cmd_set_ibss_tx_fail_event, true},
#ifdef FEATURE_WLAN_ESE
{"SETCCXROAMSCANCHANNELS", drv_cmd_set_ccx_roam_scan_channels, true},

View file

@ -527,9 +527,11 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg)
CASE_RETURN_STRING(WMA_IBSS_CESIUM_ENABLE_IND);
CASE_RETURN_STRING(WMA_GET_IBSS_PEER_INFO_REQ);
CASE_RETURN_STRING(WMA_TX_FAIL_MONITOR_IND);
#ifdef FEATURE_WLAN_RMC
CASE_RETURN_STRING(WMA_RMC_ENABLE_IND);
CASE_RETURN_STRING(WMA_RMC_DISABLE_IND);
CASE_RETURN_STRING(WMA_RMC_ACTION_PERIOD_IND);
#endif
CASE_RETURN_STRING(WMA_INIT_THERMAL_INFO_CMD);
CASE_RETURN_STRING(WMA_SET_THERMAL_LEVEL);
CASE_RETURN_STRING(WMA_SET_SAP_INTRABSS_DIS);

View file

@ -806,9 +806,11 @@ QDF_STATUS sme_roam_del_pmkid_from_cache(tHalHandle hHal, uint8_t sessionId,
tPmkidCacheInfo *pmksa, bool flush_cache);
void sme_get_command_q_status(tHalHandle hHal);
#ifdef FEATURE_WLAN_RMC
QDF_STATUS sme_enable_rmc(tHalHandle hHal, uint32_t sessionId);
QDF_STATUS sme_disable_rmc(tHalHandle hHal, uint32_t sessionId);
QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId);
#endif
QDF_STATUS sme_request_ibss_peer_info(tHalHandle hHal, void *pUserData,
pIbssPeerInfoCb peerInfoCbk, bool allPeerInfoReqd, uint8_t staIdx);
QDF_STATUS sme_send_cesium_enable_ind(tHalHandle hHal, uint32_t sessionId);

View file

@ -8475,6 +8475,7 @@ sme_del_periodic_tx_ptrn(tHalHandle hal,
return status;
}
#ifdef FEATURE_WLAN_RMC
/*
* sme_enable_rmc() - enables RMC
* @hHal : Pointer to global HAL handle
@ -8572,6 +8573,7 @@ QDF_STATUS sme_send_rmc_action_period(tHalHandle hHal, uint32_t sessionId)
return status;
}
#endif /* FEATURE_WLAN_RMC */
/*
* sme_request_ibss_peer_info() - request ibss peer info
@ -9839,7 +9841,7 @@ QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
if (!QDF_IS_STATUS_SUCCESS
(scheduler_post_msg(QDF_MODULE_ID_WMA, &msg))) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Not able to post WMA_SET_RMC_RATE_IND to WMA!",
"%s: Not able to post WMA_RATE_UPDATE_IND to WMA!",
__func__);
sme_release_global_lock(&pMac->sme);

View file

@ -980,11 +980,31 @@ QDF_STATUS wma_process_get_peer_info_req
QDF_STATUS wma_process_tx_fail_monitor_ind
(tp_wma_handle wma, tAniTXFailMonitorInd *pReq);
#ifdef FEATURE_WLAN_RMC
QDF_STATUS wma_process_rmc_enable_ind(tp_wma_handle wma);
QDF_STATUS wma_process_rmc_disable_ind(tp_wma_handle wma);
QDF_STATUS wma_process_rmc_action_period_ind(tp_wma_handle wma);
#else
static inline
QDF_STATUS wma_process_rmc_enable_ind(tp_wma_handle wma)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS wma_process_rmc_disable_ind(tp_wma_handle wma)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS wma_process_rmc_action_period_ind(tp_wma_handle wma)
{
return QDF_STATUS_SUCCESS;
}
#endif
QDF_STATUS wma_process_add_periodic_tx_ptrn_ind(WMA_HANDLE handle,
tSirAddPeriodicTxPtrn *

View file

@ -3439,6 +3439,7 @@ QDF_STATUS wma_process_tx_fail_monitor_ind(tp_wma_handle wma,
return QDF_STATUS_SUCCESS;
}
#ifdef FEATURE_WLAN_RMC
/**
* wma_process_rmc_enable_ind() - enables RMC functionality in target
* @wma: wma handle
@ -3608,6 +3609,7 @@ QDF_STATUS wma_process_rmc_action_period_ind(tp_wma_handle wma)
return QDF_STATUS_SUCCESS;
}
#endif /* FEATURE_WLAN_RMC */
/**
* wma_process_add_periodic_tx_ptrn_ind - add periodic tx ptrn