From f884be9f795eb5262ef7f04a6e6f46c61cf4bc9b Mon Sep 17 00:00:00 2001 From: Baowei Liu Date: Wed, 17 Jun 2020 15:17:52 +0800 Subject: [PATCH] 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 --- qdf/linux/src/i_qdf_event.h | 2 ++ qdf/linux/src/qdf_event.c | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/qdf/linux/src/i_qdf_event.h b/qdf/linux/src/i_qdf_event.h index 91305f888783..63870679c94a 100644 --- a/qdf/linux/src/i_qdf_event.h +++ b/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; diff --git a/qdf/linux/src/qdf_event.c b/qdf/linux/src/qdf_event.c index fc53672ff6e4..3fcaae820464 100644 --- a/qdf/linux/src/qdf_event.c +++ b/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);