|
@@ -141,12 +141,12 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq)
|
|
}
|
|
}
|
|
|
|
|
|
if (err && cmd->retries) {
|
|
if (err && cmd->retries) {
|
|
- pr_debug("%s: req failed (CMD%u): %d, retrying...\n",
|
|
|
|
- mmc_hostname(host), cmd->opcode, err);
|
|
|
|
-
|
|
|
|
- cmd->retries--;
|
|
|
|
- cmd->error = 0;
|
|
|
|
- host->ops->request(host, mrq);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Request starter must handle retries - see
|
|
|
|
+ * mmc_wait_for_req_done().
|
|
|
|
+ */
|
|
|
|
+ if (mrq->done)
|
|
|
|
+ mrq->done(mrq);
|
|
} else {
|
|
} else {
|
|
mmc_should_fail_request(host, mrq);
|
|
mmc_should_fail_request(host, mrq);
|
|
|
|
|
|
@@ -253,7 +253,21 @@ static void __mmc_start_req(struct mmc_host *host, struct mmc_request *mrq)
|
|
static void mmc_wait_for_req_done(struct mmc_host *host,
|
|
static void mmc_wait_for_req_done(struct mmc_host *host,
|
|
struct mmc_request *mrq)
|
|
struct mmc_request *mrq)
|
|
{
|
|
{
|
|
- wait_for_completion(&mrq->completion);
|
|
|
|
|
|
+ struct mmc_command *cmd;
|
|
|
|
+
|
|
|
|
+ while (1) {
|
|
|
|
+ wait_for_completion(&mrq->completion);
|
|
|
|
+
|
|
|
|
+ cmd = mrq->cmd;
|
|
|
|
+ if (!cmd->error || !cmd->retries)
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ pr_debug("%s: req failed (CMD%u): %d, retrying...\n",
|
|
|
|
+ mmc_hostname(host), cmd->opcode, cmd->error);
|
|
|
|
+ cmd->retries--;
|
|
|
|
+ cmd->error = 0;
|
|
|
|
+ host->ops->request(host, mrq);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|