瀏覽代碼

qcacmn: Add lock for TSF calculation

Add lock at MLD level for TSF calculation of partner vdevs.

CRs-Fixed: 3240367
Change-Id: Ia9305e271aa69a5de2c21d66457deb921bd79c61
Edayilliam Jayadev 3 年之前
父節點
當前提交
d6e188af07

+ 112 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_main.h

@@ -461,6 +461,62 @@ void copied_conn_req_lock_release(struct wlan_mlo_sta *sta_ctx)
 {
 	qdf_spin_unlock_bh(&sta_ctx->copied_conn_req_lock);
 }
+
+/**
+ * tsf_recalculation_lock_create - Create TSF recalculation mutex/spinlock
+ * @mldev:  ML device context
+ *
+ * Creates mutex/spinlock
+ *
+ * Return: void
+ */
+static inline void
+tsf_recalculation_lock_create(struct wlan_mlo_dev_context *mldev)
+{
+	qdf_spinlock_create(&mldev->tsf_recalculation_lock);
+}
+
+/**
+ * tsf_recalculation_lock_destroy - Destroy TSF recalculation mutex/spinlock
+ * @mldev:  ML device context
+ *
+ * Destroy mutex/spinlock
+ *
+ * Return: void
+ */
+static inline void
+tsf_recalculation_lock_destroy(struct wlan_mlo_dev_context *mldev)
+{
+	qdf_spinlock_destroy(&mldev->tsf_recalculation_lock);
+}
+
+/**
+ * tsf_recalculation_lock_acquire - Acquire TSF recalculation mutex/spinlock
+ * @mldev:  ML device context
+ *
+ * Acquire mutex/spinlock
+ *
+ * return: void
+ */
+static inline
+void tsf_recalculation_lock_acquire(struct wlan_mlo_dev_context *mldev)
+{
+	qdf_spin_lock_bh(&mldev->tsf_recalculation_lock);
+}
+
+/**
+ * tsf_recalculation_lock_release - Release TSF recalculation mutex/spinlock
+ * @mldev:  ML device context
+ *
+ * release mutex/spinlock
+ *
+ * return: void
+ */
+static inline
+void tsf_recalculation_lock_release(struct wlan_mlo_dev_context *mldev)
+{
+	qdf_spin_unlock_bh(&mldev->tsf_recalculation_lock);
+}
 #else /* WLAN_MLO_USE_SPINLOCK */
 static inline
 void ml_link_lock_create(struct mlo_mgr_context *mlo_ctx)
@@ -627,6 +683,62 @@ void copied_conn_req_lock_release(struct wlan_mlo_sta *sta_ctx)
 {
 	qdf_mutex_release(&sta_ctx->copied_conn_req_lock);
 }
+
+/**
+ * tsf_recalculation_lock_create - Create TSF recalculation mutex/spinlock
+ * @mldev:  ML device context
+ *
+ * Creates mutex/spinlock
+ *
+ * Return: void
+ */
+static inline void
+tsf_recalculation_lock_create(struct wlan_mlo_dev_context *mldev)
+{
+	qdf_mutex_create(&mldev->tsf_recalculation_lock);
+}
+
+/**
+ * tsf_recalculation_lock_destroy - Destroy TSF recalculation mutex/spinlock
+ * @mldev:  ML device context
+ *
+ * Destroy mutex/spinlock
+ *
+ * Return: void
+ */
+static inline void
+tsf_recalculation_lock_destroy(struct wlan_mlo_dev_context *mldev)
+{
+	qdf_mutex_destroy(&mldev->tsf_recalculation_lock);
+}
+
+/**
+ * tsf_recalculation_lock_acquire - Acquire TSF recalculation mutex/spinlock
+ * @mldev:  ML device context
+ *
+ * Acquire mutex/spinlock
+ *
+ * return: void
+ */
+static inline
+void tsf_recalculation_lock_acquire(struct wlan_mlo_dev_context *mldev)
+{
+	qdf_mutex_acquire(&mldev->tsf_recalculation_lock);
+}
+
+/**
+ * tsf_recalculation_lock_release - Release TSF recalculation mutex/spinlock
+ * @mldev:  ML device context
+ *
+ * release mutex/spinlock
+ *
+ * return: void
+ */
+static inline
+void tsf_recalculation_lock_release(struct wlan_mlo_dev_context *mldev)
+{
+	qdf_mutex_release(&mldev->tsf_recalculation_lock);
+}
 #endif /* WLAN_MLO_USE_SPINLOCK */
 
 /**

+ 3 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h

@@ -288,6 +288,7 @@ struct wlan_mlo_peer_list {
  * @mlo_peer: list peers in this MLO connection
  * @wlan_max_mlo_peer_count: peer count across the links of specific MLO
  * @mlo_dev_lock: lock to access struct
+ * @tsf_recalculation_lock: Lock to protect TSF (re)calculation
  * @ref_cnt: reference count
  * @ref_id_dbg: Reference count debug information
  * @sta_ctx: MLO STA related information
@@ -303,8 +304,10 @@ struct wlan_mlo_dev_context {
 	uint16_t wlan_max_mlo_peer_count;
 #ifdef WLAN_MLO_USE_SPINLOCK
 	qdf_spinlock_t mlo_dev_lock;
+	qdf_spinlock_t tsf_recalculation_lock;
 #else
 	qdf_mutex_t mlo_dev_lock;
+	qdf_mutex_t tsf_recalculation_lock;
 #endif
 	qdf_atomic_t ref_cnt;
 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];

+ 4 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_main.c

@@ -426,9 +426,11 @@ static QDF_STATUS mlo_dev_ctx_init(struct wlan_objmgr_vdev *vdev)
 	vdev->mlo_dev_ctx = ml_dev;
 
 	mlo_dev_lock_create(ml_dev);
+	tsf_recalculation_lock_create(ml_dev);
 	if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) {
 		ml_dev->sta_ctx = qdf_mem_malloc(sizeof(struct wlan_mlo_sta));
 		if (!ml_dev->sta_ctx) {
+			tsf_recalculation_lock_destroy(ml_dev);
 			mlo_dev_lock_destroy(ml_dev);
 			qdf_mem_free(ml_dev);
 			return QDF_STATUS_E_NOMEM;
@@ -436,6 +438,7 @@ static QDF_STATUS mlo_dev_ctx_init(struct wlan_objmgr_vdev *vdev)
 		copied_conn_req_lock_create(ml_dev->sta_ctx);
 	} else if (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) {
 		if (mlo_ap_ctx_init(ml_dev) != QDF_STATUS_SUCCESS) {
+			tsf_recalculation_lock_destroy(ml_dev);
 			mlo_dev_lock_destroy(ml_dev);
 			qdf_mem_free(ml_dev);
 			mlo_err("Failed to allocate memory for ap ctx");
@@ -522,6 +525,7 @@ static QDF_STATUS mlo_dev_ctx_deinit(struct wlan_objmgr_vdev *vdev)
 		else if (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE)
 			qdf_mem_free(ml_dev->ap_ctx);
 
+		tsf_recalculation_lock_destroy(ml_dev);
 		mlo_dev_lock_destroy(ml_dev);
 		qdf_mem_free(ml_dev);
 	}