EXPORT_SYMBOL(mmc_request_done);
 
-static void
-mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
+static int mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
 {
 #ifdef CONFIG_MMC_DEBUG
        unsigned int i, sz;
        struct scatterlist *sg;
 #endif
+       if (mmc_card_removed(host->card))
+               return -ENOMEDIUM;
 
        if (mrq->sbc) {
                pr_debug("<%s: starting CMD%u arg %08x flags %08x>\n",
        mmc_host_clk_hold(host);
        led_trigger_event(host->led, LED_FULL);
        host->ops->request(host, mrq);
+
+       return 0;
 }
 
 /**
  */
 static int __mmc_start_data_req(struct mmc_host *host, struct mmc_request *mrq)
 {
+       int err;
+
        mrq->done = mmc_wait_data_done;
        mrq->host = host;
-       if (mmc_card_removed(host->card)) {
-               mrq->cmd->error = -ENOMEDIUM;
+
+       err = mmc_start_request(host, mrq);
+       if (err) {
+               mrq->cmd->error = err;
                mmc_wait_data_done(mrq);
-               return -ENOMEDIUM;
        }
-       mmc_start_request(host, mrq);
 
-       return 0;
+       return err;
 }
 
 static int __mmc_start_req(struct mmc_host *host, struct mmc_request *mrq)
 {
+       int err;
+
        init_completion(&mrq->completion);
        mrq->done = mmc_wait_done;
-       if (mmc_card_removed(host->card)) {
-               mrq->cmd->error = -ENOMEDIUM;
+
+       err = mmc_start_request(host, mrq);
+       if (err) {
+               mrq->cmd->error = err;
                complete(&mrq->completion);
-               return -ENOMEDIUM;
        }
-       mmc_start_request(host, mrq);
-       return 0;
+
+       return err;
 }
 
 /*