data = host->data;
        host->data = NULL;
+       host->data_cmd = NULL;
 
        if ((host->flags & (SDHCI_REQ_USE_DMA | SDHCI_USE_ADMA)) ==
            (SDHCI_REQ_USE_DMA | SDHCI_USE_ADMA))
 
        host->cmd = cmd;
        host->busy_handle = 0;
+       if (cmd->data || cmd->flags & MMC_RSP_BUSY) {
+               WARN_ON(host->data_cmd);
+               host->data_cmd = cmd;
+       }
 
        sdhci_prepare_data(host, cmd);
 
        host->mrq = NULL;
        host->cmd = NULL;
        host->data = NULL;
+       host->data_cmd = NULL;
 
        sdhci_led_deactivate(host);
 
        }
 
        if (!host->data) {
+               struct mmc_command *data_cmd = host->data_cmd;
+
+               if (data_cmd)
+                       host->data_cmd = NULL;
+
                /*
                 * The "data complete" interrupt is also used to
                 * indicate that a busy state has ended. See comment
                 * above in sdhci_cmd_irq().
                 */
-               if (host->cmd && (host->cmd->flags & MMC_RSP_BUSY)) {
+               if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) {
                        if (intmask & SDHCI_INT_DATA_TIMEOUT) {
-                               host->cmd->error = -ETIMEDOUT;
+                               data_cmd->error = -ETIMEDOUT;
                                tasklet_schedule(&host->finish_tasklet);
                                return;
                        }
                }
 
                if (intmask & SDHCI_INT_DATA_END) {
-                       if (host->cmd) {
+                       if (host->cmd == host->data_cmd) {
                                /*
                                 * Data managed to finish before the
                                 * command completed. Make sure we do
 
 
        struct mmc_request *mrq;        /* Current request */
        struct mmc_command *cmd;        /* Current command */
+       struct mmc_command *data_cmd;   /* Current data command */
        struct mmc_data *data;  /* Current data request */
        unsigned int data_early:1;      /* Data finished before cmd */
        unsigned int busy_handle:1;     /* Handling the order of Busy-end */