Przeglądaj źródła

qcacmn: Fill per-session info for report and detector level

Fill per-session information in per_session_det_map and
per_session_report_info, with per-report and per-detector
level information, respectively.

These intermediate structures help in filling the
SAMP message.

Change-Id: Ib194fde3567ce76710e010febf729746fedf7a2c
CRs-Fixed: 2945297
Jhalak Naik 4 lat temu
rodzic
commit
4f386f38ab
1 zmienionych plików z 191 dodań i 0 usunięć
  1. 191 0
      target_if/spectral/target_if_spectral.c

+ 191 - 0
target_if/spectral/target_if_spectral.c

@@ -4685,6 +4685,182 @@ target_if_is_agile_supported_cur_chmask(struct target_if_spectral *spectral,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef OPTIMIZED_SAMP_MESSAGE
+/**
+ * target_if_spectral_populate_session_report_info() - Populate per-session
+ * report level information.
+ *
+ * @spectral: Pointer to Spectral object
+ * @smode: Spectral scan mode
+ *
+ * Return: Success/Failure
+ */
+static QDF_STATUS
+target_if_spectral_populate_session_report_info(
+				struct target_if_spectral *spectral,
+				enum spectral_scan_mode smode)
+{
+	struct per_session_report_info *rpt_info;
+	struct wlan_objmgr_psoc *psoc;
+
+	if (!spectral) {
+		spectral_err_rl("Spectral LMAC object is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+	if (smode > SPECTRAL_SCAN_MODE_MAX) {
+		spectral_err_rl("Invalid Spectral scan mode");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!spectral->pdev_obj) {
+		spectral_err_rl("Spectral PDEV is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	psoc = wlan_pdev_get_psoc(spectral->pdev_obj);
+	if (!psoc) {
+		spectral_err_rl("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	/* Fill per-session report information, based on the spectral mode */
+	rpt_info = &spectral->report_info[smode];
+
+	rpt_info->operating_bw = spectral->ch_width[SPECTRAL_SCAN_MODE_NORMAL];
+	rpt_info->sscan_bw = spectral->ch_width[smode];
+	rpt_info->sscan_cfreq1 = spectral->params[smode].ss_frequency.cfreq1;
+	rpt_info->sscan_cfreq2 = spectral->params[smode].ss_frequency.cfreq2;
+	if (rpt_info->sscan_bw == CH_WIDTH_80P80MHZ) {
+		rpt_info->num_spans = 2;
+		if (wlan_psoc_nif_fw_ext_cap_get(
+		    psoc, WLAN_SOC_RESTRICTED_80P80_SUPPORT))
+			/* 5 MHz frequency span in restricted 80p80 case */
+			rpt_info->num_spans += 1;
+	} else {
+		rpt_info->num_spans = 1;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * target_if_spectral_populate_session_detector_info() - Populate per-session
+ * detector level information.
+ *
+ * @spectral: Pointer to Spectral object
+ * @smode: Spectral scan mode
+ *
+ * Return: Success/Failure
+ */
+static QDF_STATUS
+target_if_spectral_populate_session_detector_info(
+				struct target_if_spectral *spectral,
+				enum spectral_scan_mode smode)
+{
+	struct per_session_report_info *rpt_info;
+	struct sscan_detector_list *detector_list;
+	struct wlan_objmgr_psoc *psoc;
+	uint16_t dest_det_idx = 0;
+	uint16_t dest_span_idx = 0;
+	bool is_sec80 = false;
+	uint8_t det, dest_det;
+
+	if (!spectral) {
+		spectral_err_rl("Spectral LMAC object is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+	if (smode > SPECTRAL_SCAN_MODE_MAX) {
+		spectral_err_rl("Invalid Spectral scan mode");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!spectral->pdev_obj) {
+		spectral_err_rl("Spectral PDEV is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	psoc = wlan_pdev_get_psoc(spectral->pdev_obj);
+	if (!psoc) {
+		spectral_err_rl("psoc is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	rpt_info = &spectral->report_info[smode];
+	/* Fill per-sesion detector-level information */
+	detector_list = &spectral->detector_list[smode][rpt_info->sscan_bw];
+
+	for (det = 0; det < detector_list->num_detectors; det++) {
+		struct per_session_det_map *det_map;
+
+		det_map = &spectral->det_map[detector_list->detectors[det]];
+		if (detector_list->num_detectors > 1) {
+			if (det == 0) {
+				det_map->buf_type = SPECTRAL_MSG_BUF_NEW;
+				det_map->send_to_upper_layers = false;
+			} else if (det == detector_list->num_detectors - 1) {
+				det_map->buf_type = SPECTRAL_MSG_BUF_SAVED;
+				det_map->send_to_upper_layers = true;
+			} else {
+				/* middle fragments */
+				det_map->buf_type = SPECTRAL_MSG_BUF_SAVED;
+				det_map->send_to_upper_layers = false;
+			}
+		} else {
+			det_map->buf_type = SPECTRAL_MSG_BUF_NEW;
+			det_map->send_to_upper_layers = true;
+		}
+
+		det_map->num_dest_det_info = 1;
+		if (rpt_info->sscan_bw == CH_WIDTH_80P80MHZ &&
+		    wlan_psoc_nif_fw_ext_cap_get(
+		    psoc, WLAN_SOC_RESTRICTED_80P80_SUPPORT)) {
+			/**
+			 * In 165MHz case, 1 Spectral HW detector maps to 3
+			 * detectors in SAMP msg.
+			 */
+			det_map->num_dest_det_info += 2;
+		}
+
+		for (dest_det = 0; dest_det < det_map->num_dest_det_info;
+		     dest_det++) {
+			struct per_session_dest_det_info *map_det_info;
+
+			map_det_info = &det_map->dest_det_info[dest_det];
+			map_det_info->freq_span_id = dest_span_idx;
+			map_det_info->det_id = dest_det_idx;
+			map_det_info->is_sec80 = is_sec80;
+			if (rpt_info->sscan_bw == CH_WIDTH_80P80MHZ) {
+			/* Increment span ID for non-contiguous modes */
+				dest_det_idx = 0;
+				dest_span_idx++;
+			} else {
+			/* Increment detector ID for contiguous modes */
+				dest_det_idx++;
+			}
+			is_sec80 = !is_sec80;
+		}
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+#else
+static QDF_STATUS
+target_if_spectral_populate_session_report_info(
+				struct target_if_spectral *spectral,
+				enum spectral_scan_mode smode)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS
+target_if_spectral_populate_session_detector_info(
+				struct target_if_spectral *spectral,
+				enum spectral_scan_mode smode)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* OPTIMIZED_SAMP_MESSAGE */
+
 QDF_STATUS
 target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 			      uint8_t vdev_id,
@@ -4695,6 +4871,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 	struct target_if_spectral *spectral;
 	struct wlan_objmgr_psoc *psoc;
 	enum reg_wifi_band band;
+	QDF_STATUS ret;
 
 	if (!err) {
 		spectral_err("Error code argument is null");
@@ -4883,6 +5060,20 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 	target_if_spectral_scan_enable_params(spectral,
 					      &spectral->params[smode], smode,
 					      err);
+
+	ret = target_if_spectral_populate_session_report_info(spectral, smode);
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		spectral_err_rl("Failed to populate per-session report info");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	ret = target_if_spectral_populate_session_detector_info(spectral,
+								smode);
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		spectral_err_rl("Failed to populate per-session report info");
+		return QDF_STATUS_E_FAILURE;
+	}
+
 	qdf_spin_unlock(&spectral->spectral_lock);
 
 	return QDF_STATUS_SUCCESS;