From ec65bb40ab8d53ed9432c45c562a853be8cdfca5 Mon Sep 17 00:00:00 2001 From: Kiran Kumar Lokere Date: Fri, 30 Jun 2017 19:13:02 -0700 Subject: [PATCH] qcacmn: Add support to process channel avoidance event Add support to process channel avoidance event Change-Id: I19ce742406a4778ac0f279faf0bf853bc9069eb0 CRs-Fixed: 2080241 --- wmi_unified_reg_api.c | 14 ++++++++++++ wmi_unified_tlv.c | 51 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/wmi_unified_reg_api.c b/wmi_unified_reg_api.c index f53e3803bb..32864f8d77 100644 --- a/wmi_unified_reg_api.c +++ b/wmi_unified_reg_api.c @@ -101,3 +101,17 @@ QDF_STATUS wmi_unified_set_user_country_code_cmd_send(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } + +QDF_STATUS wmi_extract_reg_ch_avoid_event(void *wmi_hdl, + uint8_t *evt_buf, + struct ch_avoid_ind_type *ch_avoid_ind, + uint32_t len) +{ + struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; + + if (wmi_handle->ops->extract_reg_ch_avoid_event) + return wmi_handle->ops->extract_reg_ch_avoid_event( + wmi_handle, evt_buf, ch_avoid_ind, len); + + return QDF_STATUS_E_FAILURE; +} diff --git a/wmi_unified_tlv.c b/wmi_unified_tlv.c index db43ca3b23..01294e7ebb 100644 --- a/wmi_unified_tlv.c +++ b/wmi_unified_tlv.c @@ -18035,6 +18035,55 @@ static QDF_STATUS extract_reg_11d_new_country_event_tlv( return QDF_STATUS_SUCCESS; } + +static QDF_STATUS extract_reg_ch_avoid_event_tlv( + wmi_unified_t wmi_handle, uint8_t *evt_buf, + struct ch_avoid_ind_type *ch_avoid_ind, uint32_t len) +{ + wmi_avoid_freq_ranges_event_fixed_param *afr_fixed_param; + wmi_avoid_freq_range_desc *afr_desc; + uint32_t num_freq_ranges, freq_range_idx; + WMI_WLAN_FREQ_AVOID_EVENTID_param_tlvs *param_buf = + (WMI_WLAN_FREQ_AVOID_EVENTID_param_tlvs *) evt_buf; + + if (!param_buf) { + WMI_LOGE("Invalid channel avoid event buffer"); + return QDF_STATUS_E_INVAL; + } + + afr_fixed_param = param_buf->fixed_param; + if (!afr_fixed_param) { + WMI_LOGE("Invalid channel avoid event fixed param buffer"); + return QDF_STATUS_E_INVAL; + } + + if (!ch_avoid_ind) { + WMI_LOGE("Invalid channel avoid indication buffer"); + return QDF_STATUS_E_INVAL; + } + num_freq_ranges = (afr_fixed_param->num_freq_ranges > + CH_AVOID_MAX_RANGE) ? CH_AVOID_MAX_RANGE : + afr_fixed_param->num_freq_ranges; + + WMI_LOGD("Channel avoid event received with %d ranges", + num_freq_ranges); + + ch_avoid_ind->ch_avoid_range_cnt = num_freq_ranges; + afr_desc = (wmi_avoid_freq_range_desc *)(param_buf->avd_freq_range); + for (freq_range_idx = 0; freq_range_idx < num_freq_ranges; + freq_range_idx++) { + ch_avoid_ind->avoid_freq_range[freq_range_idx].start_freq = + afr_desc->start_freq; + ch_avoid_ind->avoid_freq_range[freq_range_idx].end_freq = + afr_desc->end_freq; + WMI_LOGD("range %d tlv id %u, start freq %u, end freq %u", + freq_range_idx, afr_desc->tlv_header, + afr_desc->start_freq, afr_desc->end_freq); + afr_desc++; + } + + return QDF_STATUS_SUCCESS; +} #ifdef DFS_COMPONENT_ENABLE /** * extract_dfs_cac_complete_event_tlv() - extract cac complete event @@ -18678,6 +18727,8 @@ struct wmi_ops tlv_ops = { .send_user_country_code_cmd = send_user_country_code_cmd_tlv, .send_limit_off_chan_cmd = send_limit_off_chan_cmd_tlv, + .extract_reg_ch_avoid_event = + extract_reg_ch_avoid_event_tlv, }; /**