diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 1c0974a51f65..9351b5f18f24 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -406,6 +406,8 @@ int mmc_clk_update_freq(struct mmc_host *host, else pr_err("%s: %s: failed (%d) at freq=%lu\n", mmc_hostname(host), __func__, err, freq); + mmc_log_string(host, "clock scale state %d freq %lu done with err %d\n", + state, freq, err); /* * CQE would be enabled as part of CQE issueing path * So no need to unhalt it explicitly @@ -533,7 +535,9 @@ void mmc_deferred_scaling(struct mmc_host *host) pr_debug("%s: doing deferred frequency change (%lu) (%s)\n", mmc_hostname(host), target_freq, current->comm); - + mmc_log_string(host, + "doing deferred frequency change (%lu) (%s)\n", + target_freq, current->comm); err = mmc_clk_update_freq(host, target_freq, clk_scaling.state); if (err && err != -EAGAIN) pr_err("%s: failed on deferred scale clocks (%d)\n", diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c index d7f1b8ffa7e3..21ca175f8398 100644 --- a/drivers/mmc/core/queue.c +++ b/drivers/mmc/core/queue.c @@ -103,6 +103,9 @@ static enum blk_eh_timer_return mmc_cqe_timed_out(struct request *req) enum mmc_issue_type issue_type = mmc_issue_type(mq, req); bool recovery_needed = false; + mmc_log_string(host, + "Request timed out! Active reqs: %d Req: %p Tag: %d\n", + mmc_cqe_qcnt(mq), req, req->tag); switch (issue_type) { case MMC_ISSUE_ASYNC: case MMC_ISSUE_DCMD: @@ -111,6 +114,9 @@ static enum blk_eh_timer_return mmc_cqe_timed_out(struct request *req) mmc_cqe_recovery_notifier(mrq); return BLK_EH_RESET_TIMER; } + mmc_log_string(host, + "Timeout even before req reaching LDD,completing the req. Active reqs: %d Req: %p Tag: %d\n", + mmc_cqe_qcnt(mq), req, req->tag); /* The request has gone already */ return BLK_EH_DONE; default: diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 20eed28ea60d..aa1b82961e69 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -953,6 +953,7 @@ static int mmc_sdio_suspend(struct mmc_host *host) cancel_delayed_work_sync(&host->sdio_irq_work); mmc_claim_host(host); + mmc_log_string(host, "Enter\n"); if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) sdio_disable_wide(host->card); @@ -964,6 +965,7 @@ static int mmc_sdio_suspend(struct mmc_host *host) mmc_retune_needed(host); } + mmc_log_string(host, "Exit\n"); mmc_release_host(host); return 0; @@ -975,6 +977,7 @@ static int mmc_sdio_resume(struct mmc_host *host) /* Basic card reinitialization. */ mmc_claim_host(host); + mmc_log_string(host, "Enter\n"); /* * Restore power and reinitialize the card when needed. Note that a @@ -1014,6 +1017,7 @@ static int mmc_sdio_resume(struct mmc_host *host) } out: + mmc_log_string(host, "Exit err: %d\n", err); mmc_release_host(host); host->pm_flags &= ~MMC_PM_KEEP_POWER; diff --git a/drivers/mmc/host/cqhci.c b/drivers/mmc/host/cqhci.c index 67c5d60b1a8f..484d47465517 100644 --- a/drivers/mmc/host/cqhci.c +++ b/drivers/mmc/host/cqhci.c @@ -403,8 +403,10 @@ static void cqhci_off(struct mmc_host *mmc) reg & CQHCI_HALT, 0, CQHCI_OFF_TIMEOUT); if (err < 0) pr_err("%s: cqhci: CQE stuck on\n", mmc_hostname(mmc)); - else + else { pr_debug("%s: cqhci: CQE off\n", mmc_hostname(mmc)); + mmc_log_string(mmc, "cqhci: CQE off\n"); + } mmc->cqe_on = false; } @@ -637,6 +639,7 @@ static int cqhci_request(struct mmc_host *mmc, struct mmc_request *mrq) if (!mmc->cqe_on) { cqhci_writel(cq_host, 0, CQHCI_CTL); mmc->cqe_on = true; + mmc_log_string(mmc, "cqhci: CQE on\n"); pr_debug("%s: cqhci: CQE on\n", mmc_hostname(mmc)); if (cqhci_readl(cq_host, CQHCI_CTL) && CQHCI_HALT) { pr_err("%s: cqhci: CQE failed to exit halt state\n", @@ -756,6 +759,8 @@ static void cqhci_error_irq(struct mmc_host *mmc, u32 status, int cmd_error, pr_debug("%s: cqhci: error IRQ status: 0x%08x cmd error %d data error %d TERRI: 0x%08x\n", mmc_hostname(mmc), status, cmd_error, data_error, terri); + mmc_log_string(mmc, "cqhci: status:0x%08x TERRI:0x%08x\n", + status, terri); /* Forget about errors when recovery has already been triggered */ if (cq_host->recovery_halt) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 0823d3f1e643..5282295122a8 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1908,6 +1908,9 @@ static void sdhci_msm_check_power_status(struct sdhci_host *host, u32 req_type) dev_warn(&msm_host->pdev->dev, "%s: pwr_irq for req: (%d) timed out\n", mmc_hostname(host->mmc), req_type); + mmc_log_string(host->mmc, + "request(%d) timed out waiting for pwr_irq\n", + req_type); } if (mmc->card && mmc->ops->get_cd && !mmc->ops->get_cd(mmc) && @@ -1932,6 +1935,11 @@ static void sdhci_msm_dump_pwr_ctrl_regs(struct sdhci_host *host) msm_host_readl(msm_host, host, msm_offset->core_pwrctl_status), msm_host_readl(msm_host, host, msm_offset->core_pwrctl_mask), msm_host_readl(msm_host, host, msm_offset->core_pwrctl_ctl)); + mmc_log_string(host->mmc, + "Sts: 0x%08x | Mask: 0x%08x | Ctrl: 0x%08x\n", + msm_host_readl(msm_host, host, msm_offset->core_pwrctl_status), + msm_host_readl(msm_host, host, msm_offset->core_pwrctl_mask), + msm_host_readl(msm_host, host, msm_offset->core_pwrctl_ctl)); } static int sdhci_msm_clear_pwrctl_status(struct sdhci_host *host, u32 value) @@ -3246,6 +3254,10 @@ static void sdhci_msm_dump_vendor_regs(struct sdhci_host *host) if (msm_host->cq_host) sdhci_msm_cqe_dump_debug_ram(host); + mmc_log_string(host->mmc, "Data cnt: 0x%08x | Fifo cnt: 0x%08x\n", + readl_relaxed(host->ioaddr + msm_offset->core_mci_data_cnt), + readl_relaxed(host->ioaddr + msm_offset->core_mci_fifo_cnt)); + SDHCI_MSM_DUMP( "Data cnt: 0x%08x | Fifo cnt: 0x%08x | Int sts: 0x%08x\n", readl_relaxed(host->ioaddr + msm_offset->core_mci_data_cnt), diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index ee0470c355ac..520f7b5ee6dc 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -239,7 +239,8 @@ void sdhci_reset(struct sdhci_host *host, u8 mask) if (timedout) { pr_err("%s: Reset 0x%x never completed.\n", mmc_hostname(host->mmc), (int)mask); - mmc_log_string(host->mmc, "%s: Reset 0x%x never completed.\n", + mmc_log_string(host->mmc, + "Reset 0x%x never completed.\n", (int)mask); sdhci_dumpregs(host); return; @@ -1162,6 +1163,12 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) } else { sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT); } + mmc_log_string(host->mmc, + "HOST_CONTROL=0x%08x HOST_CONTROL2=0x%08x BLOCK_COUNT=0x%08x\n", + sdhci_readb(host, SDHCI_HOST_CONTROL), + sdhci_readw(host, SDHCI_HOST_CONTROL2), + sdhci_readw(host, SDHCI_BLOCK_COUNT)); + } static inline bool sdhci_auto_cmd12(struct sdhci_host *host, @@ -1259,6 +1266,10 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host, mode |= SDHCI_TRNS_DMA; sdhci_writew(host, mode, SDHCI_TRANSFER_MODE); + mmc_log_string(host->mmc, + "ARGUMENT2=0x%08x TRANSFER_MODE=0x%08x\n", + sdhci_readw(host, SDHCI_ARGUMENT2), + sdhci_readw(host, SDHCI_TRANSFER_MODE)); } static bool sdhci_needs_reset(struct sdhci_host *host, struct mmc_request *mrq) @@ -1326,6 +1337,8 @@ static void __sdhci_finish_data(struct sdhci_host *host, bool sw_data_timeout) host->data = NULL; host->data_cmd = NULL; + mmc_log_string(host->mmc, "PRESENT_STATE=0x%08x\n", + sdhci_readl(host, SDHCI_PRESENT_STATE)); /* * The controller needs a reset of internal state machines upon error * conditions. @@ -1472,6 +1485,11 @@ static bool sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) sdhci_mod_timer(host, cmd->mrq, timeout); sdhci_writew(host, SDHCI_MAKE_CMD(cmd->opcode, flags), SDHCI_COMMAND); + mmc_log_string(host->mmc, + "updated ARGUMENT=0x%08x ARGUMENT_MODE=0x%08x COMMAND=0x%08x\n", + sdhci_readl(host, SDHCI_ARGUMENT), + sdhci_readw(host, SDHCI_TRANSFER_MODE), + sdhci_readw(host, SDHCI_COMMAND)); return true; } @@ -1559,8 +1577,14 @@ static void sdhci_finish_command(struct sdhci_host *host) if (cmd->flags & MMC_RSP_PRESENT) { if (cmd->flags & MMC_RSP_136) { sdhci_read_rsp_136(host, cmd); + mmc_log_string(host->mmc, + "resp 0: 0x%08x resp 1: 0x%08x resp 2: 0x%08x resp 3: 0x%08x\n", + cmd->resp[0], cmd->resp[1], + cmd->resp[2], cmd->resp[3]); } else { cmd->resp[0] = sdhci_readl(host, SDHCI_RESPONSE); + mmc_log_string(host->mmc, "resp 0: 0x%08x\n", + cmd->resp[0]); } } @@ -3273,6 +3297,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) goto cont; } + mmc_log_string(host->mmc, "intmask: 0x%x\n", intmask); /* Clear selected interrupts. */ mask = intmask & (SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK | SDHCI_INT_BUS_POWER);