|
@@ -848,7 +848,7 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data,
|
|
|
/* The error clause is handled above, success! */
|
|
|
data->bytes_xfered = data->blksz * data->blocks;
|
|
|
|
|
|
- if (!data->stop) {
|
|
|
+ if (!data->stop || host->mrq->sbc) {
|
|
|
mmci_request_end(host, data->mrq);
|
|
|
} else {
|
|
|
mmci_start_command(host, data->stop, 0);
|
|
@@ -861,6 +861,7 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
|
|
|
unsigned int status)
|
|
|
{
|
|
|
void __iomem *base = host->base;
|
|
|
+ bool sbc = (cmd == host->mrq->sbc);
|
|
|
|
|
|
host->cmd = NULL;
|
|
|
|
|
@@ -875,7 +876,7 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
|
|
|
cmd->resp[3] = readl(base + MMCIRESPONSE3);
|
|
|
}
|
|
|
|
|
|
- if (!cmd->data || cmd->error) {
|
|
|
+ if ((!sbc && !cmd->data) || cmd->error) {
|
|
|
if (host->data) {
|
|
|
/* Terminate the DMA transfer */
|
|
|
if (dma_inprogress(host)) {
|
|
@@ -884,7 +885,9 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd,
|
|
|
}
|
|
|
mmci_stop_data(host);
|
|
|
}
|
|
|
- mmci_request_end(host, cmd->mrq);
|
|
|
+ mmci_request_end(host, host->mrq);
|
|
|
+ } else if (sbc) {
|
|
|
+ mmci_start_command(host, host->mrq->cmd, 0);
|
|
|
} else if (!(cmd->data->flags & MMC_DATA_READ)) {
|
|
|
mmci_start_data(host, cmd->data);
|
|
|
}
|
|
@@ -1125,7 +1128,10 @@ static void mmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|
|
if (mrq->data && mrq->data->flags & MMC_DATA_READ)
|
|
|
mmci_start_data(host, mrq->data);
|
|
|
|
|
|
- mmci_start_command(host, mrq->cmd, 0);
|
|
|
+ if (mrq->sbc)
|
|
|
+ mmci_start_command(host, mrq->sbc, 0);
|
|
|
+ else
|
|
|
+ mmci_start_command(host, mrq->cmd, 0);
|
|
|
|
|
|
spin_unlock_irqrestore(&host->lock, flags);
|
|
|
}
|