All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/1] mmc: Reduce tuning log output
@ 2022-11-11  8:42 Wenchao Chen
  2022-11-11  8:42 ` [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning Wenchao Chen
  0 siblings, 1 reply; 9+ messages in thread
From: Wenchao Chen @ 2022-11-11  8:42 UTC (permalink / raw)
  To: ulf.hansson, adrian.hunter; +Cc: linux-mmc, linux-kernel, megoo.tang, lzx.stg

From: Wenchao Chen <wenchao.chen@unisoc.com>

During the HS200 Tuning process, a lot of "mmc0: Got data interrupt 0x00200000
even though no data operation was in progress." logs were printed.
From the cmd in the log, it is CMD21.
[    4.547365][    C0] mmc0: Got data interrupt 0x00200000 even though no data operation was in progress.
[    4.564088][    C0] mmc0: sdhci: ============ SDHCI REGISTER DUMP ===========
[    4.571213][    C0] mmc0: sdhci: Sys addr:  0x00000001 | Version:  0x00000004
[    4.578339][    C0] mmc0: sdhci: Blk size:  0x00000080 | Blk cnt:  0x00000000
[    4.585466][    C0] mmc0: sdhci: Argument:  0x00000000 | Trn mode: 0x00000013
[    4.592595][    C0] mmc0: sdhci: Present:   0x01f000f0 | Host ctl: 0x00000030
[    4.599723][    C0] mmc0: sdhci: Power:     0x00000000 | Blk gap:  0x00000000
[    4.606849][    C0] mmc0: sdhci: Wake-up:   0x00000000 | Clock:    0x00000007
[    4.613978][    C0] mmc0: sdhci: Timeout:   0x0000000c | Int stat: 0x00000000
[    4.621106][    C0] mmc0: sdhci: Int enab:  0x037f000b | Sig enab: 0x037f000b
[    4.628233][    C0] mmc0: sdhci: ACmd stat: 0x00000000 | Slot int: 0x00000000
[    4.635360][    C0] mmc0: sdhci: Caps:      0x1e6d0080 | Caps_1:   0x08000007
[    4.642489][    C0] mmc0: sdhci: Cmd:       0x0000153a | Max curr: 0x000003fc
[    4.649616][    C0] mmc0: sdhci: Resp[0]:   0x00000900 | Resp[1]:  0x00000900
[    4.656743][    C0] mmc0: sdhci: Resp[2]:   0x00000000 | Resp[3]:  0x00000000
[    4.663881][    C0] mmc0: sdhci: Host ctl2: 0x00003005
[    4.669002][    C0] mmc0: sdhci: ADMA Err:  0x00000000 | ADMA Ptr: 0x00000000f0200200
[    4.811901][    C0] mmc0: sdhci: ============================================

.......

[    4.819456][    C0] mmc0: Got data interrupt 0x00200000 even though no data operation was in progress.
[    4.835111][    C0] mmc0: sdhci: ============ SDHCI REGISTER DUMP ===========
[    4.835116][    C0] mmc0: sdhci: Sys addr:  0x00000001 | Version:  0x00000004
[    4.870574][    C0] mmc0: sdhci: Blk size:  0x00000080 | Blk cnt:  0x00000000
[    4.870580][    C0] mmc0: sdhci: Argument:  0x00000000 | Trn mode: 0x00000013
[    4.920122][    C0] mmc0: sdhci: Present:   0x01f000f0 | Host ctl: 0x00000030
[    4.927249][    C0] mmc0: sdhci: Power:     0x00000000 | Blk gap:  0x00000000
[    4.934377][    C0] mmc0: sdhci: Wake-up:   0x00000000 | Clock:    0x00000007
[    4.941506][    C0] mmc0: sdhci: Timeout:   0x0000000c | Int stat: 0x00000000
[    4.948631][    C0] mmc0: sdhci: Int enab:  0x037f000b | Sig enab: 0x037f000b
[    4.955759][    C0] mmc0: sdhci: ACmd stat: 0x00000000 | Slot int: 0x00000000
[    4.962887][    C0] mmc0: sdhci: Caps:      0x1e6d0080 | Caps_1:   0x08000007
[    4.970014][    C0] mmc0: sdhci: Cmd:       0x0000153a | Max curr: 0x000003fc
[    4.977143][    C0] mmc0: sdhci: Resp[0]:   0x00000900 | Resp[1]:  0x00000900
[    4.984270][    C0] mmc0: sdhci: Resp[2]:   0x000ls00900 | Resp[3]:  0x00000000
[    4.991398][    C0] mmc0: sdhci: Host ctl2: 0x00003005
[    4.996526][    C0] mmc0: sdhci: ADMA Err:  0x00000000 | ADMA Ptr: 0x00000000f0200200
[    4.811901][    C0] mmc0: sdhci: ============================================

Wenchao Chen (1):
  mmc: sdhci: Fixed too many logs being printed during tuning

 drivers/mmc/host/sdhci.c | 4 ++++
 1 file changed, 4 insertions(+)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning
  2022-11-11  8:42 [PATCH 0/1] mmc: Reduce tuning log output Wenchao Chen
@ 2022-11-11  8:42 ` Wenchao Chen
  2022-11-16 15:20   ` Ulf Hansson
  2022-11-16 16:00   ` Adrian Hunter
  0 siblings, 2 replies; 9+ messages in thread
