diff options
author | davidycchen <davidycchen@google.com> | 2022-03-15 13:28:13 +0800 |
---|---|---|
committer | davidycchen <davidycchen@google.com> | 2022-03-15 14:36:27 +0800 |
commit | ad2ea221a4594a90f9feb91bd9133997558f49d0 (patch) | |
tree | 533098569dc7f83ae35a369c3f466d6ab2faf6ae | |
parent | ba43ce7e908a9f7f8c234d8cf4a0aa4d4a4f87fa (diff) | |
download | synaptics_touch-ad2ea221a4594a90f9feb91bd9133997558f49d0.tar.gz |
synaptics: retry when the firmware update fail
Queue the firmware update delay work again when it fails.
Bug: 223725391
Test: Firmware update successfully.
Signed-off-by: davidycchen <davidycchen@google.com>
Change-Id: I9521fd83a78aaf7ca34372407f7fb49bf18af53f
-rw-r--r-- | syna_tcm2.c | 13 | ||||
-rw-r--r-- | syna_tcm2.h | 2 | ||||
-rw-r--r-- | tcm/synaptics_touchcom_func_reflash.c | 8 |
3 files changed, 17 insertions, 6 deletions
diff --git a/syna_tcm2.c b/syna_tcm2.c index 2ca7ce5..742e8b6 100644 --- a/syna_tcm2.c +++ b/syna_tcm2.c @@ -1610,17 +1610,22 @@ static void syna_dev_reflash_startup_work(struct work_struct *work) fw_image, fw_image_size, RESP_IN_ATTN, - false); + tcm->force_reflash); #else /* do firmware update for the common device */ retval = syna_tcm_do_fw_update(tcm_dev, fw_image, fw_image_size, RESP_IN_ATTN, - false); + tcm->force_reflash); #endif if (retval < 0) { - LOGE("Fail to do reflash\n"); + LOGE("Fail to do reflash, reflash_count = %d\n", tcm->reflash_count); + tcm->force_reflash = true; + if (tcm->reflash_count++ < 3) { + queue_delayed_work(tcm->reflash_workqueue, &tcm->reflash_work, + msecs_to_jiffies(STARTUP_REFLASH_DELAY_TIME_MS)); + } goto exit; } @@ -2470,6 +2475,8 @@ static int syna_dev_connect(struct syna_tcm *tcm) * create a delayed work to perform fw update during the startup time */ #ifdef STARTUP_REFLASH + tcm->force_reflash = false; + tcm->reflash_count = 0; tcm->reflash_workqueue = create_singlethread_workqueue("syna_reflash"); INIT_DELAYED_WORK(&tcm->reflash_work, syna_dev_reflash_startup_work); diff --git a/syna_tcm2.h b/syna_tcm2.h index ecf6987..bdf0daf 100644 --- a/syna_tcm2.h +++ b/syna_tcm2.h @@ -419,6 +419,8 @@ struct syna_tcm { /* Workqueue used for fw update */ struct delayed_work reflash_work; struct workqueue_struct *reflash_workqueue; + u8 reflash_count; + bool force_reflash; struct work_struct suspend_work; struct work_struct resume_work; diff --git a/tcm/synaptics_touchcom_func_reflash.c b/tcm/synaptics_touchcom_func_reflash.c index 5115b73..b30eb7a 100644 --- a/tcm/synaptics_touchcom_func_reflash.c +++ b/tcm/synaptics_touchcom_func_reflash.c @@ -1976,6 +1976,7 @@ int syna_tcm_do_fw_update(struct tcm_dev *tcm_dev, unsigned int wait_delay_ms, bool force_reflash) { int retval; + int retval_reset; enum update_area type = UPDATE_NONE; struct tcm_reflash_data_blob reflash_data; int app_status; @@ -2067,9 +2068,10 @@ reflash: retval = 0; reset: - retval = syna_tcm_reset(tcm_dev); - if (retval < 0) { - LOGE("Fail to do reset\n"); + retval_reset = syna_tcm_reset(tcm_dev); + if (retval_reset < 0) { + LOGE("Fail to do reset, retval_reset = %d\n", retval_reset); + retval = retval_reset; goto exit; } |