|
@@ -33,6 +33,15 @@
|
|
|
#include "dp_lite_mon.h"
|
|
|
#endif
|
|
|
|
|
|
+/* 40MHZ BW 2 20MHZ sub bands */
|
|
|
+#define SUB40BW 2
|
|
|
+/* 80MHZ BW 4 20MHZ sub bands */
|
|
|
+#define SUB80BW 4
|
|
|
+/* 160MHZ BW 8 20MHZ sub bands */
|
|
|
+#define SUB160BW 8
|
|
|
+/* 320MHZ BW 16 20MHZ sub bands */
|
|
|
+#define SUB320BW 16
|
|
|
+
|
|
|
#if !defined(DISABLE_MON_CONFIG)
|
|
|
|
|
|
/**
|
|
@@ -1155,6 +1164,140 @@ QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef QCA_RSSI_DB2DBM
|
|
|
+/*
|
|
|
+ * dp_mon_compute_min_nf() - calculate the min nf value in the
|
|
|
+ * active chains 20MHZ subbands.
|
|
|
+ * computation: Need to calculate nfInDbm[][] to A_MIN(nfHwDbm[][])
|
|
|
+ * considering row index as active chains and column
|
|
|
+ * index as 20MHZ subbands per chain.
|
|
|
+ * example: chain_mask = 0x07 (consider 3 active chains 0,1,2 index)
|
|
|
+ * BandWidth = 40MHZ (40MHZ includes two 20MHZ subbands so need to
|
|
|
+ * consider 0,1 index calculate min_nf value)
|
|
|
+ *
|
|
|
+ *@conv_params: cdp_rssi_dbm_conv_param_dp structure value
|
|
|
+ *@chain_idx: active chain index in nfHwdbm array
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS_SUCCESS if value set successfully
|
|
|
+ * QDF_STATUS_E_INVAL false if error
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+dp_mon_compute_min_nf(struct cdp_rssi_dbm_conv_param_dp *conv_params,
|
|
|
+ int8_t *min_nf, int chain_idx)
|
|
|
+{
|
|
|
+ int j;
|
|
|
+ *min_nf = conv_params->nf_hw_dbm[chain_idx][0];
|
|
|
+
|
|
|
+ switch (conv_params->curr_bw) {
|
|
|
+ case CHAN_WIDTH_20:
|
|
|
+ case CHAN_WIDTH_5:
|
|
|
+ case CHAN_WIDTH_10:
|
|
|
+ break;
|
|
|
+ case CHAN_WIDTH_40:
|
|
|
+ for (j = 1; j < SUB40BW; j++) {
|
|
|
+ if (conv_params->nf_hw_dbm[chain_idx][j] < *min_nf)
|
|
|
+ *min_nf = conv_params->nf_hw_dbm[chain_idx][j];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CHAN_WIDTH_80:
|
|
|
+ for (j = 1; j < SUB80BW; j++) {
|
|
|
+ if (conv_params->nf_hw_dbm[chain_idx][j] < *min_nf)
|
|
|
+ *min_nf = conv_params->nf_hw_dbm[chain_idx][j];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CHAN_WIDTH_160:
|
|
|
+ case CHAN_WIDTH_80P80:
|
|
|
+ case CHAN_WIDTH_165:
|
|
|
+ for (j = 1; j < SUB160BW; j++) {
|
|
|
+ if (conv_params->nf_hw_dbm[chain_idx][j] < *min_nf)
|
|
|
+ *min_nf = conv_params->nf_hw_dbm[chain_idx][j];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CHAN_WIDTH_160P160:
|
|
|
+ case CHAN_WIDTH_320:
|
|
|
+ for (j = 1; j < SUB320BW; j++) {
|
|
|
+ if (conv_params->nf_hw_dbm[chain_idx][j] < *min_nf)
|
|
|
+ *min_nf = conv_params->nf_hw_dbm[chain_idx][j];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ dp_cdp_err("Invalid bandwidth %u", conv_params->curr_bw);
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * dp_mon_pdev_params_rssi_dbm_conv() --> to set rssi in dbm converstion
|
|
|
+ * params into monitor pdev.
|
|
|
+ *@cdp_soc: dp soc handle.
|
|
|
+ *@params: cdp_rssi_db2dbm_param_dp structure value.
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS_SUCCESS if value set successfully
|
|
|
+ * QDF_STATUS_E_INVAL false if error
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+dp_mon_pdev_params_rssi_dbm_conv(struct cdp_soc_t *cdp_soc,
|
|
|
+ struct cdp_rssi_db2dbm_param_dp *params)
|
|
|
+{
|
|
|
+ struct cdp_rssi_db2dbm_param_dp *dp_rssi_params = params;
|
|
|
+ uint8_t pdev_id = params->pdev_id;
|
|
|
+ struct dp_soc *soc = (struct dp_soc *)cdp_soc;
|
|
|
+ struct dp_pdev *pdev =
|
|
|
+ dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
|
|
|
+ struct dp_mon_pdev *mon_pdev;
|
|
|
+ struct dp_mon_pdev_be *mon_pdev_be;
|
|
|
+ struct cdp_rssi_temp_off_param_dp temp_off_param;
|
|
|
+ struct cdp_rssi_dbm_conv_param_dp conv_params;
|
|
|
+ int8_t min_nf = 0;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (!soc->features.rssi_dbm_conv_support) {
|
|
|
+ dp_cdp_err("rssi dbm converstion support is false");
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+ if (!pdev || !pdev->monitor_pdev) {
|
|
|
+ dp_cdp_err("Invalid pdev_id %u", pdev_id);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ mon_pdev = pdev->monitor_pdev;
|
|
|
+ mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
|
|
|
+
|
|
|
+ if (dp_rssi_params->rssi_temp_off_present) {
|
|
|
+ temp_off_param = dp_rssi_params->temp_off_param;
|
|
|
+ mon_pdev_be->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;
|
|
|
+ for (i = 0; i < CDP_MAX_NUM_ANTENNA; i++) {
|
|
|
+ if (conv_params.curr_rx_chainmask & (0x01 << i)) {
|
|
|
+ if (QDF_STATUS_E_INVAL == dp_mon_compute_min_nf
|
|
|
+ (&conv_params, &min_nf, i))
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ } else {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mon_pdev_be->xlna_bypass_offset =
|
|
|
+ conv_params.xlna_bypass_offset;
|
|
|
+ mon_pdev_be->xlna_bypass_threshold =
|
|
|
+ conv_params.xlna_bypass_threshold;
|
|
|
+ mon_pdev_be->xbar_config = conv_params.xbar_config;
|
|
|
+
|
|
|
+ mon_pdev_be->min_nf_dbm = min_nf;
|
|
|
+ }
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline QDF_STATUS
|
|
|
+dp_mon_pdev_params_rssi_dbm_conv(struct cdp_soc_t *cdp_soc,
|
|
|
+ struct cdp_rssi_db2dbm_param_dp *params)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc)
|
|
|
{
|
|
|
struct dp_mon_soc *mon_soc = soc->monitor_soc;
|
|
@@ -1415,6 +1558,8 @@ struct cdp_mon_ops dp_ops_mon_2_0 = {
|
|
|
.txrx_get_lite_mon_peer_config = dp_lite_mon_get_peer_config,
|
|
|
.txrx_is_lite_mon_enabled = dp_lite_mon_is_enabled,
|
|
|
#endif
|
|
|
+ .txrx_set_mon_pdev_params_rssi_dbm_conv =
|
|
|
+ dp_mon_pdev_params_rssi_dbm_conv,
|
|
|
};
|
|
|
|
|
|
#ifdef QCA_MONITOR_OPS_PER_SOC_SUPPORT
|