Browse Source

qcacmn: update RSSI specific parameters in mon pdev

Before we are updating RSSI params directly into mon_rx_status
this structure will reset every PPDU this breaks iwconfig,
wlanconfig and monitor packet RSSI values.
Fix added to storing the values in the mon_pdev.

Change-Id: I9f8fa776c65cbad84fac5e8c2f65b3fce1386e20
CRs-Fixed: 3276503
KARTHIK KUMAR T 2 years ago
parent
commit
ea38e7997e

+ 1 - 0
dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c

@@ -498,6 +498,7 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
 				 (tlv_status == HAL_TLV_STATUS_MPDU_START) ||
 				 (tlv_status == HAL_TLV_STATUS_MSDU_END));
 		}
+		dp_mon_rx_stats_update_rssi_dbm_params(mon_pdev, ppdu_info);
 		if (qdf_unlikely(mon_pdev->dp_peer_based_pktlog)) {
 			dp_rx_process_peer_based_pktlog(soc, ppdu_info,
 							status_nbuf,

+ 1 - 0
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -1454,6 +1454,7 @@ dp_rx_mon_process_status_tlv(struct dp_pdev *pdev)
 		mon_pdev->rx_mon_stats.status_buf_count++;
 	}
 
+	dp_mon_rx_stats_update_rssi_dbm_params(mon_pdev, ppdu_info);
 	if (work_done) {
 		mon_pdev->rx_mon_stats.mon_rx_bufs_replenished_dest +=
 				work_done;

+ 11 - 10
dp/wifi3.0/monitor/dp_mon.c

@@ -5936,11 +5936,13 @@ dp_mon_pdev_params_rssi_dbm_conv(struct cdp_soc_t *cdp_soc,
 	}
 
 	mon_pdev = pdev->monitor_pdev;
+	mon_pdev->rssi_dbm_conv_support =
+				soc->features.rssi_dbm_conv_support;
 
 	if (dp_rssi_params->rssi_temp_off_present) {
 		temp_off_param = dp_rssi_params->temp_off_param;
-		mon_pdev->ppdu_info.rx_status.rssi_temp_offset =
-					temp_off_param.rssi_temp_offset;
+		mon_pdev->rssi_offsets.rssi_temp_offset =
+				temp_off_param.rssi_temp_offset;
 	}
 	if (dp_rssi_params->rssi_dbm_info_present) {
 		conv_params = dp_rssi_params->rssi_dbm_param;
@@ -5953,16 +5955,15 @@ dp_mon_pdev_params_rssi_dbm_conv(struct cdp_soc_t *cdp_soc,
 				continue;
 			}
 		}
-		mon_pdev->ppdu_info.rx_status.xlna_bypass_offset =
+		mon_pdev->rssi_offsets.xlna_bypass_offset =
 					conv_params.xlna_bypass_offset;
-		mon_pdev->ppdu_info.rx_status.xlna_bypass_threshold =
+		mon_pdev->rssi_offsets.xlna_bypass_threshold =
 					conv_params.xlna_bypass_threshold;
-		mon_pdev->ppdu_info.rx_status.xbar_config =
-					conv_params.xbar_config;
-
-		mon_pdev->ppdu_info.rx_status.min_nf_dbm = min_nf;
-		mon_pdev->ppdu_info.rx_status.rssi_dbm_conv_support =
-					soc->features.rssi_dbm_conv_support;
+		mon_pdev->rssi_offsets.xbar_config = conv_params.xbar_config;
+		mon_pdev->rssi_offsets.min_nf_dbm = min_nf;
+		mon_pdev->rssi_offsets.rssi_offset =
+					mon_pdev->rssi_offsets.min_nf_dbm +
+				     mon_pdev->rssi_offsets.rssi_temp_offset;
 	}
 	return QDF_STATUS_SUCCESS;
 }

+ 18 - 0
dp/wifi3.0/monitor/dp_mon.h

@@ -931,6 +931,21 @@ struct dp_mon_peer {
 	struct cdp_peer_rate_stats_ctx *peerstats_ctx;
 };
 
