lkml.org 
[lkml]   [2019]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH v3 4/7] mmc: sdhci: Add quirk for disabling DTO during erase command
    From
    Date
    On 10/12/19 11:51 am, Faiz Abbas wrote:
    > Some controllers might prematurely issue a data timeout during an erase
    > command. Add a quirk to disable the interrupt when an erase command is
    > issued.
    >
    > Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
    > ---
    > drivers/mmc/host/sdhci.c | 5 +++++
    > drivers/mmc/host/sdhci.h | 2 ++
    > 2 files changed, 7 insertions(+)
    >
    > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
    > index 6f3d4991bee1..b8934c50b9c4 100644
    > --- a/drivers/mmc/host/sdhci.c
    > +++ b/drivers/mmc/host/sdhci.c
    > @@ -1532,6 +1532,11 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
    > /* Initially, a command has no error */
    > cmd->error = 0;
    >
    > + if (cmd->opcode == MMC_ERASE &&
    > + (host->quirks2 & SDHCI_QUIRK2_DISABLE_DTO_FOR_ERASE)) {
    > + sdhci_set_data_timeout_irq(host, false);
    > + }

    If you factor out __sdhci_set_timeout() like below then
    you could implement ->set_timeout() to do this.

    diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
    index ad6d2f93aa0b..389e3239eadc 100644
    --- a/drivers/mmc/host/sdhci.c
    +++ b/drivers/mmc/host/sdhci.c
    @@ -1002,27 +1002,28 @@ static void sdhci_set_data_timeout_irq(struct sdhci_host *host, bool enable)
    sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);
    }

    -static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd)
    +void __sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd)
    {
    - u8 count;
    -
    - if (host->ops->set_timeout) {
    - host->ops->set_timeout(host, cmd);
    - } else {
    - bool too_big = false;
    -
    - count = sdhci_calc_timeout(host, cmd, &too_big);
    + bool too_big = false;
    + u8 count = sdhci_calc_timeout(host, cmd, &too_big);
    +
    + if (too_big && host->quirks2 & SDHCI_QUIRK2_DISABLE_HW_TIMEOUT) {
    + sdhci_calc_sw_timeout(host, cmd);
    + sdhci_set_data_timeout_irq(host, false);
    + } else if (!(host->ier & SDHCI_INT_DATA_TIMEOUT)) {
    + sdhci_set_data_timeout_irq(host, true);
    + }

    - if (too_big &&
    - host->quirks2 & SDHCI_QUIRK2_DISABLE_HW_TIMEOUT) {
    - sdhci_calc_sw_timeout(host, cmd);
    - sdhci_set_data_timeout_irq(host, false);
    - } else if (!(host->ier & SDHCI_INT_DATA_TIMEOUT)) {
    - sdhci_set_data_timeout_irq(host, true);
    - }
    + sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL);
    +}
    +EXPORT_SYMBOL_GPL(__sdhci_set_timeout);

    - sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL);
    - }
    +static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd)
    +{
    + if (host->ops->set_timeout)
    + host->ops->set_timeout(host, cmd);
    + else
    + __sdhci_set_timeout(host, cmd);
    }

    static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)


    > +
    > if ((host->quirks2 & SDHCI_QUIRK2_STOP_WITH_TC) &&
    > cmd->opcode == MMC_STOP_TRANSMISSION)
    > cmd->flags |= MMC_RSP_BUSY;
    > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
    > index b28706a1bc6f..beda9afba3a6 100644
    > --- a/drivers/mmc/host/sdhci.h
    > +++ b/drivers/mmc/host/sdhci.h
    > @@ -482,6 +482,8 @@ struct sdhci_host {
    > * block count.
    > */
    > #define SDHCI_QUIRK2_USE_32BIT_BLK_CNT (1<<18)
    > +/* Controller needs to disable DTO for erase command */
    > +#define SDHCI_QUIRK2_DISABLE_DTO_FOR_ERASE (1<<19)
    >
    > int irq; /* Device IRQ */
    > void __iomem *ioaddr; /* Mapped address */
    >

    \
     
     \ /
      Last update: 2019-12-13 10:42    [W:3.651 / U:0.416 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site