|
|
@@ -894,12 +894,36 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static void tmio_process_mrq(struct tmio_mmc_host *host, struct mmc_request *mrq)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (mrq->data) {
|
|
|
+ ret = tmio_mmc_start_data(host, mrq->data);
|
|
|
+ if (ret)
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = tmio_mmc_start_command(host, mrq->cmd);
|
|
|
+ if (ret)
|
|
|
+ goto fail;
|
|
|
+
|
|
|
+ schedule_delayed_work(&host->delayed_reset_work,
|
|
|
+ msecs_to_jiffies(CMDREQ_TIMEOUT));
|
|
|
+ return;
|
|
|
+
|
|
|
+fail:
|
|
|
+ host->force_pio = false;
|
|
|
+ host->mrq = NULL;
|
|
|
+ mrq->cmd->error = ret;
|
|
|
+ mmc_request_done(host->mmc, mrq);
|
|
|
+}
|
|
|
+
|
|
|
/* Process requests from the MMC layer */
|
|
|
static void tmio_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
{
|
|
|
struct tmio_mmc_host *host = mmc_priv(mmc);
|
|
|
unsigned long flags;
|
|
|
- int ret;
|
|
|
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
|
|
|
@@ -919,25 +943,7 @@ static void tmio_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
|
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
|
|
|
|
|
- if (mrq->data) {
|
|
|
- ret = tmio_mmc_start_data(host, mrq->data);
|
|
|
- if (ret)
|
|
|
- goto fail;
|
|
|
- }
|
|
|
-
|
|
|
- ret = tmio_mmc_start_command(host, mrq->cmd);
|
|
|
- if (ret)
|
|
|
- goto fail;
|
|
|
-
|
|
|
- schedule_delayed_work(&host->delayed_reset_work,
|
|
|
- msecs_to_jiffies(CMDREQ_TIMEOUT));
|
|
|
- return;
|
|
|
-
|
|
|
-fail:
|
|
|
- host->force_pio = false;
|
|
|
- host->mrq = NULL;
|
|
|
- mrq->cmd->error = ret;
|
|
|
- mmc_request_done(mmc, mrq);
|
|
|
+ tmio_process_mrq(host, mrq);
|
|
|
}
|
|
|
|
|
|
static int tmio_mmc_clk_enable(struct tmio_mmc_host *host)
|