Browse Source

qcacmn: Flush target_if response timers for vdev

Flush target_if response timers for vdev for given psoc. This API
used to flush target_if response timers for vdev while wlan driver
shutdown.

Change-Id: I1700893cdf0b0eb9d3419505c88c71fc86da0dab
CRs-Fixed: 2529284
Abhishek Ambure 5 years ago
parent
commit
f1feeae916

+ 28 - 0
target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h

@@ -51,6 +51,34 @@ static inline bool target_if_vdev_mgr_is_panic_allowed(void)
 }
 #endif
 
+/**
+ * target_if_timer_flush_handler() - API to handle target_if timer flush
+ * request
+ * @pdev: pointer to pdev object
+ * @object: pointer to vdev object
+ * @arg: pointer to arguments passed
+ *
+ * This is a target_if timer flush handler used to flush target_if response
+ * timer. This API used while wlan driver shut down.
+ *
+ * Return: none
+ */
+void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev,
+				   void *object,
+				   void *arg);
+
+/**
+ * target_if_flush_vdev_timers() - API to flush target_if response timers
+ * for vdev
+ * @pdev: pointer to pdev object
+ *
+ * This API is used to flush target_if response timer. This API used while
+ * wlan driver shut down.
+ *
+ * Return: none
+ */
+void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev);
+
 /**
  * target_if_vdev_mgr_delete_response_handler() - API to handle vdev delete
  * response

+ 33 - 0
target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c

@@ -150,6 +150,39 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 	}
 }
 
+void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev,
+				   void *object,
+				   void *arg)
+{
+	struct vdev_response_timer *vdev_rsp;
+	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_objmgr_vdev *vdev = object;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc) {
+		mlme_err("PSOC is NULL");
+		return;
+	}
+
+	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
+	if (!rx_ops || !rx_ops->vdev_mgr_get_response_timer_info) {
+		mlme_err("No Rx Ops");
+		return;
+	}
+
+	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	if (qdf_timer_sync_cancel(&vdev_rsp->rsp_timer))
+		target_if_vdev_mgr_rsp_timer_cb(vdev);
+}
+
+void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev)
+{
+	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
+					  target_if_timer_flush_handler,
+					  NULL, true, WLAN_VDEV_TARGET_IF_ID);
+}
+
 #ifdef SERIALIZE_VDEV_RESP_TIMER
 static QDF_STATUS target_if_vdev_mgr_rsp_flush_cb(struct scheduler_msg *msg)
 {