From 8a9c38d608ad535c3e0a1acf014b5130a6568691 Mon Sep 17 00:00:00 2001 From: Chaithanya Garrepalli Date: Thu, 18 Jan 2018 14:19:41 +0530 Subject: [PATCH] qcacmn: WMI support to obtain NAC RSSI Added a WMI command to add and del peer from the list of non associated clients for which the RSSI stats need to be populated Also added event handler to extract the rssi stats from the WMI event Change-Id: I9880c74798c13a52e1498b81735ad78f86fa41b8 CRs-Fixed: 2148773 --- wmi_unified_api.c | 38 +++++++++++++++++ wmi_unified_non_tlv.c | 96 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 133 insertions(+), 1 deletion(-) diff --git a/wmi_unified_api.c b/wmi_unified_api.c index 7e814bd1a2..802a4e64a8 100644 --- a/wmi_unified_api.c +++ b/wmi_unified_api.c @@ -121,6 +121,24 @@ QDF_STATUS wmi_unified_vdev_start_send(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } +/** + * wmi_unified_vdev_set_nac_rssi_send() - send NAC_RSSI command to fw + * @wmi: wmi handle + * @req: pointer to hold nac rssi request data + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_vdev_set_nac_rssi_send(void *wmi_hdl, + struct vdev_scan_nac_rssi_params *req) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->send_vdev_set_nac_rssi_cmd) + return wmi_handle->ops->send_vdev_set_nac_rssi_cmd(wmi_handle, req); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_unified_hidden_ssid_vdev_restart_send() - restart vdev to set hidden ssid * @wmi: wmi handle @@ -6565,6 +6583,26 @@ QDF_STATUS wmi_extract_bcn_stats(void *wmi_hdl, void *evt_buf, return QDF_STATUS_E_FAILURE; } +/** + * wmi_extract_vdev_nac_rssi_stats() - extract NAC_RSSI stats from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param vdev_extd_stats: Pointer to hold nac rssi stats + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_vdev_nac_rssi_stats(void *wmi_hdl, void *evt_buf, + struct wmi_host_vdev_nac_rssi_event *vdev_nac_rssi_stats) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->extract_vdev_nac_rssi_stats) + return wmi_handle->ops->extract_vdev_nac_rssi_stats(wmi_handle, + evt_buf, vdev_nac_rssi_stats); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_unified_send_adapt_dwelltime_params_cmd() - send wmi cmd of * adaptive dwelltime configuration params diff --git a/wmi_unified_non_tlv.c b/wmi_unified_non_tlv.c index 720b3e057f..73f57b335a 100644 --- a/wmi_unified_non_tlv.c +++ b/wmi_unified_non_tlv.c @@ -225,6 +225,41 @@ functions in OL layer */ } +/** + * send_vdev_set_nac_rssi_cmd_non_tlv() - send set NAC_RSSI command to fw + * @wmi: wmi handle + * @param: Pointer to hold nac rssi stats + * + * Return: 0 for success or error code + */ +QDF_STATUS send_vdev_set_nac_rssi_cmd_non_tlv(wmi_unified_t wmi, + struct vdev_scan_nac_rssi_params *param) +{ + wmi_vdev_scan_nac_rssi_config_cmd *cmd; + wmi_buf_t buf; + int len = sizeof(wmi_vdev_scan_nac_rssi_config_cmd); + + buf = wmi_buf_alloc(wmi, len); + if (!buf) { + qdf_print("%s:wmi_buf_alloc failed\n", __func__); + return QDF_STATUS_E_NOMEM; + } + + cmd = (wmi_vdev_scan_nac_rssi_config_cmd *)wmi_buf_data(buf); + cmd->vdev_id = param->vdev_id; + cmd->action = param->action; + cmd->chan_num = param->chan_num; + WMI_CHAR_ARRAY_TO_MAC_ADDR(param->bssid_addr, &cmd->bssid_addr); + WMI_CHAR_ARRAY_TO_MAC_ADDR(param->client_addr, &cmd->client_addr); + if (wmi_unified_cmd_send(wmi, buf, len, WMI_VDEV_SET_SCAN_NAC_RSSI_CMDID)) { + qdf_print("%s: ERROR: Host unable to send LOWI request to FW\n", __func__); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + /** * send_vdev_set_neighbour_rx_cmd_non_tlv() - set neighbour rx param in fw * @wmi_handle: wmi handle @@ -1408,6 +1443,8 @@ static uint32_t get_stats_id_non_tlv(wmi_host_stats_id host_stats_id) stats_id |= WMI_REQUEST_INST_STAT; if (host_stats_id & WMI_HOST_REQUEST_PEER_EXTD_STAT) stats_id |= WMI_REQUEST_PEER_EXTD_STAT; + if (host_stats_id & WMI_HOST_REQUEST_NAC_RSSI) + stats_id |= WMI_REQUEST_NAC_RSSI_STAT; return stats_id; } @@ -7561,8 +7598,15 @@ static QDF_STATUS extract_all_stats_counts_non_tlv(wmi_unified_t wmi_handle, wmi_host_stats_event *stats_param) { wmi_stats_event *ev = (wmi_stats_event *) evt_buf; + wmi_stats_id stats_id = ev->stats_id; + wmi_host_stats_id nac_rssi_ev = 0; - switch (ev->stats_id) { + if (stats_id & WMI_REQUEST_NAC_RSSI_STAT) { + nac_rssi_ev = WMI_HOST_REQUEST_NAC_RSSI; + stats_id &= ~WMI_REQUEST_NAC_RSSI_STAT; + } + + switch (stats_id) { case WMI_REQUEST_PEER_STAT: stats_param->stats_id |= WMI_HOST_REQUEST_PEER_STAT; break; @@ -7583,11 +7627,15 @@ static QDF_STATUS extract_all_stats_counts_non_tlv(wmi_unified_t wmi_handle, stats_param->stats_id |= WMI_HOST_REQUEST_VDEV_EXTD_STAT; break; + case WMI_REQUEST_PDEV_EXT2_STAT: + stats_param->stats_id |= nac_rssi_ev; + break; default: stats_param->stats_id = 0; break; } + stats_param->num_pdev_stats = ev->num_pdev_stats; stats_param->num_pdev_ext_stats = ev->num_pdev_ext_stats; stats_param->num_vdev_stats = ev->num_vdev_stats; @@ -7914,6 +7962,50 @@ static QDF_STATUS extract_vdev_extd_stats_non_tlv(wmi_unified_t wmi_handle, } return QDF_STATUS_SUCCESS; } +/** + * extract_vdev_nac_rssi_stats_non_tlv() - extract vdev NAC_RSSI stats from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param vdev_nac_rssi_event: Pointer to hold vdev NAC_RSSI stats + * + * Return: 0 for success or error code + */ +static QDF_STATUS extract_vdev_nac_rssi_stats_non_tlv(wmi_unified_t wmi_handle, + void *evt_buf, struct wmi_host_vdev_nac_rssi_event *vdev_nac_rssi_stats) +{ + uint8_t *pdata = ((wmi_stats_event *)evt_buf)->data; + + if (WMI_REQUEST_NAC_RSSI_STAT & + ((wmi_stats_event *)evt_buf)->stats_id) { + + + struct wmi_host_vdev_nac_rssi_event *ev = (struct wmi_host_vdev_nac_rssi_event *) + ((pdata) + + ((((wmi_stats_event *)evt_buf)->num_pdev_stats) * + sizeof(wmi_pdev_stats)) + + ((((wmi_stats_event *)evt_buf)->num_pdev_ext_stats) * + sizeof(wmi_pdev_ext_stats)) + + ((((wmi_stats_event *)evt_buf)->num_vdev_stats) * + sizeof(wmi_vdev_stats)) + + ((((wmi_stats_event *)evt_buf)->num_peer_stats) * + sizeof(wmi_peer_stats)) + + ((((wmi_stats_event *)evt_buf)->num_bcnflt_stats) * + sizeof(wmi_bcnfilter_stats_t)) + + ((WMI_REQUEST_PEER_EXTD_STAT & + ((wmi_stats_event *)evt_buf)->stats_id) ? ((((wmi_stats_event *)evt_buf)->num_peer_stats) * + sizeof(wmi_peer_extd_stats)) : 0) + + ((WMI_REQUEST_VDEV_EXTD_STAT & + ((wmi_stats_event *)evt_buf)->stats_id) ? ((((wmi_stats_event *)evt_buf)->num_vdev_stats)* + sizeof(wmi_vdev_extd_stats)) : 0) + + ((((wmi_stats_event *)evt_buf)->num_pdev_stats) * + (sizeof(wmi_pdev_ext2_stats)))); + + OS_MEMCPY(vdev_nac_rssi_stats, ev, + sizeof(struct wmi_host_vdev_nac_rssi_event)); + } + + return QDF_STATUS_SUCCESS; +} /** * extract_chan_stats_non_tlv() - extract chan stats from event @@ -8399,6 +8491,7 @@ struct wmi_ops non_tlv_ops = { .send_thermal_mitigation_param_cmd = send_thermal_mitigation_param_cmd_non_tlv, .send_vdev_start_cmd = send_vdev_start_cmd_non_tlv, + .send_vdev_set_nac_rssi_cmd = send_vdev_set_nac_rssi_cmd_non_tlv, .send_vdev_stop_cmd = send_vdev_stop_cmd_non_tlv, .send_vdev_set_neighbour_rx_cmd = send_vdev_set_neighbour_rx_cmd_non_tlv, @@ -8526,6 +8619,7 @@ struct wmi_ops non_tlv_ops = { .extract_tx_data_traffic_ctrl_ev = extract_tx_data_traffic_ctrl_ev_non_tlv, .extract_vdev_extd_stats = extract_vdev_extd_stats_non_tlv, + .extract_vdev_nac_rssi_stats = extract_vdev_nac_rssi_stats_non_tlv, .extract_fips_event_data = extract_fips_event_data_non_tlv, .extract_mumimo_tx_count_ev_param = extract_mumimo_tx_count_ev_param_non_tlv,