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);