From: Wenchao Chen @ 2022-11-11  8:42 UTC (permalink / raw)
  To: ulf.hansson, adrian.hunter; +Cc: linux-mmc, linux-kernel, megoo.tang, lzx.stg

From: Wenchao Chen <wenchao.chen@unisoc.com>

During the HS200 tuning process, too many tuning errors are printed in
the log.

Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
---
 drivers/mmc/host/sdhci.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index fef03de85b99..a503b54305eb 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -3401,6 +3401,10 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
 		if (host->pending_reset)
 			return;
 
+		command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
+		if (command == MMC_SEND_TUNING_BLOCK || command == MMC_SEND_TUNING_BLOCK_HS200)
+			return;
+
 		pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
 		       mmc_hostname(host->mmc), (unsigned)intmask);
 		sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning
  2022-11-11  8:42 ` [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning Wenchao Chen
@ 2022-11-16 15:20   ` Ulf Hansson
  2022-11-18  9:22     ` Wenchao Chen
  2022-11-16 16:00   ` Adrian Hunter
  1 sibling, 1 reply; 9+ messages in thread
From: Ulf Hansson @ 2022-11-16 15:20 UTC (permalink / raw)
  To: Wenchao Chen; +Cc: adrian.hunter, linux-mmc, linux-kernel, megoo.tang, lzx.stg

On Fri, 11 Nov 2022 at 09:42, Wenchao Chen <wenchao.chen666@gmail.com> wrote:
>
> From: Wenchao Chen <wenchao.chen@unisoc.com>
>
> During the HS200 tuning process, too many tuning errors are printed in
> the log.
>
> Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
> ---
>  drivers/mmc/host/sdhci.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index fef03de85b99..a503b54305eb 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -3401,6 +3401,10 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
>                 if (host->pending_reset)
>                         return;
>
> +               command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
> +               if (command == MMC_SEND_TUNING_BLOCK || command == MMC_SEND_TUNING_BLOCK_HS200)
> +                       return;
> +

Please use mmc_op_tuning() instead of open-coding this. I also need an
ack from Adrian to apply this.

>                 pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
>                        mmc_hostname(host->mmc), (unsigned)intmask);
>                 sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
> --
> 2.17.1
>

Kind regards
Uffe

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning
  2022-11-11  8:42 ` [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning Wenchao Chen
  2022-11-16 15:20   ` Ulf Hansson
@ 2022-11-16 16:00   ` Adrian Hunter
  2022-11-18  9:25     ` Wenchao Chen
  1 sibling, 1 reply; 9+ messages in thread
