qcacmn: Add WMI support for Agile DFS feature
Add WMI commands and event to support Agile DFS feature: 1)WMI send adfs channel config command 2)WMI send adfs o-cac abort command 3)WMI extract function to handle O-CAC complete event from target Change-Id: Ib11d042bf06c786ab553aa28091145b620fbd551 CRs-Fixed: 2385536
This commit is contained in:

committed by
nshrivas

parent
ce7a81cbed
commit
9ff68da6e5
@@ -1366,6 +1366,30 @@ QDF_STATUS wmi_unified_dfs_phyerr_offload_en_cmd(void *wmi_hdl,
|
||||
QDF_STATUS wmi_unified_dfs_phyerr_offload_dis_cmd(void *wmi_hdl,
|
||||
uint32_t pdev_id);
|
||||
|
||||
#ifdef QCA_SUPPORT_AGILE_DFS
|
||||
/**
|
||||
* wmi_unified_send_vdev_adfs_ch_cfg_cmd() - send adfs channel config command
|
||||
* @wmi_handle: wmi handle
|
||||
* @vdev_adfs_ch_cfg_params: adfs channel config params
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS
|
||||
wmi_unified_send_vdev_adfs_ch_cfg_cmd(void *wmi_hdl,
|
||||
struct vdev_adfs_ch_cfg_params *param);
|
||||
|
||||
/**
|
||||
* wmi_unified_send_vdev_adfs_ocac_abort_cmd() - send adfs o-cac abort command
|
||||
* @wmi_handle: wmi handle
|
||||
* @vdev_adfs_abort_params: adfs channel o-cac abort params
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS
|
||||
wmi_unified_send_vdev_adfs_ocac_abort_cmd(void *wmi_hdl,
|
||||
struct vdev_adfs_abort_params *param);
|
||||
#endif
|
||||
|
||||
QDF_STATUS wmi_unified_set_country_cmd_send(void *wmi_hdl,
|
||||
struct set_country *param);
|
||||
|
||||
|
@@ -40,6 +40,19 @@ QDF_STATUS wmi_extract_dfs_cac_complete_event(void *wmi_hdl,
|
||||
uint32_t *vdev_id,
|
||||
uint32_t len);
|
||||
|
||||
/**
|
||||
* wmi_extract_dfs_ocac_complete_event() - function to handle off channel
|
||||
* CAC complete event
|
||||
* @handle: wmi handle
|
||||
* @event_buf: event buffer
|
||||
* @vdev_adfs_complete_status: off channel cac complete params
|
||||
*
|
||||
* Return: 0 for success or error code
|
||||
*/
|
||||
QDF_STATUS
|
||||
wmi_extract_dfs_ocac_complete_event(void *wmi_hdl, uint8_t *evt_buf,
|
||||
struct vdev_adfs_complete_status *param);
|
||||
|
||||
/**
|
||||
* wmi_extract_dfs_radar_detection_event() - function to handle radar event
|
||||
* @handle: wma handle
|
||||
|
@@ -1404,6 +1404,36 @@ struct multiple_vdev_restart_params {
|
||||
uint32_t vdev_ids[WMI_HOST_PDEV_MAX_VDEVS];
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef QCA_SUPPORT_AGILE_DFS
|
||||
/**
|
||||
* struct vdev_adfs_ch_cfg_params - Agile dfs channel set request params
|
||||
* @vdev_id: Vdev indentifier
|
||||
* @ocac_mode: Off Channel CAC mode
|
||||
* @min_duration_ms: Minimum Off channel CAC duration
|
||||
* @max_duration_ms: Maximum Off channel CAC duration
|
||||
* @chan_freq: channel number of precac channel
|
||||
* @chan_width: Precac Channel width
|
||||
* @center_freq: Center frequency of precac channel
|
||||
*/
|
||||
struct vdev_adfs_ch_cfg_params {
|
||||
uint32_t vdev_id;
|
||||
uint32_t ocac_mode; /* WMI_ADFS_OCAC_MODE */
|
||||
uint32_t min_duration_ms;
|
||||
uint32_t max_duration_ms;
|
||||
uint32_t chan_freq;
|
||||
uint32_t chan_width;
|
||||
uint32_t center_freq; /* in MHz */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct vdev_adfs_ch_cfg_params - Agile dfs ocac abort command to stop precac.
|
||||
* @vdev_id: Vdev indentifier
|
||||
*/
|
||||
struct vdev_adfs_abort_params {
|
||||
uint32_t vdev_id;
|
||||
};
|
||||
#endif
|
||||
/**
|
||||
* struct fw_hang_params - fw hang command parameters
|
||||
* @type: 0:unused 1: ASSERT, 2:not respond detect command, 3:simulate ep-full
|
||||
@@ -4746,6 +4776,7 @@ typedef enum {
|
||||
wmi_twt_enable_complete_event_id,
|
||||
wmi_apf_get_vdev_work_memory_resp_event_id,
|
||||
wmi_roam_scan_stats_event_id,
|
||||
wmi_vdev_ocac_complete_event_id,
|
||||
|
||||
#ifdef OL_ATH_SMART_LOGGING
|
||||
wmi_debug_fatal_condition_eventid,
|
||||
@@ -5307,6 +5338,7 @@ struct wmi_host_fw_abi_ver {
|
||||
* @gtk_offload_max_vdev: Max vdevs for GTK offload
|
||||
* @num_msdu_desc: Number of msdu desc
|
||||
* @max_frag_entries: Max frag entries
|
||||
* @agile_capability: Target Agile Capability
|
||||
* End common
|
||||
* @max_peer_ext_stats: Max peer EXT stats
|
||||
* @smart_ant_cap: Smart antenna capabilities
|
||||
@@ -5381,6 +5413,7 @@ typedef struct {
|
||||
uint32_t num_msdu_desc; /* Number of msdu desc */
|
||||
uint32_t max_frag_entries;
|
||||
uint32_t scheduler_params;
|
||||
uint32_t agile_capability;
|
||||
/* End common */
|
||||
|
||||
/* Added for Beeliner */
|
||||
|
@@ -1590,7 +1590,14 @@ QDF_STATUS (*send_power_dbg_cmd)(wmi_unified_t wmi_handle,
|
||||
|
||||
QDF_STATUS (*send_multiple_vdev_restart_req_cmd)(wmi_unified_t wmi_handle,
|
||||
struct multiple_vdev_restart_params *param);
|
||||
#ifdef QCA_SUPPORT_AGILE_DFS
|
||||
QDF_STATUS
|
||||
(*send_adfs_ocac_abort_cmd)(wmi_unified_t wmi_handle,
|
||||
struct vdev_adfs_abort_params *param);
|
||||
|
||||
QDF_STATUS (*send_adfs_ch_cfg_cmd)(wmi_unified_t wmi_handle,
|
||||
struct vdev_adfs_ch_cfg_params *param);
|
||||
#endif
|
||||
QDF_STATUS (*send_fw_test_cmd)(wmi_unified_t wmi_handle,
|
||||
struct set_fwtest_params *wmi_fwtest);
|
||||
|
||||
@@ -1715,6 +1722,11 @@ QDF_STATUS (*extract_dfs_cac_complete_event)(wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
uint32_t *vdev_id,
|
||||
uint32_t len);
|
||||
QDF_STATUS
|
||||
(*extract_dfs_ocac_complete_event)(wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct vdev_adfs_complete_status *oca_stats);
|
||||
|
||||
QDF_STATUS (*extract_dfs_radar_detection_event)(wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct radar_found_info *radar_found,
|
||||
|
@@ -4167,6 +4167,34 @@ wmi_unified_dfs_phyerr_offload_en_cmd(void *wmi_hdl,
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
#ifdef QCA_SUPPORT_AGILE_DFS
|
||||
QDF_STATUS
|
||||
wmi_unified_send_vdev_adfs_ch_cfg_cmd(void *wmi_hdl,
|
||||
struct vdev_adfs_ch_cfg_params *param)
|
||||
{
|
||||
wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl;
|
||||
|
||||
if (wmi_handle->ops->send_adfs_ch_cfg_cmd)
|
||||
return wmi_handle->ops->send_adfs_ch_cfg_cmd(
|
||||
wmi_handle,
|
||||
param);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
QDF_STATUS
|
||||
wmi_unified_send_vdev_adfs_ocac_abort_cmd(void *wmi_hdl,
|
||||
struct vdev_adfs_abort_params *param)
|
||||
{
|
||||
wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl;
|
||||
|
||||
if (wmi_handle->ops->send_adfs_ocac_abort_cmd)
|
||||
return wmi_handle->ops->send_adfs_ocac_abort_cmd(
|
||||
wmi_handle,
|
||||
param);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
#endif
|
||||
|
||||
QDF_STATUS
|
||||
wmi_unified_dfs_phyerr_offload_dis_cmd(void *wmi_hdl,
|
||||
uint32_t pdev_id)
|
||||
|
@@ -45,6 +45,22 @@ QDF_STATUS wmi_extract_dfs_cac_complete_event(void *wmi_hdl,
|
||||
}
|
||||
qdf_export_symbol(wmi_extract_dfs_cac_complete_event);
|
||||
|
||||
QDF_STATUS
|
||||
wmi_extract_dfs_ocac_complete_event(void *wmi_hdl,
|
||||
uint8_t *evt_buf,
|
||||
struct vdev_adfs_complete_status *param)
|
||||
{
|
||||
struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl;
|
||||
|
||||
if (wmi_handle && wmi_handle->ops->extract_dfs_ocac_complete_event)
|
||||
return wmi_handle->ops->extract_dfs_ocac_complete_event(
|
||||
wmi_handle, evt_buf, param);
|
||||
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
qdf_export_symbol(wmi_extract_dfs_ocac_complete_event);
|
||||
|
||||
QDF_STATUS wmi_extract_dfs_radar_detection_event(void *wmi_hdl,
|
||||
uint8_t *evt_buf,
|
||||
struct radar_found_info *radar_found,
|
||||
|
@@ -7132,6 +7132,102 @@ static QDF_STATUS send_dfs_phyerr_offload_dis_cmd_tlv(wmi_unified_t wmi_handle,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
#ifdef QCA_SUPPORT_AGILE_DFS
|
||||
static
|
||||
QDF_STATUS send_adfs_ch_cfg_cmd_tlv(wmi_unified_t wmi_handle,
|
||||
struct vdev_adfs_ch_cfg_params *param)
|
||||
{
|
||||
/* wmi_unified_cmd_send set request of agile ADFS channel*/
|
||||
wmi_vdev_adfs_ch_cfg_cmd_fixed_param *cmd;
|
||||
wmi_buf_t buf;
|
||||
QDF_STATUS ret;
|
||||
uint16_t len;
|
||||
|
||||
len = sizeof(*cmd);
|
||||
buf = wmi_buf_alloc(wmi_handle, len);
|
||||
|
||||
if (!buf) {
|
||||
WMI_LOGE("%s : wmi_buf_alloc failed", __func__);
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
}
|
||||
|
||||
cmd = (wmi_vdev_adfs_ch_cfg_cmd_fixed_param *)
|
||||
wmi_buf_data(buf);
|
||||
|
||||
WMITLV_SET_HDR(&cmd->tlv_header,
|
||||
WMITLV_TAG_STRUC_wmi_vdev_adfs_ch_cfg_cmd_fixed_param,
|
||||
WMITLV_GET_STRUCT_TLVLEN
|
||||
(wmi_vdev_adfs_ch_cfg_cmd_fixed_param));
|
||||
|
||||
cmd->vdev_id = param->vdev_id;
|
||||
cmd->ocac_mode = param->ocac_mode;
|
||||
cmd->center_freq = param->center_freq;
|
||||
cmd->chan_freq = param->chan_freq;
|
||||
cmd->chan_width = param->chan_width;
|
||||
cmd->min_duration_ms = param->min_duration_ms;
|
||||
cmd->max_duration_ms = param->max_duration_ms;
|
||||
WMI_LOGD("%s:cmd->vdev_id: %d ,cmd->ocac_mode: %d cmd->center_freq: %d",
|
||||
__func__, cmd->vdev_id, cmd->ocac_mode,
|
||||
cmd->center_freq);
|
||||
|
||||
wmi_mtrace(WMI_VDEV_ADFS_CH_CFG_CMDID, NO_SESSION, 0);
|
||||
ret = wmi_unified_cmd_send(wmi_handle, buf, len,
|
||||
WMI_VDEV_ADFS_CH_CFG_CMDID);
|
||||
|
||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||
WMI_LOGE("%s: Failed to send cmd to fw, ret=%d",
|
||||
__func__, ret);
|
||||
wmi_buf_free(buf);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static
|
||||
QDF_STATUS send_adfs_ocac_abort_cmd_tlv(wmi_unified_t wmi_handle,
|
||||
struct vdev_adfs_abort_params *param)
|
||||
{
|
||||
/*wmi_unified_cmd_send with ocac abort on ADFS channel*/
|
||||
wmi_vdev_adfs_ocac_abort_cmd_fixed_param *cmd;
|
||||
wmi_buf_t buf;
|
||||
QDF_STATUS ret;
|
||||
uint16_t len;
|
||||
|
||||
len = sizeof(*cmd);
|
||||
buf = wmi_buf_alloc(wmi_handle, len);
|
||||
|
||||
if (!buf) {
|
||||
WMI_LOGE("%s : wmi_buf_alloc failed", __func__);
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
}
|
||||
|
||||
cmd = (wmi_vdev_adfs_ocac_abort_cmd_fixed_param *)
|
||||
wmi_buf_data(buf);
|
||||
|
||||
WMITLV_SET_HDR
|
||||
(&cmd->tlv_header,
|
||||
WMITLV_TAG_STRUC_wmi_vdev_adfs_ocac_abort_cmd_fixed_param,
|
||||
WMITLV_GET_STRUCT_TLVLEN
|
||||
(wmi_vdev_adfs_ocac_abort_cmd_fixed_param));
|
||||
|
||||
cmd->vdev_id = param->vdev_id;
|
||||
|
||||
wmi_mtrace(WMI_VDEV_ADFS_OCAC_ABORT_CMDID, NO_SESSION, 0);
|
||||
ret = wmi_unified_cmd_send(wmi_handle, buf, len,
|
||||
WMI_VDEV_ADFS_OCAC_ABORT_CMDID);
|
||||
|
||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||
WMI_LOGE("%s: Failed to send cmd to fw, ret=%d",
|
||||
__func__, ret);
|
||||
wmi_buf_free(buf);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* init_cmd_send_tlv() - send initialization cmd to fw
|
||||
* @wmi_handle: wmi handle
|
||||
@@ -7976,9 +8072,11 @@ static QDF_STATUS extract_ready_event_params_tlv(wmi_unified_t wmi_handle,
|
||||
ev_param->num_extra_mac_addr = ev->num_extra_mac_addr;
|
||||
ev_param->num_total_peer = ev->num_total_peers;
|
||||
ev_param->num_extra_peer = ev->num_extra_peers;
|
||||
/* Agile_cap in ready event is not supported in TLV target */
|
||||
ev_param->agile_capability = false;
|
||||
/* Agile_capability in ready event is supported in TLV target,
|
||||
* as per aDFS FR
|
||||
*/
|
||||
ev_param->max_ast_index = ev->max_ast_index;
|
||||
ev_param->agile_capability = 1;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
@@ -9769,6 +9867,46 @@ static QDF_STATUS extract_dfs_cac_complete_event_tlv(wmi_unified_t wmi_handle,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* extract_dfs_ocac_complete_event_tlv() - extract cac complete event
|
||||
* @wmi_handle: wma handle
|
||||
* @evt_buf: event buffer
|
||||
* @vdev_id: vdev id
|
||||
* @len: length of buffer
|
||||
*
|
||||
* Return: 0 for success or error code
|
||||
*/
|
||||
static QDF_STATUS
|
||||
extract_dfs_ocac_complete_event_tlv(wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct vdev_adfs_complete_status *param)
|
||||
{
|
||||
WMI_VDEV_ADFS_OCAC_COMPLETE_EVENTID_param_tlvs *param_tlvs;
|
||||
wmi_vdev_adfs_ocac_complete_event_fixed_param *ocac_complete_status;
|
||||
|
||||
param_tlvs = (WMI_VDEV_ADFS_OCAC_COMPLETE_EVENTID_param_tlvs *)evt_buf;
|
||||
if (!param_tlvs) {
|
||||
WMI_LOGE("invalid ocac complete event buf");
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
if (!param_tlvs->fixed_param) {
|
||||
WMI_LOGE("invalid param_tlvs->fixed_param");
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
ocac_complete_status = param_tlvs->fixed_param;
|
||||
param->vdev_id = ocac_complete_status->vdev_id;
|
||||
param->chan_freq = ocac_complete_status->chan_freq;
|
||||
param->center_freq = ocac_complete_status->center_freq;
|
||||
param->ocac_status = ocac_complete_status->status;
|
||||
param->chan_width = ocac_complete_status->chan_width;
|
||||
WMI_LOGD("processed ocac complete event vdev %d agile chan %d",
|
||||
param->vdev_id, param->center_freq);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* extract_dfs_radar_detection_event_tlv() - extract radar found event
|
||||
* @wmi_handle: wma handle
|
||||
@@ -11187,6 +11325,10 @@ struct wmi_ops tlv_ops = {
|
||||
.send_action_oui_cmd = send_action_oui_cmd_tlv,
|
||||
#endif
|
||||
.send_dfs_phyerr_offload_en_cmd = send_dfs_phyerr_offload_en_cmd_tlv,
|
||||
#ifdef QCA_SUPPORT_AGILE_DFS
|
||||
.send_adfs_ch_cfg_cmd = send_adfs_ch_cfg_cmd_tlv,
|
||||
.send_adfs_ocac_abort_cmd = send_adfs_ocac_abort_cmd_tlv,
|
||||
#endif
|
||||
.send_dfs_phyerr_offload_dis_cmd = send_dfs_phyerr_offload_dis_cmd_tlv,
|
||||
.extract_reg_chan_list_update_event =
|
||||
extract_reg_chan_list_update_event_tlv,
|
||||
@@ -11198,6 +11340,7 @@ struct wmi_ops tlv_ops = {
|
||||
.extract_rcpi_response_event = extract_rcpi_response_event_tlv,
|
||||
#ifdef DFS_COMPONENT_ENABLE
|
||||
.extract_dfs_cac_complete_event = extract_dfs_cac_complete_event_tlv,
|
||||
.extract_dfs_ocac_complete_event = extract_dfs_ocac_complete_event_tlv,
|
||||
.extract_dfs_radar_detection_event =
|
||||
extract_dfs_radar_detection_event_tlv,
|
||||
.extract_wlan_radar_event_info = extract_wlan_radar_event_info_tlv,
|
||||
@@ -11467,6 +11610,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
|
||||
event_ids[wmi_pdev_fips_event_id] = WMI_PDEV_FIPS_EVENTID;
|
||||
event_ids[wmi_pdev_csa_switch_count_status_event_id] =
|
||||
WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID;
|
||||
event_ids[wmi_vdev_ocac_complete_event_id] =
|
||||
WMI_VDEV_ADFS_OCAC_COMPLETE_EVENTID;
|
||||
event_ids[wmi_reg_chan_list_cc_event_id] = WMI_REG_CHAN_LIST_CC_EVENTID;
|
||||
event_ids[wmi_inst_rssi_stats_event_id] = WMI_INST_RSSI_STATS_EVENTID;
|
||||
event_ids[wmi_pdev_tpc_config_event_id] = WMI_PDEV_TPC_CONFIG_EVENTID;
|
||||
|
Reference in New Issue
Block a user