ソースを参照

qcacmn: Not set "force_set" if event completed

"qdf_complete_wait_events" set force_set flag for all event in
"qdf_wait_event_list". This cause qdf_wait_for_event_completion
return QDF_STATUS_E_FAULT, even if event have completed

Add new flag "done" to record event completed. Use this flag to
detect event have completed or not.

Change-Id: I31f947169153ccbeb8435c539faab1059c055c04
Baowei Liu 5 年 前
コミット
ca3412698e
2 ファイル変更10 行追加4 行削除
  1. 3 1
      qdf/linux/src/i_qdf_event.h
  2. 7 3
      qdf/linux/src/qdf_event.c

+ 3 - 1
qdf/linux/src/i_qdf_event.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2017,2020 The Linux Foundation. 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
@@ -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;
 

+ 7 - 3
qdf/linux/src/qdf_event.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2020 The Linux Foundation. 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
@@ -102,6 +102,7 @@ QDF_STATUS qdf_event_set(qdf_event_t *event)
 		return QDF_STATUS_E_INVAL;
 
 	complete(&event->complete);
+	event->done = true;
 
 	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);