From: Adrian Hunter @ 2022-11-16 16:00 UTC (permalink / raw)
  To: Wenchao Chen, ulf.hansson; +Cc: linux-mmc, linux-kernel, megoo.tang, lzx.stg

On 11/11/22 10:42, Wenchao Chen wrote:
> From: Wenchao Chen <wenchao.chen@unisoc.com>
> 
> During the HS200 tuning process, too many tuning errors are printed in
> the log.
> 
> Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
> ---
>  drivers/mmc/host/sdhci.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index fef03de85b99..a503b54305eb 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -3401,6 +3401,10 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
>  		if (host->pending_reset)
>  			return;
>  
> +		command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
> +		if (command == MMC_SEND_TUNING_BLOCK || command == MMC_SEND_TUNING_BLOCK_HS200)
> +			return;

Normally we wouldn't get here even if a request got an error because
then we either reset the data circuit which should stop further
interrupts, or set host->pending_reset.

Can you elaborate on what is going wrong?

> +
>  		pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
>  		       mmc_hostname(host->mmc), (unsigned)intmask);
>  		sdhci_err_stats_inc(host, UNEXPECTED_IRQ);


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning
  2022-11-16 15:20   ` Ulf Hansson
@ 2022-11-18  9:22     ` Wenchao Chen
  0 siblings, 0 replies; 9+ messages in thread
From: Wenchao Chen @ 2022-11-18  9:22 UTC (permalink / raw)
  To: Ulf Hansson; +Cc: adrian.hunter, linux-mmc, linux-kernel, megoo.tang, lzx.stg

On Wed, Nov 16, 2022 at 11:21 PM Ulf Hansson <ulf.hansson@linaro.org> wrote:
>
> On Fri, 11 Nov 2022 at 09:42, Wenchao Chen <wenchao.chen666@gmail.com> wrote:
> >
> > From: Wenchao Chen <wenchao.chen@unisoc.com>
> >
> > During the HS200 tuning process, too many tuning errors are printed in
> > the log.
> >
> > Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
> > ---
> >  drivers/mmc/host/sdhci.c | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> > index fef03de85b99..a503b54305eb 100644
> > --- a/drivers/mmc/host/sdhci.c
> > +++ b/drivers/mmc/host/sdhci.c
> > @@ -3401,6 +3401,10 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
> >                 if (host->pending_reset)
> >                         return;
> >
> > +               command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
> > +               if (command == MMC_SEND_TUNING_BLOCK || command == MMC_SEND_TUNING_BLOCK_HS200)
> > +                       return;
> > +
>
> Please use mmc_op_tuning() instead of open-coding this. I also need an
> ack from Adrian to apply this.

Thank you for your review, I will update the next version.

