bool have_dma;
bool use_dma;
+ bool wait_for_dma;
/*end of DMA part*/
int max_delay; /* maximum length of time spent waiting */
spin_lock_irqsave(&host->lock, flags);
+ host->use_dma = false;
+
if (host->data && !(host->data->flags & MMC_DATA_WRITE)) {
/* otherwise handled in SDHCI IRQ */
dma_chan = host->dma_chan_rxtx;
dir_data);
bcm2835_mmc_finish_data(host);
+ } else if (host->wait_for_dma) {
+ host->wait_for_dma = false;
+ tasklet_schedule(&host->finish_tasklet);
}
spin_unlock_irqrestore(&host->lock, flags);
mod_timer(&host->timer, timeout);
host->cmd = cmd;
+ host->use_dma = false;
bcm2835_mmc_prepare_data(host, cmd);
}
bcm2835_mmc_send_command(host, data->stop);
- } else
+ } else if (host->use_dma) {
+ host->wait_for_dma = true;
+ } else {
tasklet_schedule(&host->finish_tasklet);
+ }
}
static void bcm2835_mmc_finish_command(struct bcm2835_host *host)