summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidycchen <davidycchen@google.com>2022-03-15 13:28:13 +0800
committerdavidycchen <davidycchen@google.com>2022-03-15 14:36:27 +0800
commitad2ea221a4594a90f9feb91bd9133997558f49d0 (patch)
tree533098569dc7f83ae35a369c3f466d6ab2faf6ae
parentba43ce7e908a9f7f8c234d8cf4a0aa4d4a4f87fa (diff)
downloadsynaptics_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.c13
-rw-r--r--syna_tcm2.h2
-rw-r--r--tcm/synaptics_touchcom_func_reflash.c8
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;
}