>
> >                 pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
> >                        mmc_hostname(host->mmc), (unsigned)intmask);
> >                 sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
> > --
> > 2.17.1
> >
>
> Kind regards
> Uffe

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning
  2022-11-16 16:00   ` Adrian Hunter
@ 2022-11-18  9:25     ` Wenchao Chen
  2022-11-18 15:57       ` Adrian Hunter
  0 siblings, 1 reply; 9+ messages in thread
From: Wenchao Chen @ 2022-11-18  9:25 UTC (permalink / raw)
  To: Adrian Hunter; +Cc: ulf.hansson, linux-mmc, linux-kernel, megoo.tang, lzx.stg

On Thu, Nov 17, 2022 at 12:00 AM Adrian Hunter <adrian.hunter@intel.com> wrote:
>
> On 11/11/22 10:42, Wenchao Chen wrote:
> > From: Wenchao Chen <wenchao.chen@unisoc.com>
> >
> > During the HS200 tuning process, too many tuning errors are printed in
> > the log.
> >
> > Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
> > ---
> >  drivers/mmc/host/sdhci.c | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> > index fef03de85b99..a503b54305eb 100644
> > --- a/drivers/mmc/host/sdhci.c
> > +++ b/drivers/mmc/host/sdhci.c
> > @@ -3401,6 +3401,10 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
> >               if (host->pending_reset)
> >                       return;
> >
> > +             command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
> > +             if (command == MMC_SEND_TUNING_BLOCK || command == MMC_SEND_TUNING_BLOCK_HS200)
> > +                     return;
>
> Normally we wouldn't get here even if a request got an error because
> then we either reset the data circuit which should stop further
> interrupts, or set host->pending_reset.
>
> Can you elaborate on what is going wrong?
>
Hi  adrian
1. In the process of tuning, not all tuning values are good, some
tuning values may cause errors, and these errors print too many logs.
    Of course, we reset the cmdline or dataline on error.
2. use host->pending_reset = true
static void __sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
{
...
if (sdhci_needs_reset(host, mrq))
host->pending_reset = true;
...
}

But intmask = 0x00200000
static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
{
...
if (!host->data) {
struct mmc_command *data_cmd = host->data_cmd;

if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) {
if (intmask & SDHCI_INT_DATA_TIMEOUT) { //#define
SDHCI_INT_DATA_TIMEOUT 0x00100000
host->data_cmd = NULL;
data_cmd->error = -ETIMEDOUT;
sdhci_err_stats_inc(host, CMD_TIMEOUT);
__sdhci_finish_mrq(host, data_cmd->mrq);//<=
return;
}
if (intmask & SDHCI_INT_DATA_END) {    //#define  SDHCI_INT_DATA_END 0x00000002

host->data_cmd = NULL;
/*
* Some cards handle busy-end interrupt
* before the command completed, so make
* sure we do things in the proper order.
*/
if (host->cmd == data_cmd)
return;

__sdhci_finish_mrq(host, data_cmd->mrq);//<=
return;
}
}
...
if (host->pending_reset)
return;

pr_err("%s: Got data interrupt 0x%08x even though no data operation
was in progress.\n",
       mmc_hostname(host->mmc), (unsigned)intmask);
sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
sdhci_dumpregs(host);

return;
}
...
}

> > +
> >               pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
> >                      mmc_hostname(host->mmc), (unsigned)intmask);
> >               sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning
  2022-11-18  9:25     ` Wenchao Chen
@ 2022-11-18 15:57       ` Adrian Hunter
  2022-11-21  3:11         ` Wenchao Chen
  0 siblings, 1 reply; 9+ messages in thread
From: Adrian Hunter @ 2022-11-18 15:57 UTC (permalink / raw)
  To: Wenchao Chen; +Cc: ulf.hansson, linux-mmc, linux-kernel, megoo.tang, lzx.stg

