mmc: core: Add debug enhancement logs

Add debug enhancement logs to notify request timeout, when cqe is
turned off and when deferred scaling happens.

Change-Id: Ib499f41632427cba3ab0b67e04d605b6cf4419f5
Signed-off-by: Shaik Sajida Bhanu <sbhanu@codeaurora.org>
This commit is contained in:
Shaik Sajida Bhanu 2020-11-16 14:44:12 +05:30
commit 832d9eaf5b
6 changed files with 59 additions and 3 deletions

View file

@ -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",

View file

@ -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:

View file

@ -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;

View file

@ -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)

View file

@ -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),

View file

@ -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);