From ea38e7997ea4994b86033dacfba15ab3dd9834b7 Mon Sep 17 00:00:00 2001 From: KARTHIK KUMAR T Date: Thu, 25 Aug 2022 20:27:58 +0530 Subject: [PATCH] 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 --- dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c | 1 + dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c | 1 + dp/wifi3.0/monitor/dp_mon.c | 21 +++++++++-------- dp/wifi3.0/monitor/dp_mon.h | 18 +++++++++++++++ dp/wifi3.0/monitor/dp_rx_mon.c | 23 ++++++++++++------- dp/wifi3.0/monitor/dp_rx_mon.h | 12 ++++++++++ qdf/inc/qdf_nbuf.h | 18 ++++----------- qdf/linux/src/qdf_nbuf.c | 3 +-- 8 files changed, 63 insertions(+), 34 deletions(-) diff --git a/dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c b/dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c index 5ab0afceee..b6e80baa5b 100644 --- a/dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c +++ b/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, diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c index b51edfa910..2bb8934303 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c +++ b/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; diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index cdf05d6372..e981d472a5 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/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; } diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 98b7cbac41..4fd55580b0 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/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 { diff --git a/dp/wifi3.0/monitor/dp_rx_mon.c b/dp/wifi3.0/monitor/dp_rx_mon.c index 1a92c28e05..0d180b20d1 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.c +++ b/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; +} diff --git a/dp/wifi3.0/monitor/dp_rx_mon.h b/dp/wifi3.0/monitor/dp_rx_mon.h index 7867f81bea..027222edba 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.h +++ b/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_ */ diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index d882a3697f..74796d45ce 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/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; }; /** diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c index 9ede51eca9..5dda67edb0 100644 --- a/qdf/linux/src/qdf_nbuf.c +++ b/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) \