On 18/11/22 11:25, Wenchao Chen wrote:
> On Thu, Nov 17, 2022 at 12:00 AM Adrian Hunter <adrian.hunter@intel.com> wrote:
>>
>> On 11/11/22 10:42, Wenchao Chen wrote:
>>> From: Wenchao Chen <wenchao.chen@unisoc.com>
>>>
>>> During the HS200 tuning process, too many tuning errors are printed in
>>> the log.
>>>
>>> Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
>>> ---
>>>  drivers/mmc/host/sdhci.c | 4 ++++
>>>  1 file changed, 4 insertions(+)
>>>
>>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>>> index fef03de85b99..a503b54305eb 100644
>>> --- a/drivers/mmc/host/sdhci.c
>>> +++ b/drivers/mmc/host/sdhci.c
>>> @@ -3401,6 +3401,10 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
>>>               if (host->pending_reset)
>>>                       return;
>>>
>>> +             command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
>>> +             if (command == MMC_SEND_TUNING_BLOCK || command == MMC_SEND_TUNING_BLOCK_HS200)
>>> +                     return;
>>
>> Normally we wouldn't get here even if a request got an error because
>> then we either reset the data circuit which should stop further
>> interrupts, or set host->pending_reset.
>>
>> Can you elaborate on what is going wrong?
>>
> Hi  adrian
> 1. In the process of tuning, not all tuning values are good, some
> tuning values may cause errors, and these errors print too many logs.
>     Of course, we reset the cmdline or dataline on error.
> 2. use host->pending_reset = true
> static void __sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
> {
> ...
> if (sdhci_needs_reset(host, mrq))
> host->pending_reset = true;
> ...
> }
> 
> But intmask = 0x00200000
> static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
> {
> ...
> if (!host->data) {
> struct mmc_command *data_cmd = host->data_cmd;
> 
> if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) {
> if (intmask & SDHCI_INT_DATA_TIMEOUT) { //#define
> SDHCI_INT_DATA_TIMEOUT 0x00100000
> host->data_cmd = NULL;
> data_cmd->error = -ETIMEDOUT;
> sdhci_err_stats_inc(host, CMD_TIMEOUT);
> __sdhci_finish_mrq(host, data_cmd->mrq);//<=
> return;
> }
> if (intmask & SDHCI_INT_DATA_END) {    //#define  SDHCI_INT_DATA_END 0x00000002
> 
> host->data_cmd = NULL;
> /*
> * Some cards handle busy-end interrupt
> * before the command completed, so make
> * sure we do things in the proper order.
> */
> if (host->cmd == data_cmd)
> return;
> 
> __sdhci_finish_mrq(host, data_cmd->mrq);//<=
> return;
> }
> }
> ...
> if (host->pending_reset)
> return;
> 
> pr_err("%s: Got data interrupt 0x%08x even though no data operation
> was in progress.\n",
>        mmc_hostname(host->mmc), (unsigned)intmask);
> sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
> sdhci_dumpregs(host);
> 
> return;
> }
> ...
> }

Not really following that I'm sorry.

Are you saying you get a data interrupt after he data circuit is reset?

