Kaynağa Gözat

qcacmn: Enable 11d on different vdev

Currently host driver enables 11d on different available vdev before it
sends the vdev delete command to the FW. Since 11d is already enabled
on existing vdev, FW, do not enable the 11d on this command on
different vdev.
For example in current issue, when host driver creates vdev0, it
enables 11d on vdev0. Now it creates vdev1. when host drivers tries
to delete vdev0, it sends 11d start command on vdev1 before it sends
vdev delete for vdev0. Since 11d is already enabled on vdev0, fw do
not enable 11d on vdev1. Now host driver deletes vdev0.
Since FW rejects 11d start on vdev1, 11d algorithm does not run
after vdev0 deletion.

To fix this issue, enable 11d on different vdev, once host deletes
the current 11d vdev.

Change-Id: I496f17bd0d1baacdb5e74609c1b5894af4256e12
CRs-Fixed: 3515089
Ashish Kumar Dhanotiya 2 yıl önce
ebeveyn
işleme
cae18fa1ad

+ 6 - 18
umac/regulatory/core/src/reg_offload_11d_scan.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -299,25 +300,13 @@ QDF_STATUS reg_11d_vdev_created_update(struct wlan_objmgr_vdev *vdev)
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS reg_11d_vdev_delete_update(struct wlan_objmgr_vdev *vdev)
+QDF_STATUS reg_11d_vdev_delete_update(struct wlan_objmgr_psoc *psoc,
+				      enum QDF_OPMODE op_mode, uint32_t vdev_id)
 {
 	struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj;
-	struct wlan_objmgr_pdev *parent_pdev;
-	struct wlan_objmgr_psoc *parent_psoc;
-	enum QDF_OPMODE op_mode;
-	uint32_t vdev_id;
 	uint8_t i;
 
-	if (!vdev) {
-		reg_err("NULL vdev");
-		return QDF_STATUS_E_INVAL;
-	}
-	op_mode = wlan_vdev_mlme_get_opmode(vdev);
-
-	parent_pdev = wlan_vdev_get_pdev(vdev);
-	parent_psoc = wlan_pdev_get_psoc(parent_pdev);
-
-	psoc_priv_obj = reg_get_psoc_obj(parent_psoc);
+	psoc_priv_obj = reg_get_psoc_obj(psoc);
 	if (!psoc_priv_obj) {
 		reg_err("NULL reg psoc private obj");
 		return QDF_STATUS_E_FAULT;
@@ -327,13 +316,12 @@ QDF_STATUS reg_11d_vdev_delete_update(struct wlan_objmgr_vdev *vdev)
 		psoc_priv_obj->master_vdev_cnt--;
 		reg_debug("run 11d state machine, deleted opmode %d",
 			  op_mode);
-		reg_run_11d_state_machine(parent_psoc);
+		reg_run_11d_state_machine(psoc);
 		return QDF_STATUS_SUCCESS;
 	}
 
 	if ((op_mode == QDF_STA_MODE) || (op_mode == QDF_P2P_DEVICE_MODE) ||
 	    (op_mode == QDF_P2P_CLIENT_MODE)) {
-		vdev_id = wlan_vdev_get_id(vdev);
 		for (i = 0; i < MAX_STA_VDEV_CNT; i++) {
 			if (psoc_priv_obj->vdev_ids_11d[i] == vdev_id) {
 				psoc_priv_obj->vdev_ids_11d[i] =
@@ -360,7 +348,7 @@ QDF_STATUS reg_11d_vdev_delete_update(struct wlan_objmgr_vdev *vdev)
 			psoc_priv_obj->enable_11d_supp = false;
 			reg_debug("running 11d state machine, vdev %d",
 				  psoc_priv_obj->vdev_id_for_11d_scan);
-			reg_run_11d_state_machine(parent_psoc);
+			reg_run_11d_state_machine(psoc);
 			break;
 		}
 	}

+ 11 - 4
umac/regulatory/core/src/reg_offload_11d_scan.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -82,11 +83,16 @@ QDF_STATUS reg_11d_vdev_created_update(struct wlan_objmgr_vdev *vdev);
 
 /**
  * reg_11d_vdev_delete_update() - update 11d state upon vdev delete
- * @vdev: vdev pointer
+ * @psoc: psoc pointer
+ * @op_mode: Operating mode of the deleted vdev
+ * @vdev_id: Vdev id of the deleted vdev
  *
  * Return: Success or Failure
  */
-QDF_STATUS reg_11d_vdev_delete_update(struct wlan_objmgr_vdev *vdev);
+QDF_STATUS reg_11d_vdev_delete_update(struct wlan_objmgr_psoc *psoc,
+				      enum QDF_OPMODE op_mode,
+				      uint32_t vdev_id);
+
 
 /**
  * reg_set_11d_offloaded() - Set 11d offloaded flag
@@ -136,8 +142,9 @@ static inline QDF_STATUS reg_11d_vdev_created_update(
 	return QDF_STATUS_SUCCESS;
 }
 
-static inline QDF_STATUS reg_11d_vdev_delete_update(
-	struct wlan_objmgr_vdev *vdev)
+static inline QDF_STATUS reg_11d_vdev_delete_update(struct wlan_objmgr_psoc *psoc,
+						    enum QDF_OPMODE op_mode,
+						    uint32_t vdev_id)
 {
 	return QDF_STATUS_SUCCESS;
 }

+ 24 - 4
umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h

@@ -608,13 +608,18 @@ void ucfg_reg_set_afc_no_action(struct wlan_objmgr_psoc *psoc, bool value)
 }
 #endif
 
+#ifdef TARGET_11D_SCAN
 /**
  * ucfg_reg_11d_vdev_delete_update() - update vdev delete to regulatory
- * @vdev: vdev ptr
+ * @psoc: psoc pointer
+ * @op_mode: Operating mode of the deleted vdev
+ * @vdev_id: Vdev id of the deleted vdev
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS ucfg_reg_11d_vdev_delete_update(struct wlan_objmgr_vdev *vdev);
+QDF_STATUS ucfg_reg_11d_vdev_delete_update(struct wlan_objmgr_psoc *psoc,
+					   enum QDF_OPMODE op_mode,
+					   uint32_t vdev_id);
 
 /**
  * ucfg_reg_11d_vdev_created_update() - update vdev create to regulatory
@@ -623,6 +628,21 @@ QDF_STATUS ucfg_reg_11d_vdev_delete_update(struct wlan_objmgr_vdev *vdev);
  * Return: QDF_STATUS
  */
 QDF_STATUS ucfg_reg_11d_vdev_created_update(struct wlan_objmgr_vdev *vdev);
+#else
+static inline
+QDF_STATUS ucfg_reg_11d_vdev_delete_update(struct wlan_objmgr_psoc *psoc,
+					   enum QDF_OPMODE op_mode,
+					   uint32_t vdev_id)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+QDF_STATUS ucfg_reg_11d_vdev_created_update(struct wlan_objmgr_vdev *vdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
 
 /**
  * ucfg_reg_get_hal_reg_cap() - return hal reg cap
@@ -775,8 +795,8 @@ bool ucfg_reg_is_user_country_set_allowed(struct wlan_objmgr_psoc *psoc)
 	return true;
 }
 
-static inline bool
-ucfg_reg_is_fcc_constraint_set(struct wlan_objmgr_pdev *pdev)
+static inline
+bool ucfg_reg_is_fcc_constraint_set(struct wlan_objmgr_pdev *pdev)
 {
 	return false;
 }

+ 6 - 2
umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c

@@ -318,15 +318,19 @@ void ucfg_reg_ch_avoid_ext(struct wlan_objmgr_psoc *psoc,
 }
 #endif
 
-QDF_STATUS ucfg_reg_11d_vdev_delete_update(struct wlan_objmgr_vdev *vdev)
+#ifdef TARGET_11D_SCAN
+QDF_STATUS ucfg_reg_11d_vdev_delete_update(struct wlan_objmgr_psoc *psoc,
+					   enum QDF_OPMODE op_mode,
+					   uint32_t vdev_id)
 {
-	return reg_11d_vdev_delete_update(vdev);
+	return reg_11d_vdev_delete_update(psoc, op_mode, vdev_id);
 }
 
 QDF_STATUS ucfg_reg_11d_vdev_created_update(struct wlan_objmgr_vdev *vdev)
 {
 	return reg_11d_vdev_created_update(vdev);
 }
+#endif
 
 struct wlan_psoc_host_hal_reg_capabilities_ext *ucfg_reg_get_hal_reg_cap(
 				struct wlan_objmgr_psoc *psoc)