Parcourir la source

qcacmn: Improve 'Not set force_set if event completed'

Original changes have problems and have been reverted.
This is improved fix, the difference is set event done flag
before complete

Original submit is I31f947169153ccbeb8435c539faab1059c055c04
Revert submit is If8318b28883ae8ddd4fee36013f28c45f30fa426

Change-Id: I72814381a3ee932c9ff43fdae7d2dda5619baa48
Baowei Liu il y a 5 ans
Parent
commit
f884be9f79
2 fichiers modifiés avec 8 ajouts et 2 suppressions
  1. 2 0
      qdf/linux/src/i_qdf_event.h
  2. 6 2
      qdf/linux/src/qdf_event.c

+ 2 - 0
qdf/linux/src/i_qdf_event.h

@@ -30,11 +30,13 @@
  * qdf_event_t - manages events
  * @complete: instance to completion
  * @cookie: unsigned int
+ * @done: indicate completion
  * @force_set: indicate forceful completion
  */
 typedef struct qdf_evt {
 	struct completion complete;
 	uint32_t cookie;
+	bool done;
 	bool force_set;
 } __qdf_event_t;
 

+ 6 - 2
qdf/linux/src/qdf_event.c

@@ -101,6 +101,7 @@ QDF_STATUS qdf_event_set(qdf_event_t *event)
 	if (event->cookie != LINUX_EVENT_COOKIE)
 		return QDF_STATUS_E_INVAL;
 
+	event->done = true;
 	complete(&event->complete);
 
 	return QDF_STATUS_SUCCESS;
@@ -134,6 +135,7 @@ QDF_STATUS qdf_event_reset(qdf_event_t *event)
 		return QDF_STATUS_E_INVAL;
 
 	/* (re)initialize event */
+	event->done = false;
 	event->force_set = false;
 	INIT_COMPLETION(event->complete);
 
@@ -252,8 +254,10 @@ void qdf_complete_wait_events(void)
 		event_node = qdf_container_of(list_node,
 						struct qdf_evt_node, node);
 
-		event_node->pevent->force_set = true;
-		qdf_event_set(event_node->pevent);
+		if (!event_node->pevent->done) {
+			event_node->pevent->force_set = true;
+			qdf_event_set(event_node->pevent);
+		}
 
 		status = qdf_list_peek_next(&qdf_wait_event_list,
 					&event_node->node, &list_node);