static void pio_tasklet(unsigned long data) { struct s3cmci_host *host = (struct s3cmci_host *) data; disable_irq(host->irq); if (host->pio_active == XFER_WRITE) do_pio_write(host); if (host->pio_active == XFER_READ) do_pio_read(host); if (host->complete_what == COMPLETION_FINALIZE) { clear_imask(host); if (host->pio_active != XFER_NONE) { dbg(host, dbg_err, "unfinished %s " "- pio_count:[%u] pio_words:[%u]\n", (host->pio_active == XFER_READ)?"read":"write", host->pio_count, host->pio_words); host->mrq->data->error = -EIO; // host->mrq->data->error = MMC_ERR_DMA; } finalize_request(host); } else enable_irq(host->irq); }
static int s3cmci_prepare_pio(struct s3cmci_host *host, struct mmc_data *data) { int rw = (data->flags & MMC_DATA_WRITE) ? 1 : 0; BUG_ON((data->flags & BOTH_DIR) == BOTH_DIR); host->pio_sgptr = 0; host->pio_words = 0; host->pio_count = 0; host->pio_active = rw ? XFER_WRITE : XFER_READ; if (rw) { do_pio_write(host); enable_imask(host, S3C2410_SDIIMSK_TXFIFOHALF); } else { enable_imask(host, S3C2410_SDIIMSK_RXFIFOHALF | S3C2410_SDIIMSK_RXFIFOLAST); } return 0; }