qcacld-3.0: Add param for OCL mode configuration

Currently there is no provision to configure OCL mode in FW during
driver bootup.

To enable this configuration add a new INI configuration parameter
gOclCfg.

Change-Id: I87c9131f5395c394f745e0170f0d9b3d1571d030
CRs-Fixed: 2644312
This commit is contained in:
Bapiraju Alla
2020-03-18 10:44:32 +05:30
committed by nshrivas
parent c589449c9a
commit 5e23b7cfd7
10 changed files with 170 additions and 1 deletions

View File

@@ -204,6 +204,7 @@ struct wlan_fwol_neighbor_report_cfg {
* @enable_dhcp_server_offload: DHCP Offload is enabled or not * @enable_dhcp_server_offload: DHCP Offload is enabled or not
* @dhcp_max_num_clients: Max number of DHCP client supported * @dhcp_max_num_clients: Max number of DHCP client supported
* @dwelltime_params: adaptive dwell time parameters * @dwelltime_params: adaptive dwell time parameters
* @ocl_cfg: OCL mode configuration
*/ */
struct wlan_fwol_cfg { struct wlan_fwol_cfg {
/* Add CFG and INI items here */ /* Add CFG and INI items here */
@@ -254,6 +255,7 @@ struct wlan_fwol_cfg {
uint32_t dhcp_max_num_clients; uint32_t dhcp_max_num_clients;
#endif #endif
struct adaptive_dwelltime_params dwelltime_params; struct adaptive_dwelltime_params dwelltime_params;
uint32_t ocl_cfg;
}; };
/** /**

View File

@@ -540,6 +540,7 @@ QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc)
ucfg_fwol_fetch_tsf_sync_host_gpio_pin(psoc, fwol_cfg); ucfg_fwol_fetch_tsf_sync_host_gpio_pin(psoc, fwol_cfg);
ucfg_fwol_fetch_dhcp_server_settings(psoc, fwol_cfg); ucfg_fwol_fetch_dhcp_server_settings(psoc, fwol_cfg);
fwol_cfg->sap_xlna_bypass = cfg_get(psoc, CFG_SET_SAP_XLNA_BYPASS); fwol_cfg->sap_xlna_bypass = cfg_get(psoc, CFG_SET_SAP_XLNA_BYPASS);
fwol_cfg->ocl_cfg = cfg_get(psoc, CFG_SET_OCL_CFG);
return status; return status;
} }

View File

@@ -728,6 +728,36 @@
0, \ 0, \
"SAP xLNA bypass control") "SAP xLNA bypass control")
/*
* <ini>
* gOclCfg - Enable/Disable OCL mode
* @Min: 0
* @Max: 2
* @Default: 2
*
* This ini is used to set one chain listen (OCL) mode to static or dynamic
* enable/disable during bootup. value 0 disables both static/dynamic OCL.
* value 1 enables static OCL. Once its enabled it stays enabled. value 2
* enables dynamic OCL. In dynamic OCL mode one chain listen will be
* enabled/disabled by firmware during runtime based on RSSI.
*
* Related: None
*
* Supported Feature: OCL
*
* Usage: Internal
*
* </ini>
*/
#define CFG_SET_OCL_CFG CFG_INI_UINT( \
"gOclCfg", \
0, \
2, \
2, \
CFG_VALUE_OR_DEFAULT, \
"OCL configuration")
#define CFG_FWOL_GENERIC_ALL \ #define CFG_FWOL_GENERIC_ALL \
CFG_FWOL_DHCP \ CFG_FWOL_DHCP \
CFG(CFG_ENABLE_ANI) \ CFG(CFG_ENABLE_ANI) \
@@ -754,6 +784,7 @@
CFG(CFG_ENABLE_GCMP) \ CFG(CFG_ENABLE_GCMP) \
CFG(CFG_TX_SCH_DELAY) \ CFG(CFG_TX_SCH_DELAY) \
CFG(CFG_ENABLE_SECONDARY_RATE) \ CFG(CFG_ENABLE_SECONDARY_RATE) \
CFG(CFG_SET_SAP_XLNA_BYPASS) CFG(CFG_SET_SAP_XLNA_BYPASS) \
CFG(CFG_SET_OCL_CFG)
#endif #endif

View File

@@ -286,6 +286,16 @@ QDF_STATUS ucfg_fwol_get_enable_fw_module_log_level(
QDF_STATUS ucfg_fwol_get_sap_xlna_bypass(struct wlan_objmgr_psoc *psoc, QDF_STATUS ucfg_fwol_get_sap_xlna_bypass(struct wlan_objmgr_psoc *psoc,
bool *sap_xlna_bypass); bool *sap_xlna_bypass);
/**
* ucfg_fwol_get_ocl_cfg() - Assigns ocl_cfg value
* @psoc: pointer to the psoc object
* @ocl_cfg: pointer to return ocl_cfg
*
* Return: QDF Status
*/
QDF_STATUS ucfg_fwol_get_ocl_cfg(struct wlan_objmgr_psoc *psoc,
uint32_t *ocl_cfg);
#ifdef FEATURE_WLAN_RA_FILTERING #ifdef FEATURE_WLAN_RA_FILTERING
/** /**
* ucfg_fwol_set_is_rate_limit_enabled() - Sets the is_rate_limit_enabled value * ucfg_fwol_set_is_rate_limit_enabled() - Sets the is_rate_limit_enabled value
@@ -741,6 +751,12 @@ ucfg_fwol_get_sap_xlna_bypass(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
} }
static inline QDF_STATUS
ucfg_fwol_get_ocl_cfg(struct wlan_objmgr_psoc *psoc, uint32_t *ocl_cfg)
{
return QDF_STATUS_E_FAILURE;
}
static inline QDF_STATUS static inline QDF_STATUS
ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc, ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc,
uint32_t *tsf_gpio_pin) uint32_t *tsf_gpio_pin)

View File

@@ -520,6 +520,21 @@ QDF_STATUS ucfg_fwol_get_sap_xlna_bypass(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
QDF_STATUS ucfg_fwol_get_ocl_cfg(struct wlan_objmgr_psoc *psoc,
uint32_t *ocl_cfg)
{
struct wlan_fwol_psoc_obj *fwol_obj;
fwol_obj = fwol_get_psoc_obj(psoc);
if (!fwol_obj) {
fwol_err("Failed to get FWOL obj");
return QDF_STATUS_E_FAILURE;
}
*ocl_cfg = fwol_obj->cfg.ocl_cfg;
return QDF_STATUS_SUCCESS;
}
#ifdef FEATURE_WLAN_RA_FILTERING #ifdef FEATURE_WLAN_RA_FILTERING
QDF_STATUS ucfg_fwol_set_is_rate_limit_enabled(struct wlan_objmgr_psoc *psoc, QDF_STATUS ucfg_fwol_set_is_rate_limit_enabled(struct wlan_objmgr_psoc *psoc,
bool is_rate_limit_enabled) bool is_rate_limit_enabled)

View File

@@ -4996,6 +4996,58 @@ bool hdd_is_vdev_in_conn_state(struct hdd_adapter *adapter)
return 0; return 0;
} }
/**
* hdd_send_ocl_cmd() - Send ocl command to FW
* @hdd_ctx: HDD context
* @adapter: Primary adapter context
*
* This function is used to send OCL mode configuration to FW
*
* Return: 0 on success and -EINVAL on failure
*/
static int hdd_send_ocl_cmd(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter)
{
struct ocl_cmd_params ocl_params = {0};
struct wlan_objmgr_psoc *psoc;
QDF_STATUS status;
if (!hdd_ctx) {
hdd_err("hdd_ctx is invalid");
goto err;
}
if (!adapter) {
hdd_err("adapter is invalid");
goto err;
}
psoc = hdd_ctx->psoc;
if (!psoc) {
hdd_err("HDD psoc is invalid");
goto err;
}
status = ucfg_fwol_get_ocl_cfg(psoc, &ocl_params.en_dis_chain);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Unable to get OCL mode configuration");
goto err;
}
ocl_params.vdev_id = adapter->vdev_id;
status = sme_send_ocl_cmd(&ocl_params);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Failed to send ocl command");
goto err;
}
return 0;
err:
return -EINVAL;
}
int hdd_vdev_create(struct hdd_adapter *adapter) int hdd_vdev_create(struct hdd_adapter *adapter)
{ {
QDF_STATUS status; QDF_STATUS status;
@@ -5101,6 +5153,8 @@ int hdd_vdev_create(struct hdd_adapter *adapter)
} }
hdd_store_nss_chains_cfg_in_vdev(adapter); hdd_store_nss_chains_cfg_in_vdev(adapter);
hdd_send_ocl_cmd(hdd_ctx, adapter);
hdd_nofl_debug("vdev %d created successfully", adapter->vdev_id); hdd_nofl_debug("vdev %d created successfully", adapter->vdev_id);
return errno; return errno;

