Ver Fonte

qcacmn: Add support for chan_nf noise floor

Add function for extract_nfcal_power_ev_param and
register wmi_pdev_nfcal_power_all_channels_event_id event
to support noise floor in HK.

Change-Id: I6eef823b507be94c65df026664244eec7fc07e24
CRs-Fixed: 2157972
nobelj há 7 anos atrás
pai
commit
92d5175130

+ 2 - 1
wmi/inc/wmi_unified_api.h

@@ -1424,7 +1424,8 @@ uint8_t *wmi_extract_dbglog_data_len(void *wmi_hdl,
 QDF_STATUS wmi_send_ext_resource_config(void *wmi_hdl,
 				wmi_host_ext_resource_config *ext_cfg);
 
-QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl);
+QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl,
+						    uint8_t mac_id);
 
 QDF_STATUS wmi_unified_packet_power_info_get_cmd_send(void *wmi_hdl,
 				struct packet_power_info_params *param);

+ 17 - 24
wmi/inc/wmi_unified_param.h

@@ -287,8 +287,8 @@
 
 #define WMI_HOST_TPC_RATE_MAX	160
 #define WMI_HOST_TPC_TX_NUM_CHAIN	4
-#define WMI_HOST_RXG_CAL_CHAN_MAX	4
-#define WMI_HOST_MAX_NUM_CHAINS	4
+#define WMI_HOST_RXG_CAL_CHAN_MAX	8
+#define WMI_HOST_MAX_NUM_CHAINS	8
 #define WMI_MAX_NUM_OF_RATE_THRESH   4
 
 #define WMI_HOST_PDEV_MAX_VDEVS         17
