diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 4faa84f722..1d6600a437 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -396,6 +396,15 @@ QDF_STATUS wmi_unified_vdev_down_send(void *wmi_hdl, QDF_STATUS wmi_unified_vdev_start_send(void *wmi_hdl, struct vdev_start_params *req); +/** + * wmi_unified_vdev_set_nac_rssi_send() - send NAC_RSSI command to fw + * @param wmi_handle : handle to WMI + * @param 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); QDF_STATUS wmi_unified_hidden_ssid_vdev_restart_send(void *wmi_hdl, struct hidden_ssid_vdev_restart_params *restart_params); @@ -1561,6 +1570,17 @@ QDF_STATUS wmi_extract_vdev_extd_stats(void *wmi_hdl, void *evt_buf, QDF_STATUS wmi_extract_bcn_stats(void *wmi_hdl, void *evt_buf, uint32_t index, wmi_host_bcn_stats *vdev_bcn_stats); +/** + * 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); + QDF_STATUS wmi_unified_send_power_dbg_cmd(void *wmi_hdl, struct wmi_power_dbg_params *param); diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 5cbcd8edeb..85ad42992f 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -765,6 +765,22 @@ struct vdev_start_params { bool ldpc_rx_enabled; }; +/** + * struct vdev_scan_nac_rssi_params - NAC_RSSI cmd parameter + * @vdev_id: vdev id + * @bssid_addr: BSSID address + * @client_addr: client address + * @chan_num: channel number + * @action:NAC_RSSI action, + */ +struct vdev_scan_nac_rssi_params { + uint32_t vdev_id; + uint8_t bssid_addr[IEEE80211_ADDR_LEN]; + uint8_t client_addr[IEEE80211_ADDR_LEN]; + uint32_t chan_num; + uint32_t action; /* WMI_FILTER_NAC_RSSI_ACTION */ +}; + /** * struct hidden_ssid_vdev_restart_params - * vdev restart cmd parameter @@ -880,6 +896,7 @@ typedef enum { WMI_HOST_REQUEST_INST_STAT = 0x40, WMI_HOST_REQUEST_PEER_EXTD_STAT = 0x80, WMI_HOST_REQUEST_VDEV_EXTD_STAT = 0x100, + WMI_HOST_REQUEST_NAC_RSSI = 0x200, WMI_HOST_REQUEST_BCN_STAT = 0x800, } wmi_host_stats_id; @@ -5423,6 +5440,20 @@ typedef struct { uint32_t reserved[13]; } wmi_host_vdev_extd_stats; +/** + * struct wmi_host_vdev_nac_rssi_event - VDEV nac rssi stats + * @vdev_id: unique id identifying the VDEV, generated by the caller + * @last_rssi: rssi + * @avg_rssi: averge rssi + * @rssi_seq_num: rssi sequence number + */ +struct wmi_host_vdev_nac_rssi_event { + uint32_t vdev_id; + uint32_t last_rssi; + uint32_t avg_rssi; + uint32_t rssi_seq_num; +}; + /** * struct wmi_host_peer_stats - peer stats * @peer_macaddr: peer MAC address diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 0ebf30cb6f..ef94328640 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -212,6 +212,9 @@ QDF_STATUS (*send_vdev_down_cmd)(wmi_unified_t wmi, QDF_STATUS (*send_vdev_start_cmd)(wmi_unified_t wmi, struct vdev_start_params *req); +QDF_STATUS (*send_vdev_set_nac_rssi_cmd)(wmi_unified_t wmi, + struct vdev_scan_nac_rssi_params *req); + QDF_STATUS (*send_hidden_ssid_vdev_restart_cmd)(wmi_unified_t wmi_handle, struct hidden_ssid_vdev_restart_params *restart_params); @@ -1320,6 +1323,9 @@ QDF_STATUS (*extract_atf_token_info_ev)(wmi_unified_t wmi_handle, QDF_STATUS (*extract_vdev_extd_stats)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t index, wmi_host_vdev_extd_stats *vdev_extd_stats); +QDF_STATUS (*extract_vdev_nac_rssi_stats)(wmi_unified_t wmi_handle, void *evt_buf, + struct wmi_host_vdev_nac_rssi_event *vdev_nac_rssi_stats); + QDF_STATUS (*extract_bcn_stats)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t index, wmi_host_bcn_stats *bcn_stats); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 7e814bd1a2..802a4e64a8 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/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/src/wmi_unified_non_tlv.c b/wmi/src/wmi_unified_non_tlv.c index 720b3e057f..73f57b335a 100644 --- a/wmi/src/wmi_unified_non_tlv.c +++ b/wmi/src/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,