Jelajahi Sumber

qcacld-3.0: Enable full scan logging in cm_roam_scan_info_event

In the api cm_roam_scan_info_event(), only for partial
roam scan the frequencies are logged in logcat. For full scan,
the expectation is to print the frequency count as the number
of characters for scanning all frequencies exceed 255.

Enable Roam full scan logging in api cm_roam_scan_info_event()

Change-Id: Ib644a4e8d85e434e8b826c7656cda1251134c4fa
CRs-Fixed: 3131791
VIJAY RAJ 3 tahun lalu
induk
melakukan
ebe3c21573

+ 1 - 1
components/cmn_services/logging/inc/wlan_connectivity_logging.h

@@ -146,7 +146,7 @@ struct wlan_roam_candidate_info {
 struct wlan_roam_scan_info {
 	uint8_t cand_ap_count;
 	uint16_t num_scanned_freq;
-	qdf_freq_t scan_freq[WLAN_MAX_LOGGING_FREQ];
+	qdf_freq_t scan_freq[NUM_CHANNELS];
 };
 
 /**

+ 11 - 0
components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h

@@ -306,6 +306,17 @@ QDF_STATUS
 policy_mgr_get_multi_sap_allowed_on_same_band(struct wlan_objmgr_psoc *psoc,
 				bool *multi_sap_allowed_on_same_band);
 
+/*
+ * policy_mgr_get_connected_vdev_band_mask() - to get the connected vdev band
+ * mask
+ * @vdev: pointer to vdev
+ *
+ * This API is used to get band of the frequency.
+ *
+ * Return: band mask of the frequency associated with the vdev
+ */
+uint32_t policy_mgr_get_connected_vdev_band_mask(struct wlan_objmgr_vdev *vdev);
+
 /**
  * policy_mgr_get_dfs_master_dynamic_enabled() - support dfs master or not
  * on AP interafce when STA+SAP(GO) concurrency

+ 6 - 4
components/cmn_services/policy_mgr/src/wlan_policy_mgr_core.c

@@ -1662,8 +1662,9 @@ void policy_mgr_set_pcl_for_connected_vdev(struct wlan_objmgr_psoc *psoc,
 }
 
 #ifdef WLAN_FEATURE_11BE_MLO
-static uint32_t
-policy_mgr_get_connected_vdev_band_mask(struct wlan_objmgr_vdev *vdev) {
+uint32_t
+policy_mgr_get_connected_vdev_band_mask(struct wlan_objmgr_vdev *vdev)
+{
 	struct wlan_channel *chan;
 	uint32_t band_mask = 0;
 	struct wlan_objmgr_vdev *ml_vdev_list[WLAN_UMAC_MLO_MAX_VDEVS] = {0};
@@ -1711,8 +1712,9 @@ next:
 	return band_mask;
 }
 #else
-static uint32_t
-policy_mgr_get_connected_vdev_band_mask(struct wlan_objmgr_vdev *vdev) {
+uint32_t
+policy_mgr_get_connected_vdev_band_mask(struct wlan_objmgr_vdev *vdev)
+{
 	struct wlan_channel *chan;
 	uint32_t band_mask = 0;
 

+ 68 - 6
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -47,6 +47,9 @@
 #include "wlan_roam_debug.h"
 #include "wlan_mlo_mgr_roam.h"
 #include "wlan_mlo_mgr_sta.h"
+#include "wlan_mlme_api.h"
+#include "wlan_policy_mgr_api.h"
+
 
 #ifdef WLAN_FEATURE_SAE
 #define CM_IS_FW_FT_SAE_SUPPORTED(fw_akm_bitmap) \
@@ -5261,11 +5264,36 @@ send_evt:
 
 #if defined(WLAN_FEATURE_CONNECTIVITY_LOGGING) && \
     defined(WLAN_FEATURE_ROAM_OFFLOAD)
-void cm_roam_scan_info_event(struct wmi_roam_scan_data *scan, uint8_t vdev_id)
+static
+bool wlan_is_valid_frequency(uint32_t freq, uint32_t band_capability,
+			     uint32_t band_mask)
+{
+	if ((band_capability == BIT(REG_BAND_5G) ||
+	     band_mask == BIT(REG_BAND_5G) ||
+	     band_capability == BIT(REG_BAND_6G) ||
+	     band_mask == BIT(REG_BAND_6G)) &&
+	     WLAN_REG_IS_24GHZ_CH_FREQ(freq))
+		return false;
+
+	if ((band_capability == BIT(REG_BAND_2G) ||
+	     band_mask == BIT(REG_BAND_2G)) &&
+	     !WLAN_REG_IS_24GHZ_CH_FREQ(freq))
+		return false;
+
+	return true;
+}
+
+void cm_roam_scan_info_event(struct wlan_objmgr_psoc *psoc,
+			     struct wmi_roam_scan_data *scan, uint8_t vdev_id)
 {
 	int i;
 	struct wlan_log_record *log_record = NULL;
 	struct wmi_roam_candidate_info *ap = scan->ap;
+	uint32_t chan_freq[NUM_CHANNELS];
+	uint8_t count = 0, status, num_chan;
+	uint32_t band_capability = 0, band_mask = 0;
+	bool is_full_scan;
+	struct wlan_objmgr_vdev *vdev = NULL;
 
 	log_record = qdf_mem_malloc(sizeof(*log_record));
 	if (!log_record)
@@ -5286,13 +5314,47 @@ void cm_roam_scan_info_event(struct wmi_roam_scan_data *scan, uint8_t vdev_id)
 	if (scan->num_ap)
 		log_record->roam_scan.cand_ap_count = scan->num_ap - 1;
 
-	if (scan->num_chan > MAX_ROAM_SCAN_CHAN)
-		scan->num_chan = MAX_ROAM_SCAN_CHAN;
 
-	log_record->roam_scan.num_scanned_freq = scan->num_chan;
-	for (i = 0; i < scan->num_chan; i++)
-		log_record->roam_scan.scan_freq[i] = scan->chan_freq[i];
+	is_full_scan = scan->type & scan->present;
+
+	if (is_full_scan) {
+		status = mlme_get_fw_scan_channels(psoc, chan_freq, &num_chan);
+		if (QDF_IS_STATUS_ERROR(status))
+			goto out;
+
+		status = wlan_mlme_get_band_capability(psoc, &band_capability);
+		if (QDF_IS_STATUS_ERROR(status))
+			goto out;
+
+		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							WLAN_MLME_OBJMGR_ID);
+		if (!vdev)
+			goto out;
+
+		band_mask = policy_mgr_get_connected_vdev_band_mask(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
+
+		for (i = 0; i < num_chan; i++) {
+			if (!wlan_is_valid_frequency(chan_freq[i],
+						     band_capability,
+						     band_mask))
+				continue;
+
+			log_record->roam_scan.scan_freq[count] = chan_freq[i];
+			count++;
+		}
+
+		log_record->roam_scan.num_scanned_freq = count;
+	} else {
+		if (scan->num_chan > MAX_ROAM_SCAN_CHAN)
+			scan->num_chan = MAX_ROAM_SCAN_CHAN;
 
+		log_record->roam_scan.num_scanned_freq = scan->num_chan;
+		for (i = 0; i < scan->num_chan; i++)
+			log_record->roam_scan.scan_freq[i] = scan->chan_freq[i];
+	}
+
+out:
 	wlan_connectivity_log_enqueue(log_record);
 	qdf_mem_free(log_record);
 }

+ 5 - 2
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h

@@ -33,12 +33,14 @@
     defined(WLAN_FEATURE_ROAM_OFFLOAD)
 /**
  * cm_roam_scan_info_event() - send scan info to userspace
+ * @psoc: psoc common object
  * @scan: roam scan data
  * @vdev_id: vdev id
  *
  * Return: None
  */
-void cm_roam_scan_info_event(struct wmi_roam_scan_data *scan, uint8_t vdev_id);
+void cm_roam_scan_info_event(struct wlan_objmgr_psoc *psoc,
+			     struct wmi_roam_scan_data *scan, uint8_t vdev_id);
 
 /**
  * cm_roam_trigger_info_event() - send trigger info to userspace
@@ -80,7 +82,8 @@ void cm_roam_result_info_event(struct wlan_objmgr_psoc *psoc,
 			       uint8_t vdev_id);
 #else
 static inline void
-cm_roam_scan_info_event(struct wmi_roam_scan_data *scan, uint8_t vdev_id)
+cm_roam_scan_info_event(struct wlan_objmgr_psoc *psoc,
+			struct wmi_roam_scan_data *scan, uint8_t vdev_id)
 {
 }
 

+ 8 - 4
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -2844,6 +2844,7 @@ cm_stats_log_roam_scan_candidates(struct wmi_roam_candidate_info *ap,
 /**
  * cm_roam_stats_print_scan_info  - Print the roam scan details and candidate AP
  * details
+ * @psoc:      psoc common object
  * @scan:      Pointer to the received tlv after sanitization
  * @vdev_id:   Vdev ID
  * @trigger:   Roam scan trigger reason
@@ -2855,7 +2856,8 @@ cm_stats_log_roam_scan_candidates(struct wmi_roam_candidate_info *ap,
  * Return: None
  */
 static void
-cm_roam_stats_print_scan_info(struct wmi_roam_scan_data *scan, uint8_t vdev_id,
+cm_roam_stats_print_scan_info(struct wlan_objmgr_psoc *psoc,
+			      struct wmi_roam_scan_data *scan, uint8_t vdev_id,
 			      uint32_t trigger, uint32_t timestamp)
 {
 	uint16_t num_ch = scan->num_chan;
@@ -2865,7 +2867,7 @@ cm_roam_stats_print_scan_info(struct wmi_roam_scan_data *scan, uint8_t vdev_id,
 	char time[TIME_STRING_LEN];
 
 	/* Update roam scan info to userspace */
-	cm_roam_scan_info_event(scan, vdev_id);
+	cm_roam_scan_info_event(psoc, scan, vdev_id);
 
 	buf = qdf_mem_malloc(ROAM_CHANNEL_BUF_SIZE);
 	if (!buf)
@@ -3169,7 +3171,8 @@ cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 
 		if (stats_info->scan[i].present &&
 		    stats_info->trigger[i].present)
-			cm_roam_stats_print_scan_info(&stats_info->scan[i],
+			cm_roam_stats_print_scan_info(psoc,
+					  &stats_info->scan[i],
 					  stats_info->vdev_id,
 					  stats_info->trigger[i].trigger_reason,
 					  stats_info->trigger[i].timestamp);
@@ -3251,7 +3254,8 @@ cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
 
 		if (stats_info->scan[0].present &&
 		    stats_info->trigger[0].present)
-			cm_roam_stats_print_scan_info(&stats_info->scan[0],
+			cm_roam_stats_print_scan_info(psoc,
+					  &stats_info->scan[0],
 					  stats_info->vdev_id,
 					  stats_info->trigger[0].trigger_reason,
 					  stats_info->trigger[0].timestamp);