/* copy dev->status (lower 16 bits) in order to release lock */
        if (ret > 0)
                ret = dev->status & 0xffff;
-       else
-               ret = -EIO;
+       else if (ret == 0)
+               ret = -ETIMEDOUT;
 
        /* restore the ctrl regs state */
        writel(ctrlreg1, dev->io_base + SMI_CR1);
        finish = jiffies + timeout;
        do {
                status = spear_smi_read_sr(dev, bank);
-               if (status < 0)
-                       continue; /* try till timeout */
-               else if (!(status & SR_WIP))
+               if (status < 0) {
+                       if (status == -ETIMEDOUT)
+                               continue; /* try till finish */
+                       return status;
+               } else if (!(status & SR_WIP)) {
                        return 0;
+               }
 
                cond_resched();
        } while (!time_after_eq(jiffies, finish));
 
        dev_err(&dev->pdev->dev, "smi controller is busy, timeout\n");
-       return status;
+       return -EBUSY;
 }
 
 /**
        writel(ctrlreg1, dev->io_base + SMI_CR1);
        writel(0, dev->io_base + SMI_CR2);
 
-       if (ret <= 0) {
+       if (ret == 0) {
                ret = -EIO;
                dev_err(&dev->pdev->dev,
                        "smi controller failed on write enable\n");
-       } else {
+       } else if (ret > 0) {
                /* check whether write mode status is set for required bank */
                if (dev->status & (1 << (bank + WM_SHIFT)))
                        ret = 0;
        ret = wait_event_interruptible_timeout(dev->cmd_complete,
                        dev->status & TFF, SMI_CMD_TIMEOUT);
 
-       if (ret <= 0) {
+       if (ret == 0) {
                ret = -EIO;
                dev_err(&dev->pdev->dev, "sector erase failed\n");
-       } else
+       } else if (ret > 0)
                ret = 0; /* success */
 
        /* restore ctrl regs */