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
This commit is contained in:
Baowei Liu 2020-05-19 19:00:48 +08:00 • committed by nshrivas
commit ca3412698e
2 changed files with 10 additions and 4 deletions

View file

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

View file

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