Re: usb: musb: slower system resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Vishal Thanki <vishalthanki@xxxxxxxxx> writes:
> It is vanilla kernel v4.0, except for some ASoC patches and v5 of Dave's PM
> series from kernel v3.19-rc5 rebased to it.

Care to try *real* vanilla v4.4 instead ? v4.5-rc3 would be even
better. Take *no* extra patches.

> If a USB storage device is plugged in before suspend and keep is plugged in
> during resume, the resume is taking ~15+ seconds. I noticed that it fails while
> sending USB control messages in hub_port_init():
>
> http://lxr.free-electrons.com/source/drivers/usb/core/hub.c#L4390
>
> After the failure, the USB device is logically disconnected and rediscovered
> again. So I can see the device mounted once the system is resumed, but it
> takes more time during resume.
>
> I observed that during system resume, there is a CONNECT interrupt received
> by MUSB controller:
>
> http://lxr.free-electrons.com/source/drivers/usb/musb/musb_core.c#L772
>
> If the hub_port_init() is started before the CONNECT interrupt is
> served, I am hitting the issue. Almost every time the CONNECT
> interrupt is occurring ~150ms after musb_start() is invoked from
> musb_resume(). If I add a wait of ~200ms in musb_resume() just to make
> sure that CONNECT interrupt is received, I never hit the issue.

interesting, sounds like a bug in the ordering of calls in
musb_resume(). Can you see if you're falling in either of these branches
on the failing case ?

	mask = MUSB_DEVCTL_BDEVICE | MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV;
	if ((devctl & mask) != (musb->context.devctl & mask))
		musb->port1_status = 0;
	if (musb->need_finish_resume) {
		musb->need_finish_resume = 0;
		schedule_delayed_work(&musb->finish_resume_work,
				      msecs_to_jiffies(USB_RESUME_TIMEOUT));
	}

Any differences in this regard on the working case?

> I see that hub_port_init() is calling hub_port_reset before actually
> sending the USB
> control messages. The hub_port_reset() internally sets the RESET bit
> in MUSB POWER
> register, but I am not sure if that is a valid operation before
> getting the CONNECT interrupt.

hub_port_reset(), IMO, shouldn't run before it knows there are devices
connected to the bus...

-- 
balbi

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux