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,