From: Kautuk Consul <kautuk_con...@mentor.com>

We now prefer to rely on the calculated CRC and not on the CRC stored in
the file.

The new logic is as follows:
1) stored CRC of file != calculated CRC of file, then refuse the possible
   corrupted file
2) calculated CRC of file != CRC of configuration in controller, then
   update configuration in controller
3) calculated CRC of file == CRC of configuration in controller, then
   ignore configuration file

Signed-off-by: Kautuk Consul <kautuk_con...@mentor.com>
Signed-off-by: George G. Davis <george_da...@mentor.com>
Signed-off-by: Jiada Wang <jiada_w...@mentor.com>
---
 drivers/input/touchscreen/atmel_mxt_ts.c | 65 +++++++++++++-----------
 1 file changed, 36 insertions(+), 29 deletions(-)

diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c 
b/drivers/input/touchscreen/atmel_mxt_ts.c
index e441eab8b201..bdc5088baea8 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -1908,7 +1908,7 @@ static int mxt_update_cfg(struct mxt_data *data, const 
struct firmware *fw)
        int ret;
        int offset;
        int i;
-       u32 info_crc, config_crc, calculated_crc;
+       u32 info_crc, config_crc, calculated_crc = 0;
        u16 crc_start = 0;
 
        /* Make zero terminated copy of the OBP_RAW file */
@@ -1971,30 +1971,6 @@ static int mxt_update_cfg(struct mxt_data *data, const 
struct firmware *fw)
        }
        cfg.raw_pos += offset;
 
-       /*
-        * The Info Block CRC is calculated over mxt_info and the object
-        * table. If it does not match then we are trying to load the
-        * configuration from a different chip or firmware version, so
-        * the configuration CRC is invalid anyway.
-        */
-       if (info_crc == data->info_crc) {
-               if (config_crc == 0 || data->config_crc == 0) {
-                       dev_info(dev, "CRC zero, attempting to apply config\n");
-               } else if (config_crc == data->config_crc) {
-                       dev_dbg(dev, "Config CRC 0x%06X: OK\n",
-                                data->config_crc);
-                       ret = 0;
-                       goto release_raw;
-               } else {
-                       dev_info(dev, "Config CRC 0x%06X: does not match file 
0x%06X\n",
-                                data->config_crc, config_crc);
-               }
-       } else {
-               dev_warn(dev,
-                        "Warning: Info CRC error - device=0x%06X 
file=0x%06X\n",
-                        data->info_crc, info_crc);
-       }
-
        /* Malloc memory to store configuration */
        cfg.start_ofs = MXT_OBJECT_START +
                        data->info->object_num * sizeof(struct mxt_object) +
@@ -2018,14 +1994,45 @@ static int mxt_update_cfg(struct mxt_data *data, const 
struct firmware *fw)
        else
                dev_warn(dev, "Could not find CRC start\n");
 
-       if (crc_start > cfg.start_ofs) {
+       if (crc_start > cfg.start_ofs)
                calculated_crc = mxt_calculate_crc(cfg.mem,
                                                   crc_start - cfg.start_ofs,
                                                   cfg.mem_size);
 
-               if (config_crc > 0 && config_crc != calculated_crc)
-                       dev_warn(dev, "Config CRC in file inconsistent, 
calculated=%06X, file=%06X\n",
-                                calculated_crc, config_crc);
+       /* If the CRC stored in the file is not the same as what
+        * was calculated by mxt_calculate_crc, this means we
+        * have to refuse the config file and abort download.
+        */
+       if (config_crc != calculated_crc) {
+               dev_warn(dev,
+                        "Config CRC in file inconsistent, calculated=%06X, 
file=%06X\n",
+                        calculated_crc, config_crc);
+               ret = 0;
+               goto release_mem;
+       }
+
+       /*
+        * The Info Block CRC is calculated over mxt_info and the object
+        * table. If it does not match then we are trying to load the
+        * configuration from a different chip or firmware version, so
+        * the configuration CRC is invalid anyway.
+        */
+       if (info_crc == data->info_crc) {
+               if (config_crc == 0 || data->config_crc == 0) {
+                       dev_info(dev, "CRC zero, attempting to apply config\n");
+               } else if (config_crc == data->config_crc) {
+                       dev_dbg(dev, "Config CRC 0x%06X: OK\n",
+                               data->config_crc);
+                       ret = 0;
+                       goto release_mem;
+               } else {
+                       dev_info(dev, "Config CRC 0x%06X: does not match file 
0x%06X\n",
+                                data->config_crc, config_crc);
+               }
+       } else {
+               dev_warn(dev,
+                        "Warning: Info CRC error - device=0x%06X 
file=0x%06X\n",
+                        data->info_crc, info_crc);
        }
 
        ret = mxt_upload_cfg_mem(data, &cfg);
-- 
2.19.2

Reply via email to