FM Radio: Wait for disable to complete
Make disable fm to be synchronous. On factory reset, disable fm
and enable fm called back to back. If enable fm command sent before
disable fm completes, fm enable fails. Hence wait for disable fm
to complete.
Change-Id: Ic3630f7bdd39ca812d9ae81b45a9c496049aef84
diff --git a/fm_hci/fm_hci.c b/fm_hci/fm_hci.c
index c48edd5..378e0c9 100644
--- a/fm_hci/fm_hci.c
+++ b/fm_hci/fm_hci.c
@@ -677,6 +677,12 @@
return;
}
event_notification(hci, HC_EVENT_EXIT);
+ pthread_mutex_lock(&hci->event_lock);
+again:
+ pthread_cond_wait(&hci->event_cond, &hci->event_lock);
+ if (!(ready_events & HC_EVENT_EXIT_DONE))
+ goto again;
+ pthread_mutex_unlock(&hci->event_lock);
}
int fm_hci_init(fm_hci_hal_t *hci_hal)
@@ -785,6 +791,7 @@
vendor_close(hci);
pthread_cond_broadcast(&hci->event_cond);
pthread_cond_broadcast(&hci->cmd_credits_cond);
+ event_notification(hci, HC_EVENT_EXIT_DONE);
stop_rx_thread(hci);
stop_tx_thread(hci);
ALOGD("Tx, Rx Threads join done");
diff --git a/fm_hci/fm_hci.h b/fm_hci/fm_hci.h
index 8818068..2cfb30e 100644
--- a/fm_hci/fm_hci.h
+++ b/fm_hci/fm_hci.h
@@ -46,6 +46,7 @@
#define HC_EVENT_LPM_IDLE_TIMEOUT 0x0100
#define HC_EVENT_EXIT 0x0200
#define HC_EVENT_EPILOG 0x0400
+#define HC_EVENT_EXIT_DONE 0x8000
#define MAX_FM_CMD_CNT 100
#define FM_CMD 0x11