summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wmi/inc/wmi_unified_api.h24
-rw-r--r--wmi/inc/wmi_unified_param.h52
-rw-r--r--wmi/inc/wmi_unified_priv.h6
-rw-r--r--wmi/src/wmi_unified_api.c24
-rw-r--r--wmi/src/wmi_unified_tlv.c146
5 files changed, 252 insertions, 0 deletions
diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h
index ab275c11217e..dfc100e4cb3a 100644
--- a/wmi/inc/wmi_unified_api.h
+++ b/wmi/inc/wmi_unified_api.h
@@ -1506,4 +1506,28 @@ QDF_STATUS wmi_unified_send_dbs_scan_sel_params_cmd(void *wmi_hdl,
QDF_STATUS wmi_unified_send_limit_off_chan_cmd(void *wmi_hdl,
struct wmi_limit_off_chan_param *wmi_param);
+
+/**
+ * wmi_unified_offload_11k_cmd() - send 11k offload command
+ * @wmi_hdl: wmi handle
+ * @params: 11k offload params
+ *
+ * This function passes the 11k offload command params to FW
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_offload_11k_cmd(void *wmi_hdl,
+ struct wmi_11k_offload_params *params);
+
+/**
+ * wmi_unified_invoke_neighbor_report_cmd() - send invoke neighbor report cmd
+ * @wmi_hdl: wmi handle
+ * @params: invoke neighbor report params
+ *
+ * This function passes the invoke neighbor report command to fw
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_invoke_neighbor_report_cmd(void *wmi_hdl,
+ struct wmi_invoke_neighbor_report_params *params);
#endif /* _WMI_UNIFIED_API_H_ */
diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h
index 5d8406b8c5ec..7b8a0c8c721c 100644
--- a/wmi/inc/wmi_unified_param.h
+++ b/wmi/inc/wmi_unified_param.h
@@ -7548,5 +7548,57 @@ struct wmi_mawc_roam_params {
uint8_t rssi_stationary_low_adjust;
};
+/**
+ * @time_offset: time offset after 11k offload command to trigger a neighbor
+ * report request (in seconds)
+ * @low_rssi_offset: Offset from rssi threshold to trigger a neighbor
+ * report request (in dBm)
+ * @bmiss_count_trigger: Number of beacon miss events to trigger neighbor
+ * report request
+ * @per_threshold_offset: offset from PER threshold to trigger neighbor
+ * report request (in %)
+ * @neighbor_report_cache_timeout: timeout after which new trigger can enable
+ * sending of a neighbor report request (in seconds)
+ * @max_neighbor_report_req_cap: max number of neighbor report requests that
+ * can be sent to the peer in the current session
+ * @ssid: Current connect SSID info
+ */
+struct wmi_11k_offload_neighbor_report_params {
+ uint32_t time_offset;
+ uint32_t low_rssi_offset;
+ uint32_t bmiss_count_trigger;
+ uint32_t per_threshold_offset;
+ uint32_t neighbor_report_cache_timeout;
+ uint32_t max_neighbor_report_req_cap;
+ struct mac_ssid ssid;
+};
+
+/**
+ * struct wmi_11k_offload_params - offload 11k features to FW
+ * @vdev_id: vdev id
+ * @offload_11k_bitmask: bitmask to specify offloaded features
+ * B0: Neighbor Report Request offload
+ * B1-B31: Reserved
+ * @neighbor_report_params: neighbor report offload params
+ */
+struct wmi_11k_offload_params {
+ uint32_t vdev_id;
+ uint32_t offload_11k_bitmask;
+ struct wmi_11k_offload_neighbor_report_params neighbor_report_params;
+};
+
+/**
+ * struct wmi_invoke_neighbor_report_params - Invoke neighbor report request
+ * from IW to FW
+ * @vdev_id: vdev id
+ * @send_resp_to_host: bool to send response to host or not
+ * @ssid: ssid given from the IW command
+ */
+struct wmi_invoke_neighbor_report_params {
+ uint32_t vdev_id;
+ uint32_t send_resp_to_host;
+ struct mac_ssid ssid;
+};
+
#endif /* _WMI_UNIFIED_PARAM_H_ */
diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h
index 27f9f57949c3..5a89a5c457c9 100644
--- a/wmi/inc/wmi_unified_priv.h
+++ b/wmi/inc/wmi_unified_priv.h
@@ -1218,6 +1218,12 @@ QDF_STATUS (*send_limit_off_chan_cmd)(wmi_unified_t wmi_handle,
QDF_STATUS (*send_wow_timer_pattern_cmd)(wmi_unified_t wmi_handle,
uint8_t vdev_id, uint32_t cookie, uint32_t time);
+
+QDF_STATUS (*send_offload_11k_cmd)(wmi_unified_t wmi_handle,
+ struct wmi_11k_offload_params *params);
+
+QDF_STATUS (*send_invoke_neighbor_report_cmd)(wmi_unified_t wmi_handle,
+ struct wmi_invoke_neighbor_report_params *params);
};
struct target_abi_version {
diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c
index 976d17124587..3e97816a6245 100644
--- a/wmi/src/wmi_unified_api.c
+++ b/wmi/src/wmi_unified_api.c
@@ -6478,3 +6478,27 @@ QDF_STATUS wmi_unified_send_limit_off_chan_cmd(void *wmi_hdl,
return QDF_STATUS_E_FAILURE;
}
+
+QDF_STATUS wmi_unified_offload_11k_cmd(void *wmi_hdl,
+ struct wmi_11k_offload_params *params)
+{
+ wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+ if (wmi_handle->ops->send_offload_11k_cmd)
+ return wmi_handle->ops->send_offload_11k_cmd(
+ wmi_handle, params);
+
+ return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS wmi_unified_invoke_neighbor_report_cmd(void *wmi_hdl,
+ struct wmi_invoke_neighbor_report_params *params)
+{
+ wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+ if (wmi_handle->ops->send_invoke_neighbor_report_cmd)
+ return wmi_handle->ops->send_invoke_neighbor_report_cmd(
+ wmi_handle, params);
+
+ return QDF_STATUS_E_FAILURE;
+}
diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c
index 0eb3190dac94..058f16b822d6 100644
--- a/wmi/src/wmi_unified_tlv.c
+++ b/wmi/src/wmi_unified_tlv.c
@@ -14464,6 +14464,150 @@ send_cmd:
return status;
}
+/**
+ * send_offload_11k_cmd_tlv() - send wmi cmd with 11k offload params
+ * @wmi_handle: wmi handler
+ * @params: pointer to 11k offload params
+ *
+ * Return: 0 for success and non zero for failure
+ */
+static QDF_STATUS send_offload_11k_cmd_tlv(wmi_unified_t wmi_handle,
+ struct wmi_11k_offload_params *params)
+{
+ wmi_11k_offload_report_fixed_param *cmd;
+ wmi_buf_t buf;
+ QDF_STATUS status;
+ uint8_t *buf_ptr;
+ wmi_neighbor_report_11k_offload_tlv_param
+ *neighbor_report_offload_params;
+ wmi_neighbor_report_offload *neighbor_report_offload;
+
+ uint32_t len = sizeof(*cmd);
+
+ if (params->offload_11k_bitmask &
+ WMI_11K_OFFLOAD_BITMAP_NEIGHBOR_REPORT_REQ)
+ len += WMI_TLV_HDR_SIZE +
+ sizeof(wmi_neighbor_report_11k_offload_tlv_param);
+
+ buf = wmi_buf_alloc(wmi_handle, len);
+ if (!buf) {
+ WMI_LOGP("%s: failed to allocate memory for 11k offload params",
+ __func__);
+ return QDF_STATUS_E_NOMEM;
+ }
+
+ buf_ptr = (uint8_t *) wmi_buf_data(buf);
+ cmd = (wmi_11k_offload_report_fixed_param *) buf_ptr;
+
+ WMITLV_SET_HDR(&cmd->tlv_header,
+ WMITLV_TAG_STRUC_wmi_offload_11k_report_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_11k_offload_report_fixed_param));
+
+ cmd->vdev_id = params->vdev_id;
+ cmd->offload_11k = params->offload_11k_bitmask;
+
+ if (params->offload_11k_bitmask &
+ WMI_11K_OFFLOAD_BITMAP_NEIGHBOR_REPORT_REQ) {
+ buf_ptr += sizeof(wmi_11k_offload_report_fixed_param);
+
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+ sizeof(wmi_neighbor_report_11k_offload_tlv_param));
+ buf_ptr += WMI_TLV_HDR_SIZE;
+
+ neighbor_report_offload_params =
+ (wmi_neighbor_report_11k_offload_tlv_param *)buf_ptr;
+ WMITLV_SET_HDR(&neighbor_report_offload_params->tlv_header,
+ WMITLV_TAG_STRUC_wmi_neighbor_report_offload_tlv_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_neighbor_report_11k_offload_tlv_param));
+
+ neighbor_report_offload = &neighbor_report_offload_params->
+ neighbor_rep_ofld_params;
+
+ neighbor_report_offload->time_offset =
+ params->neighbor_report_params.time_offset;
+ neighbor_report_offload->low_rssi_offset =
+ params->neighbor_report_params.low_rssi_offset;
+ neighbor_report_offload->bmiss_count_trigger =
+ params->neighbor_report_params.bmiss_count_trigger;
+ neighbor_report_offload->per_threshold_offset =
+ params->neighbor_report_params.per_threshold_offset;
+ neighbor_report_offload->neighbor_report_cache_timeout =
+ params->neighbor_report_params.
+ neighbor_report_cache_timeout;
+ neighbor_report_offload->max_neighbor_report_req_cap =
+ params->neighbor_report_params.
+ max_neighbor_report_req_cap;
+ neighbor_report_offload->ssid.ssid_len =
+ params->neighbor_report_params.ssid.length;
+ qdf_mem_copy(neighbor_report_offload->ssid.ssid,
+ &params->neighbor_report_params.ssid.mac_ssid,
+ neighbor_report_offload->ssid.ssid_len);
+ }
+
+ status = wmi_unified_cmd_send(wmi_handle, buf, len,
+ WMI_11K_OFFLOAD_REPORT_CMDID);
+ if (status != QDF_STATUS_SUCCESS) {
+ WMI_LOGE("%s: failed to send 11k offload command %d",
+ __func__, status);
+ wmi_buf_free(buf);
+ }
+
+ return status;
+}
+
+/**
+ * send_invoke_neighbor_report_cmd_tlv() - send invoke 11k neighbor report
+ * command
+ * @wmi_handle: wmi handler
+ * @params: pointer to neighbor report invoke params
+ *
+ * Return: 0 for success and non zero for failure
+ */
+static QDF_STATUS send_invoke_neighbor_report_cmd_tlv(wmi_unified_t wmi_handle,
+ struct wmi_invoke_neighbor_report_params *params)
+{
+ wmi_11k_offload_invoke_neighbor_report_fixed_param *cmd;
+ wmi_buf_t buf;
+ QDF_STATUS status;
+ uint8_t *buf_ptr;
+ uint32_t len = sizeof(*cmd);
+
+ buf = wmi_buf_alloc(wmi_handle, len);
+ if (!buf) {
+ WMI_LOGP("%s:failed to allocate memory for neighbor invoke cmd",
+ __func__);
+ return QDF_STATUS_E_NOMEM;
+ }
+
+ buf_ptr = (uint8_t *) wmi_buf_data(buf);
+ cmd = (wmi_11k_offload_invoke_neighbor_report_fixed_param *) buf_ptr;
+
+ WMITLV_SET_HDR(&cmd->tlv_header,
+ WMITLV_TAG_STRUC_wmi_invoke_neighbor_report_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_11k_offload_invoke_neighbor_report_fixed_param));
+
+ cmd->vdev_id = params->vdev_id;
+ cmd->flags = params->send_resp_to_host;
+
+ cmd->ssid.ssid_len = params->ssid.length;
+ qdf_mem_copy(cmd->ssid.ssid,
+ &params->ssid.mac_ssid,
+ cmd->ssid.ssid_len);
+
+ status = wmi_unified_cmd_send(wmi_handle, buf, len,
+ WMI_11K_INVOKE_NEIGHBOR_REPORT_CMDID);
+ if (status != QDF_STATUS_SUCCESS) {
+ WMI_LOGE("%s: failed to send invoke neighbor report command %d",
+ __func__, status);
+ wmi_buf_free(buf);
+ }
+
+ return status;
+}
+
struct wmi_ops tlv_ops = {
.send_vdev_create_cmd = send_vdev_create_cmd_tlv,
.send_vdev_delete_cmd = send_vdev_delete_cmd_tlv,
@@ -14755,6 +14899,8 @@ struct wmi_ops tlv_ops = {
send_roam_scan_send_hlp_cmd_tlv,
#endif
.send_wow_timer_pattern_cmd = send_wow_timer_pattern_cmd_tlv,
+ .send_offload_11k_cmd = send_offload_11k_cmd_tlv,
+ .send_invoke_neighbor_report_cmd = send_invoke_neighbor_report_cmd_tlv,
};
#ifdef WMI_TLV_AND_NON_TLV_SUPPORT