diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index bbdd7594ef01..8e78faf6bb35 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -1293,14 +1293,29 @@ static void dw_mci_start_request(struct dw_mci *host) __dw_mci_start_request(host, cmd); } -/* must be called with host->lock held */ -static void dw_mci_queue_request(struct dw_mci *host, struct mmc_request *mrq) +static void dw_mci_request(struct mmc_host *mmc, struct mmc_request *mrq) { - dev_vdbg(&host->mmc->class_dev, "queue request: state=%d\n", + struct dw_mci *host = mmc_priv(mmc); + + WARN_ON(host->mrq); + + /* + * The check for card presence and queueing of the request must be + * atomic, otherwise the card could be removed in between and the + * request wouldn't fail until another card was inserted. + */ + if (!dw_mci_get_cd(mmc)) { + mrq->cmd->error = -ENOMEDIUM; + mmc_request_done(mmc, mrq); + return; + } + + spin_lock_bh(&host->lock); + + dev_vdbg(&host->mmc->class_dev, "request: state=%d\n", host->state); host->mrq = mrq; - if (host->state == STATE_WAITING_CMD11_DONE) { dev_warn(&host->mmc->class_dev, "Voltage change didn't complete\n"); @@ -1316,29 +1331,6 @@ static void dw_mci_queue_request(struct dw_mci *host, struct mmc_request *mrq) host->state = STATE_SENDING_CMD; dw_mci_start_request(host); } -} - -static void dw_mci_request(struct mmc_host *mmc, struct mmc_request *mrq) -{ - struct dw_mci *host = mmc_priv(mmc); - - WARN_ON(host->mrq); - - /* - * The check for card presence and queueing of the request must be - * atomic, otherwise the card could be removed in between and the - * request wouldn't fail until another card was inserted. - */ - - if (!dw_mci_get_cd(mmc)) { - mrq->cmd->error = -ENOMEDIUM; - mmc_request_done(mmc, mrq); - return; - } - - spin_lock_bh(&host->lock); - - dw_mci_queue_request(host, mrq); spin_unlock_bh(&host->lock); }