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
这个提交包含在:
Shaakir Mohamed
2019-02-22 11:16:16 -08:00
提交者 nshrivas
父节点 ce7a81cbed
当前提交 9ff68da6e5
修改 7 个文件,包含 273 行新增2 行删除

查看文件

@@ -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;