浏览代码

qcacmn: Add support to get pmf bcn protect stats from fw

To get the pmf beacon stats from firmware, host sets
WMI_REQUEST_PMF_BCN_PROTECT_STAT bit in stats_id param of
WMI_REQUEST_STATS_CMDID command. Firmware supporting pmf beacon
protection stats responds host with stats in wmi_update_stats_id
event.
Hence add support to get PMF beacon protect stats from firmware.

Change-Id: I99efd94ce5367da1312f60251ce7106997dd8bc8
CRs-Fixed: 2705084
Abhishek Ambure 4 年之前
父节点
当前提交
f17e8207ac
共有 5 个文件被更改,包括 82 次插入0 次删除
  1. 12 0
      wmi/inc/wmi_unified_api.h
  2. 14 0
      wmi/inc/wmi_unified_param.h
  3. 3 0
      wmi/inc/wmi_unified_priv.h
  4. 11 0
      wmi/src/wmi_unified_api.c
  5. 42 0
      wmi/src/wmi_unified_cp_stats_tlv.c

+ 12 - 0
wmi/inc/wmi_unified_api.h

@@ -3014,6 +3014,18 @@ QDF_STATUS
 wmi_extract_profile_data(wmi_unified_t wmi_handle, void *evt_buf, uint8_t idx,
 			 wmi_host_wlan_profile_t *profile_data);
 