+struct dp_rx_mon_rssi_offset {
+	/* Temperature based rssi offset */
+	int32_t rssi_temp_offset;
+	/* Low noise amplifier bypass offset */
+	int32_t xlna_bypass_offset;
+	/* Low noise amplifier bypass threshold */
+	int32_t xlna_bypass_threshold;
+	/* 3 Bytes of xbar_config are used for RF to BB mapping */
+	uint32_t xbar_config;
+	/* min noise floor in active chains per channel */
+	int8_t min_nf_dbm;
+	/* this value is sum of temp_oofset + min_nf*/
+	int32_t rssi_offset;
+};
+
 struct  dp_mon_pdev {
 	/* monitor */
 	bool monitor_configured;
@@ -1119,6 +1134,9 @@ struct  dp_mon_pdev {
 
 	/* Invalid monitor peer to account for stats in mcopy mode */
 	struct dp_mon_peer *invalid_mon_peer;
+
+	bool rssi_dbm_conv_support;
+	struct dp_rx_mon_rssi_offset rssi_offsets;
 };
 
 struct  dp_mon_vdev {

+ 15 - 8
dp/wifi3.0/monitor/dp_rx_mon.c

@@ -306,19 +306,17 @@ dp_bb_captured_chan_status(struct dp_pdev *pdev,
  *     bits 21 to 23 = 3, maps BB chain 3 for RF chain 7
  */
 static uint8_t dp_rx_mon_rf_index_conv(uint8_t chain,
-				       struct hal_rx_ppdu_info *ppdu_info,
-				       struct dp_pdev *pdev)
+				       struct dp_mon_pdev *mon_pdev)
 {
-	uint32_t xbar_config = ppdu_info->rx_status.xbar_config;
+	uint32_t xbar_config = mon_pdev->rssi_offsets.xbar_config;
 
-	if (pdev->soc->features.rssi_dbm_conv_support && xbar_config)
+	if (mon_pdev->rssi_dbm_conv_support && xbar_config)
 		return ((xbar_config >> (3 * chain)) & 0x07);
 	return chain;
 }
 #else
 static uint8_t dp_rx_mon_rf_index_conv(uint8_t chain,
-				       struct hal_rx_ppdu_info *ppdu_info,
-				       struct dp_pdev *pdev)
+				       struct dp_mon_pdev *mon_pdev)
 {
 	return chain;
 }
@@ -331,11 +329,11 @@ dp_rx_populate_rx_rssi_chain(struct hal_rx_ppdu_info *ppdu_info,
 	uint8_t chain, bw;
 	uint8_t rssi;
 	uint8_t chain_rf;
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
 
 	for (chain = 0; chain < SS_COUNT; chain++) {
 		for (bw = 0; bw < MAX_BW; bw++) {
-			chain_rf = dp_rx_mon_rf_index_conv(chain,
-							   ppdu_info, pdev);
+			chain_rf = dp_rx_mon_rf_index_conv(chain, mon_pdev);
 			rssi = ppdu_info->rx_status.rssi_chain[chain_rf][bw];
 			if (rssi != DP_RSSI_INVAL)
 				cdp_rx_ppdu->rssi_chain[chain_rf][bw] = rssi;
@@ -2029,3 +2027,12 @@ dp_mon_rx_add_tlv(uint8_t id, uint16_t len, void *value, qdf_nbuf_t mpdu_nbuf)
 
 	return num_bytes_pushed;
 }
+
+void
+dp_mon_rx_stats_update_rssi_dbm_params(struct dp_mon_pdev *mon_pdev,
+				       struct hal_rx_ppdu_info *ppdu_info)
+{
+	ppdu_info->rx_status.rssi_offset = mon_pdev->rssi_offsets.rssi_offset;
+	ppdu_info->rx_status.rssi_dbm_conv_support =
+				mon_pdev->rssi_dbm_conv_support;
+}

+ 12 - 0
dp/wifi3.0/monitor/dp_rx_mon.h

@@ -772,4 +772,16 @@ dp_rx_process_peer_based_pktlog(struct dp_soc *soc,
 
 uint32_t dp_mon_rx_add_tlv(uint8_t id, uint16_t len, void *value,
 			   qdf_nbuf_t mpdu_nbuf);
+
+/**
+ * dp_mon_rx_stats_update_rssi_dbm_params() - update rssi calibration
+ *                                      parameters in rx stats
+ * @mon_pdev: monitor pdev
+ * @ppdu_info: Structure for rx ppdu info
+ *
+ * Return: none
+ */
+void
+dp_mon_rx_stats_update_rssi_dbm_params(struct dp_mon_pdev *mon_pdev,
+				       struct hal_rx_ppdu_info *ppdu_info);
 #endif /* _DP_RX_MON_H_ */

+ 4 - 14
qdf/inc/qdf_nbuf.h

@@ -359,13 +359,9 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
  * @aggregation: Indicate A-MPDU format
  * @ht_stbc: Indicate stbc
  * @ht_crc: ht crc
- * @xlna_bypass_offset: Low noise amplifier bypass offset
- * @xlna_bypass_threshold: Low noise amplifier bypass threshold
- * @rssi_temp_offset: Temperature based rssi offset
- * @min_nf_dbm: min noise floor in active chains per channel
- * @xbar_config: 4 bytes, used for BB to RF Chain mapping
- * @rssi_dbm_conv_support: Rssi dbm conversion support param
  * @rx_user_status: pointer to mon_rx_user_status, when set update
+ * @rssi_offset: This offset value will use for RSSI db to dbm conversion
+ * @rssi_dbm_conv_support: Rssi dbm converstion support param
  * radiotap header will use userinfo from this structure.
  */
 struct mon_rx_status {
@@ -482,16 +478,10 @@ struct mon_rx_status {
 		 aggregation:1,
 		 ht_stbc:2,
 		 ht_crc:8;
-#endif
-#ifdef QCA_RSSI_DB2DBM
-	int32_t xlna_bypass_offset;
-	int32_t xlna_bypass_threshold;
-	int32_t rssi_temp_offset;
-	int8_t min_nf_dbm;
-	uint32_t xbar_config;
-	bool rssi_dbm_conv_support;
 #endif
 	struct mon_rx_user_status *rx_user_status;
+	int32_t rssi_offset;
+	bool rssi_dbm_conv_support;
 };
 
 /**

+ 1 - 2
qdf/linux/src/qdf_nbuf.c

@@ -5412,8 +5412,7 @@ static unsigned int qdf_nbuf_update_radiotap_ampdu_flags(
 #ifdef QCA_RSSI_DB2DBM
 #define QDF_MON_STATUS_GET_RSSI_IN_DBM(rx_status) \
 (((rx_status)->rssi_dbm_conv_support) ? \
-((rx_status)->rssi_comb + (rx_status)->min_nf_dbm +\
-(rx_status)->rssi_temp_offset) : \
+((rx_status)->rssi_comb + (rx_status)->rssi_offset) :\
 ((rx_status)->rssi_comb + (rx_status)->chan_noise_floor))
 #else
 #define QDF_MON_STATUS_GET_RSSI_IN_DBM(rx_status) \