Browse Source

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
Chaithanya Garrepalli 7 years ago
parent
commit
b265cca820

+ 20 - 0
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);
 

+ 31 - 0
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

+ 6 - 0
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);
 

+ 38 - 0
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

+ 95 - 1
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;
+
+	if (stats_id & WMI_REQUEST_NAC_RSSI_STAT) {
+		nac_rssi_ev = WMI_HOST_REQUEST_NAC_RSSI;
+		stats_id &= ~WMI_REQUEST_NAC_RSSI_STAT;
+	}
 
-	switch (ev->stats_id) {
+	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,