+/**
+ * wmi_extract_pmf_bcn_protect_stats() - extract pmf bcn stats from event
+ * @wmi_handle: wmi handle
+ * @evt_buf: pointer to event buffer
+ * @bcn_stats: Pointer to hold pmf bcn protect stats
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS
+wmi_extract_pmf_bcn_protect_stats(wmi_unified_t wmi_handle, void *evt_buf,
+				  wmi_host_pmf_bcn_protect_stats *bcn_stats);
+
 /**
  * extract_unit_test() - extract unit test from event
  * @wmi_handle: wmi handle

+ 14 - 0
wmi/inc/wmi_unified_param.h

@@ -796,6 +796,7 @@ typedef enum {
 	WMI_HOST_REQUEST_BCN_STAT_RESET =  0x1000,
 	WMI_HOST_REQUEST_PEER_RETRY_STAT = 0x2000,
 	WMI_HOST_REQUEST_PEER_ADV_STATS = 0x4000,
+	WMI_HOST_REQUEST_PMF_BCN_PROTECT_STAT = 0x8000,
 } wmi_host_stats_id;
 
 typedef struct {
@@ -4157,6 +4158,19 @@ typedef struct {
 	uint32_t	mib_int_count;
 } wmi_host_pdev_stats;
 
+/**
+ * struct wmi_host_pmf_bcn_protect_stats - PMF bcn protect stats
+ * @igtk_mic_fail_cnt: MIC failure count of management packets using IGTK
+ * @igtk_replay_cnt: Replay detection count of management packets using IGTK
+ * @bcn_mic_fail_cnt: MIC failure count of beacon packets using BIGTK
+ * @bcn_replay_cnt: Replay detection count of beacon packets using BIGTK
+ */
+typedef struct {
+	uint32_t igtk_mic_fail_cnt;
+	uint32_t igtk_replay_cnt;
+	uint32_t bcn_mic_fail_cnt;
+	uint32_t bcn_replay_cnt;
+} wmi_host_pmf_bcn_protect_stats;
 
 /**
  * struct wmi_unit_test_event - Structure corresponding to WMI Unit test event

+ 3 - 0
wmi/inc/wmi_unified_priv.h

@@ -1731,6 +1731,9 @@ QDF_STATUS (*extract_all_stats_count)(wmi_unified_t wmi_handle, void *evt_buf,
 QDF_STATUS (*extract_pdev_stats)(wmi_unified_t wmi_handle, void *evt_buf,
 			 uint32_t index, wmi_host_pdev_stats *pdev_stats);
 
+QDF_STATUS (*extract_pmf_bcn_protect_stats)(wmi_unified_t wmi_handle,
+		void *evt_buf, wmi_host_pmf_bcn_protect_stats *pmf_bcn_stats);
+
 QDF_STATUS (*extract_unit_test)(wmi_unified_t wmi_handle, void *evt_buf,
 		wmi_unit_test_event *unit_test, uint32_t maxspace);
 

+ 11 - 0
wmi/src/wmi_unified_api.c

@@ -2104,6 +2104,17 @@ wmi_extract_composite_phyerr(wmi_unified_t wmi_handle, void *evt_buf,
 
 }
 
+QDF_STATUS
+wmi_extract_pmf_bcn_protect_stats(wmi_unified_t wmi_handle, void *evt_buf,
+				  wmi_host_pmf_bcn_protect_stats *bcn_stats)
+{
+	if (wmi_handle->ops->extract_pmf_bcn_protect_stats)
+		return wmi_handle->ops->extract_pmf_bcn_protect_stats(
+				wmi_handle, evt_buf, bcn_stats);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
 QDF_STATUS
 wmi_extract_unit_test(wmi_unified_t wmi_handle, void *evt_buf,
 		      wmi_unit_test_event *unit_test, uint32_t maxspace)

+ 42 - 0
wmi/src/wmi_unified_cp_stats_tlv.c

@@ -136,6 +136,10 @@ extract_all_stats_counts_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 		stats_param->stats_id |= WMI_HOST_REQUEST_PEER_ADV_STATS;
 		break;
 
+	case WMI_REQUEST_PMF_BCN_PROTECT_STAT:
+		stats_param->stats_id |= WMI_HOST_REQUEST_PMF_BCN_PROTECT_STAT;
+		break;
+
 	default:
 		stats_param->stats_id = 0;
 		break;
@@ -451,6 +455,43 @@ extract_peer_extd_stats_tlv(wmi_unified_t wmi_handle,
 
 }
 
+/**
+ * extract_pmf_bcn_protect_stats_tlv() - extract pmf bcn stats from event
+ * @wmi_handle: wmi handle
+ * @evt_buf: pointer to event buffer
+ * @pmf_bcn_stats: Pointer to hold pmf bcn protect stats
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+
+static QDF_STATUS
+extract_pmf_bcn_protect_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
+				  wmi_host_pmf_bcn_protect_stats *pmf_bcn_stats)
+{
+	WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
+	wmi_stats_event_fixed_param *ev_param;
+
+	param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *)evt_buf;
+	if (!param_buf)
+		return QDF_STATUS_E_FAILURE;
+
+	ev_param = (wmi_stats_event_fixed_param *)param_buf->fixed_param;
+
+	if ((ev_param->stats_id & WMI_REQUEST_PMF_BCN_PROTECT_STAT) &&
+	    param_buf->pmf_bcn_protect_stats) {
+		pmf_bcn_stats->igtk_mic_fail_cnt =
+			param_buf->pmf_bcn_protect_stats->igtk_mic_fail_cnt;
+		pmf_bcn_stats->igtk_replay_cnt =
+			param_buf->pmf_bcn_protect_stats->igtk_replay_cnt;
+		pmf_bcn_stats->bcn_mic_fail_cnt =
+			param_buf->pmf_bcn_protect_stats->bcn_mic_fail_cnt;
+		pmf_bcn_stats->bcn_replay_cnt =
+			param_buf->pmf_bcn_protect_stats->bcn_replay_cnt;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 void wmi_cp_stats_attach_tlv(wmi_unified_t wmi_handle)
 {
 	struct wmi_ops *ops = wmi_handle->ops;
@@ -461,6 +502,7 @@ void wmi_cp_stats_attach_tlv(wmi_unified_t wmi_handle)
 	ops->extract_vdev_stats = extract_vdev_stats_tlv;
 	ops->extract_peer_stats = extract_peer_stats_tlv;
 	ops->extract_peer_extd_stats = extract_peer_extd_stats_tlv;
+	ops->extract_pmf_bcn_protect_stats = extract_pmf_bcn_protect_stats_tlv,
 
 	wmi_mc_cp_stats_attach_tlv(wmi_handle);
 }