iflags |= ATMCI_CMDRDY;
        cmd = mrq->cmd;
        cmdflags = atmci_prepare_command(slot->mmc, cmd);
-       atmci_send_command(host, cmd, cmdflags);
+
+       /*
+        * DMA transfer should be started before sending the command to avoid
+        * unexpected errors especially for read operations in SDIO mode.
+        * Unfortunately, in PDC mode, command has to be sent before starting
+        * the transfer.
+        */
+       if (host->submit_data != &atmci_submit_data_dma)
+               atmci_send_command(host, cmd, cmdflags);
 
        if (data)
                host->submit_data(host, data);
 
+       if (host->submit_data == &atmci_submit_data_dma)
+               atmci_send_command(host, cmd, cmdflags);
+
        if (mrq->stop) {
                host->stop_cmdr = atmci_prepare_command(slot->mmc, mrq->stop);
                host->stop_cmdr |= ATMCI_CMDR_STOP_XFER;