> 
>>> +
>>>               pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
>>>                      mmc_hostname(host->mmc), (unsigned)intmask);
>>>               sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
>>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning
  2022-11-18 15:57       ` Adrian Hunter
@ 2022-11-21  3:11         ` Wenchao Chen
  2022-11-30  6:18           ` Adrian Hunter
  0 siblings, 1 reply; 9+ messages in thread
From: Wenchao Chen @ 2022-11-21  3:11 UTC (permalink / raw)
  To: Adrian Hunter; +Cc: ulf.hansson, linux-mmc, linux-kernel, megoo.tang, lzx.stg

On Fri, Nov 18, 2022 at 11:57 PM Adrian Hunter <adrian.hunter@intel.com> wrote:
>
> On 18/11/22 11:25, Wenchao Chen wrote:
> > On Thu, Nov 17, 2022 at 12:00 AM Adrian Hunter <adrian.hunter@intel.com> wrote:
> >>
> >> On 11/11/22 10:42, Wenchao Chen wrote:
> >>> From: Wenchao Chen <wenchao.chen@unisoc.com>
> >>>
> >>> During the HS200 tuning process, too many tuning errors are printed in
> >>> the log.
> >>>
> >>> Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
> >>> ---
> >>>  drivers/mmc/host/sdhci.c | 4 ++++
> >>>  1 file changed, 4 insertions(+)
> >>>
> >>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> >>> index fef03de85b99..a503b54305eb 100644
> >>> --- a/drivers/mmc/host/sdhci.c
> >>> +++ b/drivers/mmc/host/sdhci.c
> >>> @@ -3401,6 +3401,10 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
> >>>               if (host->pending_reset)
> >>>                       return;
> >>>
> >>> +             command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
> >>> +             if (command == MMC_SEND_TUNING_BLOCK || command == MMC_SEND_TUNING_BLOCK_HS200)
> >>> +                     return;
> >>
> >> Normally we wouldn't get here even if a request got an error because
> >> then we either reset the data circuit which should stop further
> >> interrupts, or set host->pending_reset.
> >>
> >> Can you elaborate on what is going wrong?
> >>
> > Hi  adrian
> > 1. In the process of tuning, not all tuning values are good, some
> > tuning values may cause errors, and these errors print too many logs.
> >     Of course, we reset the cmdline or dataline on error.
> > 2. use host->pending_reset = true
> > static void __sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
> > {
> > ...
> > if (sdhci_needs_reset(host, mrq))
> > host->pending_reset = true;
> > ...
> > }
> >
> > But intmask = 0x00200000
> > static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
> > {
> > ...
> > if (!host->data) {
> > struct mmc_command *data_cmd = host->data_cmd;
> >
> > if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) {
> > if (intmask & SDHCI_INT_DATA_TIMEOUT) { //#define
> > SDHCI_INT_DATA_TIMEOUT 0x00100000
> > host->data_cmd = NULL;
> > data_cmd->error = -ETIMEDOUT;
> > sdhci_err_stats_inc(host, CMD_TIMEOUT);
> > __sdhci_finish_mrq(host, data_cmd->mrq);//<=
> > return;
> > }
> > if (intmask & SDHCI_INT_DATA_END) {    //#define  SDHCI_INT_DATA_END 0x00000002
> >
> > host->data_cmd = NULL;
> > /*
> > * Some cards handle busy-end interrupt
> > * before the command completed, so make
> > * sure we do things in the proper order.
> > */
> > if (host->cmd == data_cmd)
> > return;
> >
> > __sdhci_finish_mrq(host, data_cmd->mrq);//<=
> > return;
> > }
> > }
> > ...
> > if (host->pending_reset)
> > return;
> >
> > pr_err("%s: Got data interrupt 0x%08x even though no data operation
> > was in progress.\n",
> >        mmc_hostname(host->mmc), (unsigned)intmask);
> > sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
> > sdhci_dumpregs(host);
> >
> > return;
> > }
> > ...
> > }
>
> Not really following that I'm sorry.
>
> Are you saying you get a data interrupt after he data circuit is reset?
>

No. During the tuning process, sdhci_data_irq does not skip printing
because the interrupt state is 0x00200000 (DATA CRC ERROR).

> >
> >>> +
> >>>               pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
> >>>                      mmc_hostname(host->mmc), (unsigned)intmask);
> >>>               sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
> >>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning
  2022-11-21  3:11         ` Wenchao Chen
