diff --git a/qdf/linux/src/i_qdf_event.h b/qdf/linux/src/i_qdf_event.h index 41726f934dc1..63870679c94a 100644 --- a/qdf/linux/src/i_qdf_event.h +++ b/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; diff --git a/qdf/linux/src/qdf_event.c b/qdf/linux/src/qdf_event.c index c504e586b405..6de3be8758c3 100644 --- a/qdf/linux/src/qdf_event.c +++ b/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);