Hi, Mark Rutland <mark.rutland@xxxxxxx> writes: > On Thu, Oct 27, 2016 at 02:08:25PM -0700, John Youn wrote: >> On 10/26/2016 3:57 AM, Mark Rutland wrote: >> > On Tue, Oct 25, 2016 at 12:42:46PM -0700, John Youn wrote: >> >> Add interrupt moderation interval binding for dwc3. > >> >> + - snps,imod_interval: the interrupt moderation interval. > >> > What is "interrupt moderation"? The cover mentions that this is to be >> > used for some kind of workaround, but it's not clear to me what this is, >> > and as such, whether it makes sense to describe it in this manner. >> > >> >> Interrupt moderation throttles the interrupt rate to be no faster than >> a specified interval. It's an optional feature of the controller. > > Ok. > >> This series implements the feature and enables it as a workaround for >> a particular version of the controller. > > ... as a workaround for *what*? Is there a bug in that IP version, or an you didn't receive the entire series, I guess. Here's last patch in the series: This is a workaround for STAR 9000961433 which affects only version 3.00a of the DWC_usb3 core. This prevents the controller interrupt from being masked while handling events. Enabling interrupt moderation allows us to work around this issue because once the GEVNTCOUNT.count is written the IRQ is immediately deasserted and won't be asserted again until GEVNTCOUNT.EHB is cleared. Signed-off-by: John Youn <johnyoun@xxxxxxxxxxxx> --- drivers/usb/dwc3/core.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 6733838..7fa0832 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -1050,6 +1050,18 @@ static void dwc3_check_params(struct dwc3 *dwc) dwc->imod_interval = 0; } + /* + * Workaround for STAR 9000961433 which affects only version + * 3.00a of the DWC_usb3 core. This prevents the controller + * interrupt from being masked while handling events. IMOD + * allows us to work around this issue. Enable it for the + * affected version. + */ + if (!dwc->imod_interval && + (dwc->revision == DWC3_REVISION_300A)) { + dwc->imod_interval = 1; + } + /* Check the maximum_speed parameter */ switch (dwc->maximum_speed) { case USB_SPEED_LOW: > integration issue? Does the problem vary per-board? > > Generally, if there's a problem that needs to be worked around, we > describe the problem in the DT (perhaps implicitly in the compatible > string), and then the kernel chooses the workaround. Regardless of the silicon erratum, interrupt moderation is a *feature* of the IP, common to all instances since revision v3.00a (IIRC). John is just using interrupt moderation in the context of implementing this workaround. But the actual feature is valid also without the erratum. Another thing to remember is that different applications (i.e. boards) might want to moderate the interrupt for different periods. That's, again, not related to the erratum at all. We cannot use compatible to figure this one out. dwc3 does as much runtime discovery as possible, but we cannot discover what is the desired interrupt moderation interval for $this setup. It needs to be passed in on a board-by-board basis. -- balbi
Attachment:
signature.asc
Description: PGP signature