From 34e0131b30f07469cae505b55231e482c005da35 Mon Sep 17 00:00:00 2001 From: Ganesh Kondabattini Date: Mon, 10 Jul 2017 11:54:11 +0530 Subject: [PATCH] qcacmn: Add wmi command to set limit off chan parameters Add WMI command for setting limit off channel command parameters to firmware. CRs-Fixed: 2068307 Change-Id: Ia99f1b4d4fe33082a561c9307af9d76ae16d8be4 --- wmi/inc/wmi_unified_api.h | 3 ++ wmi/inc/wmi_unified_param.h | 16 ++++++++++ wmi/inc/wmi_unified_priv.h | 2 ++ wmi/src/wmi_unified_api.c | 20 +++++++++++++ wmi/src/wmi_unified_tlv.c | 59 +++++++++++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+) diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 1e5e72921f..a2ac7018e5 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1508,4 +1508,7 @@ void wmi_print_mgmt_event_log(wmi_unified_t wmi, uint32_t count, QDF_STATUS wmi_unified_send_dbs_scan_sel_params_cmd(void *wmi_hdl, struct wmi_dbs_scan_sel_params *wmi_param); + +QDF_STATUS wmi_unified_send_limit_off_chan_cmd(void *wmi_hdl, + struct wmi_limit_off_chan_param *wmi_param); #endif /* _WMI_UNIFIED_API_H_ */ diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 4490a28d88..c9552e0b47 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -7382,4 +7382,20 @@ struct wmi_dbs_scan_sel_params { uint32_t num_non_dbs_scans[WMI_SCAN_CLIENT_MAX]; }; +/** + * struct wmi_limit_off_chan_param - limit off channel parameters + * @vdev_id: vdev id + * @status: status of the command (enable/disable) + * @max_offchan_time: max off channel time + * @rest_time: home channel time + * @skip_dfs_chans: skip dfs channels during scan + */ +struct wmi_limit_off_chan_param { + uint32_t vdev_id; + bool status; + uint32_t max_offchan_time; + uint32_t rest_time; + bool skip_dfs_chans; +}; + #endif /* _WMI_UNIFIED_PARAM_H_ */ diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 7eb00a25ea..6d1509a58f 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1354,6 +1354,8 @@ uint32_t (*convert_pdev_id_target_to_host)(uint32_t pdev_id); QDF_STATUS (*send_user_country_code_cmd)(wmi_unified_t wmi_handle, uint8_t pdev_id, struct cc_regdmn_s *rd); +QDF_STATUS (*send_limit_off_chan_cmd)(wmi_unified_t wmi_handle, + struct wmi_limit_off_chan_param *limit_off_chan_param); }; struct target_abi_version { diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index a31b327919..72232d2660 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -6699,3 +6699,23 @@ QDF_STATUS wmi_unified_send_dbs_scan_sel_params_cmd(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } + +/** + * wmi_unified_send_limit_off_chan_cmd() - send wmi cmd of limit off channel + * configuration params + * @wmi_hdl: wmi handler + * @limit_off_chan_param: pointer to wmi_limit_off_chan_param + * + * Return: QDF_STATUS_SUCCESS on success and QDF failure reason code on failure + */ +QDF_STATUS wmi_unified_send_limit_off_chan_cmd(void *wmi_hdl, + struct wmi_limit_off_chan_param *limit_off_chan_param) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->send_limit_off_chan_cmd) + return wmi_handle->ops->send_limit_off_chan_cmd(wmi_handle, + limit_off_chan_param); + + return QDF_STATUS_E_FAILURE; +} diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 2112517107..802651b16f 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -18237,6 +18237,63 @@ static QDF_STATUS send_user_country_code_cmd_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +/** + * send_limit_off_chan_cmd_tlv() - send wmi cmd of limit off chan + * configuration params + * @wmi_handle: wmi handler + * @limit_off_chan_param: pointer to wmi_off_chan_param + * + * Return: 0 for success and non zero for failure + */ +static +QDF_STATUS send_limit_off_chan_cmd_tlv(wmi_unified_t wmi_handle, + struct wmi_limit_off_chan_param *limit_off_chan_param) +{ + wmi_vdev_limit_offchan_cmd_fixed_param *cmd; + wmi_buf_t buf; + uint32_t len = sizeof(*cmd); + int err; + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGP("%s: failed to allocate memory for limit off chan cmd", + __func__); + return QDF_STATUS_E_NOMEM; + } + + cmd = (wmi_vdev_limit_offchan_cmd_fixed_param *)wmi_buf_data(buf); + + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_limit_offchan_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_vdev_limit_offchan_cmd_fixed_param)); + + cmd->vdev_id = limit_off_chan_param->vdev_id; + + cmd->flags &= 0; + if (limit_off_chan_param->status) + cmd->flags |= WMI_VDEV_LIMIT_OFFCHAN_ENABLE; + if (limit_off_chan_param->skip_dfs_chans) + cmd->flags |= WMI_VDEV_LIMIT_OFFCHAN_SKIP_DFS; + + cmd->max_offchan_time = limit_off_chan_param->max_offchan_time; + cmd->rest_time = limit_off_chan_param->rest_time; + + WMI_LOGE("%s: vdev_id=%d, flags =%x, max_offchan_time=%d, rest_time=%d", + __func__, cmd->vdev_id, cmd->flags, cmd->max_offchan_time, + cmd->rest_time); + + err = wmi_unified_cmd_send(wmi_handle, buf, + len, WMI_VDEV_LIMIT_OFFCHAN_CMDID); + if (QDF_IS_STATUS_ERROR(err)) { + WMI_LOGE("Failed to send limit off chan cmd err=%d", err); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + struct wmi_ops tlv_ops = { .send_vdev_create_cmd = send_vdev_create_cmd_tlv, .send_vdev_delete_cmd = send_vdev_delete_cmd_tlv, @@ -18619,6 +18676,8 @@ struct wmi_ops tlv_ops = { .extract_reg_11d_new_country_event = extract_reg_11d_new_country_event_tlv, .send_user_country_code_cmd = send_user_country_code_cmd_tlv, + .send_limit_off_chan_cmd = + send_limit_off_chan_cmd_tlv, }; /**