View File

@@ -2348,6 +2348,14 @@ QDF_STATUS sme_set_sar_power_limits(mac_handle_t mac_handle,
*/ */
QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params); QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params);
/**
* sme_send_ocl_cmd() - Send OCL command
* @ocl_params: OCL command params
*
* Return: QDF_STATUS
*/
QDF_STATUS sme_send_ocl_cmd(struct ocl_cmd_params *ocl_params);
void sme_set_cc_src(mac_handle_t mac_handle, enum country_src); void sme_set_cc_src(mac_handle_t mac_handle, enum country_src);

View File

@@ -13801,6 +13801,18 @@ QDF_STATUS sme_send_coex_config_cmd(struct coex_config_params *coex_cfg_params)
return wma_send_coex_config_cmd(wma_handle, coex_cfg_params); return wma_send_coex_config_cmd(wma_handle, coex_cfg_params);
} }
QDF_STATUS sme_send_ocl_cmd(struct ocl_cmd_params *ocl_params)
{
void *wma_handle;
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (!wma_handle) {
sme_err("wma handle is NULL");
return QDF_STATUS_E_FAILURE;
}
return wma_send_ocl_cmd(wma_handle, ocl_params);
}
#ifdef WLAN_FEATURE_FIPS #ifdef WLAN_FEATURE_FIPS
QDF_STATUS sme_fips_request(mac_handle_t mac_handle, struct fips_params *param, QDF_STATUS sme_fips_request(mac_handle_t mac_handle, struct fips_params *param,
wma_fips_cb callback, void *context) wma_fips_cb callback, void *context)

