diff --git a/Kbuild b/Kbuild index 36fb1e29fcbf..d9886d532cf0 100755 --- a/Kbuild +++ b/Kbuild @@ -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 diff --git a/configs/default_defconfig b/configs/default_defconfig index 3731a17f387e..a5b0e87b8ce2 100644 --- a/configs/default_defconfig +++ b/configs/default_defconfig @@ -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 diff --git a/configs/genoa.common b/configs/genoa.common index 2679e3bdda71..9e3ffa52b986 100644 --- a/configs/genoa.common +++ b/configs/genoa.common @@ -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 diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index d60a2152b0ec..b50fb936bd7d 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -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}, diff --git a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c index d191059f722d..df0301f732fa 100644 --- a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c +++ b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c @@ -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); diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index b940ff4c322d..5a6e3bf70b1b 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -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); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 964f0ab03307..94ce661c55ac 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -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); diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index d080ac059de5..b806e7619992 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -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 * diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 6902db8d3d13..40b425cc30b7 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -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