From ca3412698e53ad816aa17c8255246a809f3ad7d1 Mon Sep 17 00:00:00 2001 From: Baowei Liu Date: Tue, 19 May 2020 19:00:48 +0800 Subject: [PATCH] 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 --- qdf/linux/src/i_qdf_event.h | 4 +++- qdf/linux/src/qdf_event.c | 10 +++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) 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);