Received: by 2002:a05:6a10:2785:0:0:0:0 with SMTP id ia5csp2136916pxb; Mon, 11 Jan 2021 01:41:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJxVN+109tnpg3d8lFtG/N0vE4oFFYbV9UlxOwrdwbTw7VKtBQhFFBuFRLUmwx2mYlOmPHtw X-Received: by 2002:a05:6402:1041:: with SMTP id e1mr14188458edu.54.1610358092172; Mon, 11 Jan 2021 01:41:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610358092; cv=none; d=google.com; s=arc-20160816; b=KBwsyOqmwy94TPQ6HgTywbSu9AlObqJlL9Bkox4l5J00vbXQqtTQmZIg8L7BJ6JFO5 xknL6Qt1tZuThN0128Ye4zdhR8BflTIrsSPBv/MG/ek/dX3ueZKDYBihsBxJMulh0V8p bUxbzq0dmsUOyX+14zahhYi/XYi/ELcFKvCX89q8hAjO+rgLTQU0KrT+Wlu0cafdAW5i rhtYvUb/LvSJF9GB+8tjtAFggiwj/N0RzMZicD/HjItkpMb8UNSvI2o4bcPKAk3G+bID gX9dWsb1Gi1RcP18k3gSm0lX/YP/yfYIuvNq3116mOKtk3uWx6+Z7zKzjVVIdc1mOmy6 mH7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:references:cc:to:from :subject; bh=1m5++1OQk5hUiWniIB1JGHgliwnsa+BM2i3vqldJ6MY=; b=NFZvmqfgv7bBzMGabYt6YCIj80+M68R6FSSY5VlNUI/8ugyJovnB7S1I3yMrT6JD8T a/DZxx8emLTTJVqJAP71ZsuMLcjOy/lfVbe/MlsJgspaNC7L3kwnt5y5ixvxGK4LdnT6 l3aOxW3TMVTYAzOcKIxTx1ZZXKpFRvyPfGKRptbxNCBNohTnEG/4iL/cAHgoKWUbqpFQ mtB08qQCv4SpoeBgO4OofWzAFo4mSIxZN+jnq0RIqIawz1lySN7T1yksGK5ajBK9XgKH 4hmtxzKd+E+xKjlow3Ze0v2Oo+wGs0aDuAG67JNpsBG6nk+BtCmiAp8eaF5EscyNhezp aCSA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h8si6233299ejf.491.2021.01.11.01.41.08; Mon, 11 Jan 2021 01:41:32 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728451AbhAKJjY (ORCPT + 99 others); Mon, 11 Jan 2021 04:39:24 -0500 Received: from szxga07-in.huawei.com ([45.249.212.35]:11377 "EHLO szxga07-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728042AbhAKJjY (ORCPT ); Mon, 11 Jan 2021 04:39:24 -0500 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.58]) by szxga07-in.huawei.com (SkyGuard) with ESMTP id 4DDpXQ17Hlz6vGV; Mon, 11 Jan 2021 17:37:42 +0800 (CST) Received: from [10.67.102.118] (10.67.102.118) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.498.0; Mon, 11 Jan 2021 17:38:39 +0800 Subject: Re: [PATCH] USB:ehci:fix an interrupt calltrace error From: liulongfang To: Alan Stern CC: , , References: <1606361673-573-1-git-send-email-liulongfang@huawei.com> <20201126160830.GA827745@rowland.harvard.edu> <96b4d366-c94c-9708-da12-5693bf16b716@huawei.com> <20201127154718.GA861473@rowland.harvard.edu> <3c2366c8-4b3e-dac0-48ad-6b33b6eed10e@huawei.com> Message-ID: <0f747f03-72e8-84de-c1c1-297398ca516c@huawei.com> Date: Mon, 11 Jan 2021 17:38:39 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <3c2366c8-4b3e-dac0-48ad-6b33b6eed10e@huawei.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.67.102.118] X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2020/11/28 11:22, liulongfang Wrote: > On 2020/11/27 23:47, Alan Stern Wrote: >> On Fri, Nov 27, 2020 at 10:29:03AM +0800, liulongfang wrote: >>> On 2020/11/27 0:08, Alan Stern Wrote: >>>> On Thu, Nov 26, 2020 at 11:34:33AM +0800, Longfang Liu wrote: >>>>> The system goes to suspend when using USB audio player. This causes >>>>> the USB device continuous send interrupt signal to system, When the >>>>> number of interrupts exceeds 100000, the system will forcibly close >>>>> the interrupts and output a calltrace error. >>>> >>>> This description is very confusing. USB devices do not send interrupt >>>> signals to the host. Do you mean that the device sends a wakeup >>>> request? Or do you mean something else? >>> The irq type is IRQ_NONE,It's counted in the note_interrupt function. >>> From the analysis of the driver code, that are indeed interrupt signals. >> >> Above you wrote: "the USB device continuous send interrupt signal to >> system". But that's not correct. The interrupt signals are sent by the >> USB host controller, not by the USB audio device. >> > OK, I will modify the description in the next patch. >> The patch description should mention that this happens only with some >> Synopsys host controllers. >> >>>>> When the system goes to suspend, the last interrupt is reported to >>>>> the driver. At this time, the system has set the state to suspend. >>>>> This causes the last interrupt to not be processed by the system and >>>>> not clear the interrupt state flag. This uncleared interrupt flag >>>>> constantly triggers new interrupt event. This causing the driver to >>>>> receive more than 100,000 interrupts, which causes the system to >>>>> forcibly close the interrupt report and report the calltrace error. >>>> >>>> If the driver receives an interrupt, it is supposed to process the event >>>> even if the host controller is suspended. And when ehci_irq() runs, it >>>> clears the bits that are set in the USBSYS register. >>> When the host controller is suspended, the ehci_suspend() will clear >>> the HCD_FLAG_HW_ACCESSIBLE, and then usb_hcd_irq() will return IRQ_NONE >>> directly without calling ehci_irq(). >> >> Yes. But ehci_bus_suspend() runs _before_ the host controller is >> suspended. While ehci_bus_suspend() is running, usb_hcd_irq() _will_ >> call ehci_irq(), and ehci_irq() _will_ clear the status bits. >> >> After the host controller is suspended it is not supposed to generate >> any interrupt signals at all, because ehci_suspend() writes 0 to the >> USBINTR register, and it does this _before_ clearing >> HCD_FLAG_HW_ACCESSIBLE. >> > According to this process, there should be no interruption storm problem, > but the current fact is that the problem has occurred, so the actual > execution process did not follow the correct process above. > >>>> Why is your system getting interrupts? That is, which bits are set in >>>> the USBSTS register? >>> BIT(5) and BIT(3) are setted, STS_IAA and STS_FLR. >> >> STS_FLR is not set in the USBINTR register, but STS_IAA is. So that's >> the one which matters. >> >>>>> so, when the driver goes to sleep and changes the system state to >>>>> suspend, the interrupt flag needs to be cleared. >>>>> >>>>> Signed-off-by: Longfang Liu >>>>> --- >>>>> drivers/usb/host/ehci-hub.c | 5 +++++ >>>>> 1 file changed, 5 insertions(+) >>>>> >>>>> diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c >>>>> index ce0eaf7..5b13825 100644 >>>>> --- a/drivers/usb/host/ehci-hub.c >>>>> +++ b/drivers/usb/host/ehci-hub.c >>>>> @@ -348,6 +348,11 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) >>>>> >>>>> /* Any IAA cycle that started before the suspend is now invalid */ >>>>> end_iaa_cycle(ehci); >>>>> + >>>>> + /* clear interrupt status */ >>>>> + if (ehci->has_synopsys_hc_bug) >>>>> + ehci_writel(ehci, INTR_MASK | STS_FLR, &ehci->regs->status); >>>> >>>> This is a very strange place to add your new code -- right in the middle >>>> of the IAA and unlink handling. Why not put it in a more reasonable >>>> place?After the IAA is processed, clear the STS_IAA interrupt state flag. >>>> >>>> Also, the patch description does not mention has_synopsys_hc_bug. The >>>> meaning of this flag has no connection with the interrupt status >>>> register, so why do you use it here? >>> Because of our USB IP comes from Synopsys, and the uncleared flage is also caused by >>> special hardware design, in addition, we have not tested other manufacturers' USB >>> controllers.We don’t know if other manufacturers’ designs have this problem, >>> so this modification is only limited to this kind of design. >> >> Clearing the STS_IAA flag won't hurt, no matter who manufactured the >> controller. So your patch should look more like this: >> >> + /* Some Synopsys controllers mistakenly leave IAA turned on */ >> + ehci_writel(ehci, STS_IAA, &ehci->regs->status); >> >> And these lines should come before the "Any IAA cycle..." comment line. >> Does that fix the problem? > I will conduct a round of testing based on this modification > and provide the test results. >> >> Alan Stern >> . >> > Thanks. > Longfang Liu > . > After continuous sleep and wake-up operation stress tests, this problem can be solved by using a solution that only cleans up STS_IAA Thanks. Longfang Liu