View File

@@ -414,6 +414,17 @@ QDF_STATUS wma_set_sar_limit(WMA_HANDLE handle,
QDF_STATUS wma_send_coex_config_cmd(WMA_HANDLE wma_handle, QDF_STATUS wma_send_coex_config_cmd(WMA_HANDLE wma_handle,
struct coex_config_params *coex_cfg_params); struct coex_config_params *coex_cfg_params);
/**
* wma_send_ocl_cmd() - Send OCL command
* @wma_handle: wma handle
* @ocl_params: OCL command params
*
* This function sends WMI command to send OCL mode configuration
*
* Return: QDF_STATUS
*/
QDF_STATUS wma_send_ocl_cmd(WMA_HANDLE wma_handle,
struct ocl_cmd_params *ocl_params);
/** /**
* wma_set_qpower_config() - update qpower config in wma * wma_set_qpower_config() - update qpower config in wma
* @vdev_id: the Id of the vdev to configure * @vdev_id: the Id of the vdev to configure

View File

@@ -4724,6 +4724,25 @@ QDF_STATUS wma_send_coex_config_cmd(WMA_HANDLE wma_handle,
coex_cfg_params); coex_cfg_params);
} }
QDF_STATUS wma_send_ocl_cmd(WMA_HANDLE wma_handle,
struct ocl_cmd_params *ocl_params)
{
tp_wma_handle wma = (tp_wma_handle)wma_handle;
if (!wma || !wma->wmi_handle) {
WMA_LOGE("%s: WMA is closed, can not issue coex config command",
__func__);
return QDF_STATUS_E_INVAL;
}
if (!ocl_params) {
WMA_LOGE("%s: ocl params ptr NULL", __func__);
return QDF_STATUS_E_INVAL;
}
return wmi_unified_send_ocl_cmd(wma->wmi_handle, ocl_params);
}
/** /**
* wma_get_arp_stats_handler() - handle arp stats data * wma_get_arp_stats_handler() - handle arp stats data
* indicated by FW * indicated by FW