BLOCK_SIZE_MASK) + 3;
 
        host->wait_for = MMCIF_WAIT_FOR_READ;
-       schedule_delayed_work(&host->timeout_work, host->timeout);
 
        /* buf read enable */
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFREN);
        host->sg_idx = 0;
        host->sg_blkidx = 0;
        host->pio_ptr = sg_virt(data->sg);
-       schedule_delayed_work(&host->timeout_work, host->timeout);
+
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFREN);
 }
 
        if (!sh_mmcif_next_block(host, p))
                return false;
 
-       schedule_delayed_work(&host->timeout_work, host->timeout);
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFREN);
 
        return true;
                           BLOCK_SIZE_MASK) + 3;
 
        host->wait_for = MMCIF_WAIT_FOR_WRITE;
-       schedule_delayed_work(&host->timeout_work, host->timeout);
 
        /* buf write enable */
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
        host->sg_idx = 0;
        host->sg_blkidx = 0;
        host->pio_ptr = sg_virt(data->sg);
-       schedule_delayed_work(&host->timeout_work, host->timeout);
+
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
 }
 
        if (!sh_mmcif_next_block(host, p))
                return false;
 
-       schedule_delayed_work(&host->timeout_work, host->timeout);
        sh_mmcif_bitset(host, MMCIF_CE_INT_MASK, MASK_MBUFWEN);
 
        return true;
        }
 
        host->wait_for = MMCIF_WAIT_FOR_STOP;
-       schedule_delayed_work(&host->timeout_work, host->timeout);
 }
 
 static void sh_mmcif_request(struct mmc_host *mmc, struct mmc_request *mrq)
 {
        struct sh_mmcif_host *host = dev_id;
        struct mmc_request *mrq = host->mrq;
+       bool wait = false;
 
        cancel_delayed_work_sync(&host->timeout_work);
 
                /* We're too late, the timeout has already kicked in */
                return IRQ_HANDLED;
        case MMCIF_WAIT_FOR_CMD:
-               if (sh_mmcif_end_cmd(host))
-                       /* Wait for data */
-                       return IRQ_HANDLED;
+               /* Wait for data? */
+               wait = sh_mmcif_end_cmd(host);
                break;
        case MMCIF_WAIT_FOR_MREAD:
-               if (sh_mmcif_mread_block(host))
-                       /* Wait for more data */
-                       return IRQ_HANDLED;
+               /* Wait for more data? */
+               wait = sh_mmcif_mread_block(host);
                break;
        case MMCIF_WAIT_FOR_READ:
-               if (sh_mmcif_read_block(host))
-                       /* Wait for data end */
-                       return IRQ_HANDLED;
+               /* Wait for data end? */
+               wait = sh_mmcif_read_block(host);
                break;
        case MMCIF_WAIT_FOR_MWRITE:
-               if (sh_mmcif_mwrite_block(host))
-                       /* Wait data to write */
-                       return IRQ_HANDLED;
+               /* Wait data to write? */
+               wait = sh_mmcif_mwrite_block(host);
                break;
        case MMCIF_WAIT_FOR_WRITE:
-               if (sh_mmcif_write_block(host))
-                       /* Wait for data end */
-                       return IRQ_HANDLED;
+               /* Wait for data end? */
+               wait = sh_mmcif_write_block(host);
                break;
        case MMCIF_WAIT_FOR_STOP:
                if (host->sd_error) {
                BUG();
        }
 
+       if (wait) {
+               schedule_delayed_work(&host->timeout_work, host->timeout);
+               /* Wait for more data */
+               return IRQ_HANDLED;
+       }
+
        if (host->wait_for != MMCIF_WAIT_FOR_STOP) {
                struct mmc_data *data = mrq->data;
                if (!mrq->cmd->error && data && !data->error)
 
                if (mrq->stop && !mrq->cmd->error && (!data || !data->error)) {
                        sh_mmcif_stop_cmd(host, mrq);
-                       if (!mrq->stop->error)
+                       if (!mrq->stop->error) {
+                               schedule_delayed_work(&host->timeout_work, host->timeout);
                                return IRQ_HANDLED;
+                       }
                }
        }