Bladeren bron

qcacmn: Support p2p GO random chan selection

MCL needs the interface type to query policy mgr for PCL
when selecting random channel. The existing API
utils_dfs_get_random_channel doesn't provide the vdev
type. Add new utils_dfs_get_vdev_random_channel
with vdev parameter to support P2P GO random channel
selection.

Change-Id: I0c6841b1692baca92730a6be73653282c98f1682
CRs-Fixed: 2467871
Liangwei Dong 5 jaren geleden
bovenliggende
commit
b2569fd660
2 gewijzigde bestanden met toevoegingen van 63 en 21 verwijderingen
  1. 20 0
      umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h
  2. 43 21
      umac/dfs/dispatcher/src/wlan_dfs_utils_api.c

+ 20 - 0
umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h

@@ -448,6 +448,26 @@ QDF_STATUS utils_dfs_get_random_channel(struct wlan_objmgr_pdev *pdev,
 		uint32_t *hw_mode, uint8_t *target_chan,
 		struct dfs_acs_info *acs_info);
 
+/**
+ * utils_dfs_get_vdev_random_channel() - Get random channel for vdev
+ * @pdev: Pointer to DFS pdev object.
+ * @vdev: vdev of the request
+ * @flags: random channel selection flags.
+ * @ch_params: current channel params.
+ * @hw_mode: current operating mode.
+ * @target_chan: Pointer to target_chan.
+ * @acs_info: acs range info.
+ *
+ * Get random channel based on vdev interface type. If the vdev is null,
+ * the function will get random channel by SAP interface type.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS utils_dfs_get_vdev_random_channel(
+	struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev,
+	uint16_t flags, struct ch_params *ch_params, uint32_t *hw_mode,
+	uint8_t *target_chan, struct dfs_acs_info *acs_info);
+
 /**
  * utils_dfs_bw_reduced_channel() - Get BW reduced channel.
  * @pdev: Pointer to DFS pdev object.

+ 43 - 21
umac/dfs/dispatcher/src/wlan_dfs_utils_api.c

@@ -663,6 +663,7 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
  * utils_dfs_get_channel_list() - Get channel list from regdb component, based
  * on current channel list.
  * @pdev: Pointer to pdev structure.
+ * @vdev: vdev of request
  * @chan: Pointer to channel list.
  * @num_chan: number of channels.
  *
@@ -672,6 +673,7 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
  * channel.
  */
 static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
+				       struct wlan_objmgr_vdev *vdev,
 				       struct dfs_channel *chan_list,
 				       uint32_t *num_chan)
 {
@@ -735,15 +737,16 @@ static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
 }
 
 #else
-
 void utils_dfs_get_nol_history_chan_list(struct wlan_objmgr_pdev *pdev,
 					 void *clist, uint32_t *num_chan)
 {
 	utils_dfs_get_chan_list(pdev, clist, num_chan);
 }
 
-void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
-			     void *clist, uint32_t *num_chan)
+static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
+				       struct wlan_objmgr_vdev *vdev,
+				       struct dfs_channel *chan_list,
+				       uint32_t *num_chan)
 {
 	uint8_t pcl_ch[QDF_MAX_NUM_CHAN] = {0};
 	uint8_t weight_list[QDF_MAX_NUM_CHAN] = {0};
@@ -752,7 +755,7 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
 	int i;
 	struct wlan_objmgr_psoc *psoc;
 	uint32_t conn_count = 0;
-	struct dfs_channel *chan_list = (struct dfs_channel *)clist;
+	enum policy_mgr_con_mode mode;
 
 	psoc = wlan_pdev_get_psoc(pdev);
 	if (!psoc) {
@@ -763,14 +766,21 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
 
 	len = QDF_ARRAY_SIZE(pcl_ch);
 	weight_len = QDF_ARRAY_SIZE(weight_list);
+
+	if (vdev)
+		mode = policy_mgr_convert_device_mode_to_qdf_type(
+				wlan_vdev_mlme_get_opmode(vdev));
+	else
+		mode = PM_SAP_MODE;
 	conn_count = policy_mgr_mode_specific_connection_count(
-			psoc, PM_SAP_MODE, NULL);
+			psoc, mode, NULL);
 	if (0 == conn_count)
-		policy_mgr_get_pcl(psoc, PM_SAP_MODE, pcl_ch,
-				&len, weight_list, weight_len);
+		policy_mgr_get_pcl(psoc, mode, pcl_ch,
+				   &len, weight_list, weight_len);
 	else
-		policy_mgr_get_pcl_for_existing_conn(psoc, PM_SAP_MODE, pcl_ch,
-				&len, weight_list, weight_len, true);
+		policy_mgr_get_pcl_for_existing_conn(
+			psoc, mode, pcl_ch, &len, weight_list,
+			weight_len, true);
 
 	if (*num_chan < len) {
 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
@@ -789,21 +799,18 @@ void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
 	dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "num channels %d", i);
 }
 
-static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
-				       struct dfs_channel *chan_list,
-				       uint32_t *num_chan)
+void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
+			     void *clist, uint32_t *num_chan)
 {
-	utils_dfs_get_chan_list(pdev, (void *)chan_list, num_chan);
+	utils_dfs_get_channel_list(pdev, NULL, (struct dfs_channel *)clist,
+				   num_chan);
 }
 #endif
 
-QDF_STATUS utils_dfs_get_random_channel(
-	struct wlan_objmgr_pdev *pdev,
-	uint16_t flags,
-	struct ch_params *ch_params,
-	uint32_t *hw_mode,
-	uint8_t *target_chan,
-	struct dfs_acs_info *acs_info)
+QDF_STATUS utils_dfs_get_vdev_random_channel(
+	struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev,
+	uint16_t flags, struct ch_params *ch_params, uint32_t *hw_mode,
+	uint8_t *target_chan, struct dfs_acs_info *acs_info)
 {
 	uint32_t dfs_reg;
 	uint32_t num_chan = NUM_CHANNELS;
@@ -831,7 +838,7 @@ QDF_STATUS utils_dfs_get_random_channel(
 	if (!chan_list)
 		goto random_chan_error;
 
-	utils_dfs_get_channel_list(pdev, chan_list, &num_chan);
+	utils_dfs_get_channel_list(pdev, vdev, chan_list, &num_chan);
 	if (!num_chan) {
 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "zero channels");
 		goto random_chan_error;
@@ -870,6 +877,21 @@ random_chan_error:
 
 	return status;
 }
+
+qdf_export_symbol(utils_dfs_get_vdev_random_channel);
+
+QDF_STATUS utils_dfs_get_random_channel(
+	struct wlan_objmgr_pdev *pdev,
+	uint16_t flags,
+	struct ch_params *ch_params,
+	uint32_t *hw_mode,
+	uint8_t *target_chan,
+	struct dfs_acs_info *acs_info)
+{
+	return utils_dfs_get_vdev_random_channel(
+		pdev, NULL, flags, ch_params, hw_mode, target_chan,
+		acs_info);
+}
 qdf_export_symbol(utils_dfs_get_random_channel);
 
 QDF_STATUS utils_dfs_bw_reduced_channel(