@@ -6317,31 +6317,24 @@ typedef struct {
 
 /**
  * struct wmi_host_pdev_nfcal_power_all_channels_event - NF cal event data
- * @nfdBr:
- *   chan0: {NFCalPower_chain0, NFCalPower_chain1,
- *           NFCalPower_chain2, NFCalPower_chain3},
- *   chan1: {NFCalPower_chain0, NFCalPower_chain1,
- *           NFCalPower_chain2, NFCalPower_chain3},
- *   chan2: {NFCalPower_chain0, NFCalPower_chain1,
- *           NFCalPower_chain2, NFCalPower_chain3},
- *   chan3: {NFCalPower_chain0, NFCalPower_chain1,
- *           NFCalPower_chain2, NFCalPower_chain3},
- * @nfdBr:
- *   chan0: {NFCalPower_chain0, NFCalPower_chain1,
- *           NFCalPower_chain2, NFCalPower_chain3},
- *   chan1: {NFCalPower_chain0, NFCalPower_chain1,
- *           NFCalPower_chain2, NFCalPower_chain3},
- *   chan2: {NFCalPower_chain0, NFCalPower_chain1,
- *           NFCalPower_chain2, NFCalPower_chain3},
- *   chan3: {NFCalPower_chain0, NFCalPower_chain1,
- *           NFCalPower_chain2, NFCalPower_chain3},
- * @freqNum: frequency number
+ * @nfdbr:
+ *   chan[0 ~ 7]: {NFCalPower_chain0, NFCalPower_chain1,
+ *                 NFCalPower_chain2, NFCalPower_chain3,
+ *                 NFCalPower_chain4, NFCalPower_chain5,
+ *                 NFCalPower_chain6, NFCalPower_chain7},
+ * @nfdbm:
+ *   chan[0 ~ 7]: {NFCalPower_chain0, NFCalPower_chain1,
+ *                 NFCalPower_chain2, NFCalPower_chain3,
+ *                 NFCalPower_chain4, NFCalPower_chain5,
+ *                 NFCalPower_chain6, NFCalPower_chain7},
+ * @freqnum:
+ *   chan[0 ~ 7]: frequency number
  * @pdev_id: pdev_id
  */
 typedef struct {
-	int8_t nfdBr[WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS];
-	int8_t nfdBm[WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS];
-	uint32_t freqNum[WMI_HOST_RXG_CAL_CHAN_MAX];
+	int8_t nfdbr[WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS];
+	int8_t nfdbm[WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS];
+	uint32_t freqnum[WMI_HOST_RXG_CAL_CHAN_MAX];
 	uint32_t pdev_id;
 } wmi_host_pdev_nfcal_power_all_channels_event;
 

+ 2 - 1
wmi/inc/wmi_unified_priv.h

@@ -1053,7 +1053,8 @@ uint8_t* (*extract_dbglog_data_len)(wmi_unified_t wmi_handle, void *evt_buf,
 QDF_STATUS (*send_ext_resource_config)(wmi_unified_t wmi_handle,
 		wmi_host_ext_resource_config *ext_cfg);
 
-QDF_STATUS (*send_nf_dbr_dbm_info_get_cmd)(wmi_unified_t wmi_handle);
+QDF_STATUS (*send_nf_dbr_dbm_info_get_cmd)(wmi_unified_t wmi_handle,
+					   uint8_t mac_id);
 
 QDF_STATUS (*send_packet_power_info_get_cmd)(wmi_unified_t wmi_handle,
 		      struct packet_power_info_params *param);

+ 4 - 2
wmi/src/wmi_unified_api.c

@@ -4881,15 +4881,17 @@ QDF_STATUS wmi_send_ext_resource_config(void *wmi_hdl,
 /**
  *  wmi_unified_nf_dbr_dbm_info_get_cmd_send() - WMI request nf info function
  *  @param wmi_handle	  : handle to WMI.
+ *  @mac_id: mac_id
  *
  *  @return QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
  */
-QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl)
+QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl,
+						    uint8_t mac_id)
 {
 	wmi_unified_t wmi = (wmi_unified_t) wmi_hdl;
 
 	if (wmi->ops->send_nf_dbr_dbm_info_get_cmd)
-		return wmi->ops->send_nf_dbr_dbm_info_get_cmd(wmi);
+		return wmi->ops->send_nf_dbr_dbm_info_get_cmd(wmi, mac_id);
 
 	return QDF_STATUS_E_FAILURE;
 }

+ 13 - 4
wmi/src/wmi_unified_non_tlv.c

@@ -4592,11 +4592,12 @@ send_periodic_chan_stats_config_cmd_non_tlv(wmi_unified_t wmi_handle,
 /**
  * send_nf_dbr_dbm_info_get_cmd_non_tlv() - send request to get nf to fw
  * @wmi_handle: wmi handle
+ * @mac_id: radio context
  *
  * Return: 0 for success or error code
  */
 static QDF_STATUS
-send_nf_dbr_dbm_info_get_cmd_non_tlv(wmi_unified_t wmi_handle)
+send_nf_dbr_dbm_info_get_cmd_non_tlv(wmi_unified_t wmi_handle, uint8_t mac_id)
 {
 	wmi_buf_t wmibuf;
 
@@ -6597,9 +6598,17 @@ static QDF_STATUS extract_nfcal_power_ev_param_non_tlv(wmi_unified_t wmi_handle,
 	wmi_pdev_nfcal_power_all_channels_event *event =
 	    (wmi_pdev_nfcal_power_all_channels_event *)evt_buf;
 
-	qdf_mem_copy(param->nfdBr, event->nfdBr, sizeof(param->nfdBr));
-	qdf_mem_copy(param->nfdBm, event->nfdBm, sizeof(param->nfdBm));
-	qdf_mem_copy(param->freqNum, event->freqNum, sizeof(param->freqNum));
+	if ((sizeof(event->nfdBr) == sizeof(param->nfdbr)) &&
+	    (sizeof(event->nfdBm) == sizeof(param->nfdbm)) &&
+	    (sizeof(event->freqNum) == sizeof(param->freqnum))) {
+		qdf_mem_copy(param->nfdbr, event->nfdBr, sizeof(param->nfdbr));
+		qdf_mem_copy(param->nfdbm, event->nfdBm, sizeof(param->nfdbm));
+		qdf_mem_copy(param->freqnum, event->freqNum,
+			     sizeof(param->freqnum));
+	} else {
+		WMI_LOGE("%s: %d Failed copy out of bound memory!\n", __func__, __LINE__);
+		return QDF_STATUS_E_RESOURCES;
+	}
 
 	param->pdev_id = WMI_NON_TLV_DEFAULT_PDEV_ID;
 

+ 82 - 4
wmi/src/wmi_unified_tlv.c

@@ -12477,20 +12477,30 @@ send_periodic_chan_stats_config_cmd_tlv(wmi_unified_t wmi_handle,
 /**
  * send_nf_dbr_dbm_info_get_cmd_tlv() - send request to get nf to fw
  * @wmi_handle: wmi handle
+ * @mac_id: radio context
  *
  * Return: 0 for success or error code
  */
 static QDF_STATUS
-send_nf_dbr_dbm_info_get_cmd_tlv(wmi_unified_t wmi_handle)
+send_nf_dbr_dbm_info_get_cmd_tlv(wmi_unified_t wmi_handle, uint8_t mac_id)
 {
 	wmi_buf_t buf;
 	QDF_STATUS ret;
+	wmi_pdev_get_nfcal_power_fixed_param *cmd;
+	int32_t len = sizeof(*cmd);
 
-	buf = wmi_buf_alloc(wmi_handle, 0);
+	buf = wmi_buf_alloc(wmi_handle, len);
 	if (buf == NULL)
 		return QDF_STATUS_E_NOMEM;
 
-	ret = wmi_unified_cmd_send(wmi_handle, buf, 0,
+	cmd = (wmi_pdev_get_nfcal_power_fixed_param *)wmi_buf_data(buf);
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_pdev_get_nfcal_power_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+				(wmi_pdev_get_nfcal_power_fixed_param));
+	cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(mac_id);
+
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
 				   WMI_PDEV_GET_NFCAL_POWER_CMDID);
 	if (ret != 0) {
 		WMI_LOGE("Sending get nfcal power cmd failed\n");
@@ -20572,6 +20582,72 @@ static QDF_STATUS extract_pdev_tpc_ev_param_tlv(wmi_unified_t wmi_handle,
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * extract_nfcal_power_ev_param_tlv() - extract noise floor calibration
+ * power param from event
+ * @wmi_handle: wmi handle
+ * @param evt_buf: pointer to event buffer
+ * @param param: Pointer to hold nf cal power param
+ *
+ * Return: 0 for success or error code
+ */
+static QDF_STATUS
+extract_nfcal_power_ev_param_tlv(wmi_unified_t wmi_handle,
+				 void *evt_buf,
+				 wmi_host_pdev_nfcal_power_all_channels_event *param)
+{
+	WMI_PDEV_NFCAL_POWER_ALL_CHANNELS_EVENTID_param_tlvs *param_buf;
+	wmi_pdev_nfcal_power_all_channels_event_fixed_param *event;
+	wmi_pdev_nfcal_power_all_channels_nfdBr *ch_nfdbr;
+	wmi_pdev_nfcal_power_all_channels_nfdBm *ch_nfdbm;
+	wmi_pdev_nfcal_power_all_channels_freqNum *ch_freqnum;
+	uint32_t i;
+
+	param_buf =
+		(WMI_PDEV_NFCAL_POWER_ALL_CHANNELS_EVENTID_param_tlvs *)evt_buf;
+	event = param_buf->fixed_param;
+	ch_nfdbr = param_buf->nfdbr;
+	ch_nfdbm = param_buf->nfdbm;
+	ch_freqnum = param_buf->freqnum;
+
+	WMI_LOGD("pdev_id[%x], num_nfdbr[%d], num_nfdbm[%d] num_freqnum[%d]\n",
+		 event->pdev_id, param_buf->num_nfdbr,
+		 param_buf->num_nfdbm, param_buf->num_freqnum);
+
+	if (param_buf->num_nfdbr >
+	    WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS) {
+		WMI_LOGE("invalid number of nfdBr");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (param_buf->num_nfdbm >
+	    WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS) {
+		WMI_LOGE("invalid number of nfdBm");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (param_buf->num_freqnum > WMI_HOST_RXG_CAL_CHAN_MAX) {
+		WMI_LOGE("invalid number of freqNum");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	for (i = 0; i < param_buf->num_nfdbr; i++) {
+		param->nfdbr[i] = (int8_t)ch_nfdbr->nfdBr;
+		param->nfdbm[i] = (int8_t)ch_nfdbm->nfdBm;
+		ch_nfdbr++;
+		ch_nfdbm++;
+	}
+
+	for (i = 0; i < param_buf->num_freqnum; i++) {
+		param->freqnum[i] = ch_freqnum->freqNum;
+		ch_freqnum++;
+	}
+
+	param->pdev_id = event->pdev_id;
+
+	return QDF_STATUS_SUCCESS;
+}
+
 
 #ifdef BIG_ENDIAN_HOST
 /**
@@ -22502,6 +22578,7 @@ struct wmi_ops tlv_ops =  {
 	.extract_pdev_tpc_ev_param = extract_pdev_tpc_ev_param_tlv,
 	.extract_pdev_tpc_config_ev_param =
 			extract_pdev_tpc_config_ev_param_tlv,
+	.extract_nfcal_power_ev_param = extract_nfcal_power_ev_param_tlv,
 	.extract_wds_addr_event = extract_wds_addr_event_tlv,
 	.extract_peer_sta_ps_statechange_ev =
 		extract_peer_sta_ps_statechange_ev_tlv,
@@ -22631,7 +22708,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
 				WMI_OFFLOAD_PROB_RESP_TX_STATUS_EVENTID;
 	event_ids[wmi_mgmt_tx_completion_event_id] =
 				WMI_MGMT_TX_COMPLETION_EVENTID;
-
+	event_ids[wmi_pdev_nfcal_power_all_channels_event_id] =
+				WMI_PDEV_NFCAL_POWER_ALL_CHANNELS_EVENTID;
 	event_ids[wmi_tx_delba_complete_event_id] =
 					WMI_TX_DELBA_COMPLETE_EVENTID;
 	event_ids[wmi_tx_addba_complete_event_id] =