From ad2ea221a4594a90f9feb91bd9133997558f49d0 Mon Sep 17 00:00:00 2001 From: davidycchen Date: Tue, 15 Mar 2022 13:28:13 +0800 Subject: 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 Change-Id: I9521fd83a78aaf7ca34372407f7fb49bf18af53f --- syna_tcm2.c | 13 ++++++++++--- syna_tcm2.h | 2 ++ 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; } -- cgit v1.2.3