@ 2022-11-30  6:18           ` Adrian Hunter
  0 siblings, 0 replies; 9+ messages in thread
From: Adrian Hunter @ 2022-11-30  6:18 UTC (permalink / raw)
  To: Wenchao Chen; +Cc: ulf.hansson, linux-mmc, linux-kernel, megoo.tang, lzx.stg

On 21/11/22 05:11, Wenchao Chen wrote:
> On Fri, Nov 18, 2022 at 11:57 PM Adrian Hunter <adrian.hunter@intel.com> wrote:
>>
>> On 18/11/22 11:25, Wenchao Chen wrote:
>>> On Thu, Nov 17, 2022 at 12:00 AM Adrian Hunter <adrian.hunter@intel.com> wrote:
>>>>
>>>> On 11/11/22 10:42, Wenchao Chen wrote:
>>>>> From: Wenchao Chen <wenchao.chen@unisoc.com>
>>>>>
>>>>> During the HS200 tuning process, too many tuning errors are printed in
>>>>> the log.
>>>>>
>>>>> Signed-off-by: Wenchao Chen <wenchao.chen@unisoc.com>
>>>>> ---
>>>>>  drivers/mmc/host/sdhci.c | 4 ++++
>>>>>  1 file changed, 4 insertions(+)
>>>>>
>>>>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>>>>> index fef03de85b99..a503b54305eb 100644
>>>>> --- a/drivers/mmc/host/sdhci.c
>>>>> +++ b/drivers/mmc/host/sdhci.c
>>>>> @@ -3401,6 +3401,10 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
>>>>>               if (host->pending_reset)
>>>>>                       return;
>>>>>
>>>>> +             command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND));
>>>>> +             if (command == MMC_SEND_TUNING_BLOCK || command == MMC_SEND_TUNING_BLOCK_HS200)
>>>>> +                     return;
>>>>
>>>> Normally we wouldn't get here even if a request got an error because
>>>> then we either reset the data circuit which should stop further
>>>> interrupts, or set host->pending_reset.
>>>>
>>>> Can you elaborate on what is going wrong?
>>>>
>>> Hi  adrian
>>> 1. In the process of tuning, not all tuning values are good, some
>>> tuning values may cause errors, and these errors print too many logs.
>>>     Of course, we reset the cmdline or dataline on error.
>>> 2. use host->pending_reset = true
>>> static void __sdhci_finish_mrq(struct sdhci_host *host, struct mmc_request *mrq)
>>> {
>>> ...
>>> if (sdhci_needs_reset(host, mrq))
>>> host->pending_reset = true;
>>> ...
>>> }
>>>
>>> But intmask = 0x00200000
>>> static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
>>> {
>>> ...
>>> if (!host->data) {
>>> struct mmc_command *data_cmd = host->data_cmd;
>>>
>>> if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) {
>>> if (intmask & SDHCI_INT_DATA_TIMEOUT) { //#define
>>> SDHCI_INT_DATA_TIMEOUT 0x00100000
>>> host->data_cmd = NULL;
>>> data_cmd->error = -ETIMEDOUT;
>>> sdhci_err_stats_inc(host, CMD_TIMEOUT);
>>> __sdhci_finish_mrq(host, data_cmd->mrq);//<=
>>> return;
>>> }
>>> if (intmask & SDHCI_INT_DATA_END) {    //#define  SDHCI_INT_DATA_END 0x00000002
>>>
>>> host->data_cmd = NULL;
>>> /*
>>> * Some cards handle busy-end interrupt
>>> * before the command completed, so make
>>> * sure we do things in the proper order.
>>> */
>>> if (host->cmd == data_cmd)
>>> return;
>>>
>>> __sdhci_finish_mrq(host, data_cmd->mrq);//<=
>>> return;
>>> }
>>> }
>>> ...
>>> if (host->pending_reset)
>>> return;
>>>
>>> pr_err("%s: Got data interrupt 0x%08x even though no data operation
>>> was in progress.\n",
>>>        mmc_hostname(host->mmc), (unsigned)intmask);
>>> sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
>>> sdhci_dumpregs(host);
>>>
>>> return;
>>> }
>>> ...
>>> }
>>
>> Not really following that I'm sorry.
>>
>> Are you saying you get a data interrupt after he data circuit is reset?
>>
> 
> No. During the tuning process, sdhci_data_irq does not skip printing
> because the interrupt state is 0x00200000 (DATA CRC ERROR).

Sorry I am still confused.  Which driver is this?  I was assuming
you were using mmc_send_tuning() because the only interrupt enabled
for regular SDHCI tuning is SDHCI_INT_DATA_AVAIL (0x00000020).

So are you saying you are getting status 0x00200000 even though the
mask is 0x00000020 ?

> 
>>>
>>>>> +
>>>>>               pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
>>>>>                      mmc_hostname(host->mmc), (unsigned)intmask);
>>>>>               sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
>>>>
>>


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-11-30  6:19 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-11  8:42 [PATCH 0/1] mmc: Reduce tuning log output Wenchao Chen
2022-11-11  8:42 ` [PATCH 1/1] mmc: sdhci: Fixed too many logs being printed during tuning Wenchao Chen
2022-11-16 15:20   ` Ulf Hansson
2022-11-18  9:22     ` Wenchao Chen
2022-11-16 16:00   ` Adrian Hunter
2022-11-18  9:25     ` Wenchao Chen
2022-11-18 15:57       ` Adrian Hunter
2022-11-21  3:11         ` Wenchao Chen
2022-11-30  6:18           ` Adrian Hunter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.