]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
misc: ti-st: add handling of the signal case
authorNicholas Mc Guire <der.herr@hofr.at>
Tue, 20 Jan 2015 05:27:45 +0000 (06:27 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 25 Jan 2015 17:18:00 +0000 (09:18 -0800)
if(!wait_for_completion_interruptible_timeout(...))
only handles the timeout case - this patch adds handling the
signal case the same as timeout.

Only the timeout case was being handled, the signal case
(-ERESTARTSYS) was treated just like the case of successful
completion, which is most likely not reasonable.

read_local_version() is called from download_firmware() where
it checks for !=0 return, so the error handling logic should be
preserved correctly.

download_firmware() is called from st_kim_start() which is
checking for !=0 return, so the error handling logic should be
preserved correctly

Signed-off-by: Nicholas Mc Guire <der.herr@hofr.at>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/ti-st/st_kim.c

index 7109d28518d3306629ad11ad718de8827db899a8..8fb116f8a152462925259f8017d4477a0dcf23f6 100644 (file)
@@ -219,6 +219,7 @@ static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name)
 {
        unsigned short version = 0, chip = 0, min_ver = 0, maj_ver = 0;
        const char read_ver_cmd[] = { 0x01, 0x01, 0x10, 0x00 };
+       long timeout;
 
        pr_debug("%s", __func__);
 
@@ -228,10 +229,11 @@ static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name)
                return -EIO;
        }
 
-       if (!wait_for_completion_interruptible_timeout(
-               &kim_gdata->kim_rcvd, msecs_to_jiffies(CMD_RESP_TIME))) {
-               pr_err(" waiting for ver info- timed out ");
-               return -ETIMEDOUT;
+       timeout = wait_for_completion_interruptible_timeout(
+               &kim_gdata->kim_rcvd, msecs_to_jiffies(CMD_RESP_TIME));
+       if (timeout <= 0) {
+               pr_err(" waiting for ver info- timed out or received signal");
+               return timeout ? -ERESTARTSYS : -ETIMEDOUT;
        }
        reinit_completion(&kim_gdata->kim_rcvd);
        /* the positions 12 & 13 in the response buffer provide with the
@@ -395,13 +397,14 @@ static long download_firmware(struct kim_data_s *kim_gdata)
                        break;
                case ACTION_WAIT_EVENT:  /* wait */
                        pr_debug("W");
-                       if (!wait_for_completion_interruptible_timeout(
+                       err = wait_for_completion_interruptible_timeout(
                                        &kim_gdata->kim_rcvd,
-                                       msecs_to_jiffies(CMD_RESP_TIME))) {
-                               pr_err("response timeout during fw download ");
+                                       msecs_to_jiffies(CMD_RESP_TIME));
+                       if (err <= 0) {
+                               pr_err("response timeout/signaled during fw download ");
                                /* timed out */
                                release_firmware(kim_gdata->fw_entry);
-                               return -ETIMEDOUT;
+                               return err ? -ERESTARTSYS : -ETIMEDOUT;
                        }
                        reinit_completion(&kim_gdata->kim_rcvd);
                        break;