Re: [PATCH] xhci: Disable connect, disconnect and over-current wakeup on system suspend

From: Kai-Heng Feng
Date: Fri Aug 18 2023 - 10:13:41 EST


On Fri, Aug 18, 2023 at 11:08 AM Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote:
>
> On Fri, Aug 18, 2023 at 08:01:54AM +0800, Kai-Heng Feng wrote:
> > On Thu, Aug 17, 2023 at 10:22 PM Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote:
> > >
> > > On Thu, Aug 17, 2023 at 10:07:37AM -0400, Alan Stern wrote:
> > > > On Thu, Aug 17, 2023 at 05:33:05PM +0800, Kai-Heng Feng wrote:
> > > > > HP ProOne 440 G10 AIO sometimes cannot suspend as xHCI wakes up the
> > > > > system:
> > > > > [ 445.814574] hub 2-0:1.0: hub_suspend
> > > > > [ 445.814652] usb usb2: bus suspend, wakeup 0
> > > > > [ 445.824629] xhci_hcd 0000:00:14.0: Port change event, 1-11, id 11, portsc: 0x202a0
> > > >
> > > > What is the meaning of the 0x202a0 bits? What caused this wakeup?
> > >
> > > And more to the point, given that the previous line says "wakeup 0", why
> > > should any port change event cause a wakeup?
> >
> > I think the controller and roothub have to deal with the interrupt
> > about disconnecting regardless of the remote wakeup setting.
>
> This seems to contradict what you wrote in an earlier email:

Nothing is contradicting, what I mentioned is the wakeup of USB
touchpanel, not the controller or root hub.

>
> > > If remote wakeup isn't enabled then the do_wakeup variable will be 0,
> > > so your patch wouldn't make any difference. The question is what
> > > happens when remote wakeup _is_ enabled.
> >
> > Nothing happens either per my testing.
> >
> > For USB keyboard, the remote wakeup is enabled, unplugging it when
> > suspend is suspended doesn't wake the system up, despite of PORT_WKDISC_E being set.
> > Plugging it back doesn't wake the system up either, despite of PORT_WKCONN_E.
>
> You appear to be saying that when wakeup is disabled, unplugging a
> device will wake up the system -- but when wakeup is enabled, unplugging
> a device will not wake up the system!

No, what I was saying is that when PORT_WKCONN_E and PORT_WKDISC_E are
set, plugging/unplugging USB doesn't wake up the system from suspended
state.
What it really does for this case is to hinder the suspending process.

>
> Is that really what you meant? It doesn't make sense. Probably means
> there's a bug in the HCD.
>
> The point I'm trying to get at is that if wakeups are disabled for both
> the host controller and the root hub then _nothing_ should generate an
> interrupt or wakeup request. Not pressing a key, not unplugging a
> device... nothing. But if wakeup _is_ enabled for both the controller
> and the root hub, then any of those actions should generate an interrupt
> and wake up the system.

Like above, the wakeup I mentioned is on the USB touchpanel itself,
not on the controller and roothub.
There's no IRQ generated when controller's wakeup is disabled.

>
> If wakeup is enabled for the host controller but not for the root hub,
> then unplugging a device from the root hub should not generate a wakeup
> request or an interrupt. But things like pressing a key on a
> wakeup-enabled keyboard should. (In other words, the root hub shouldn't
> generate any wakeup requests on its own but it should relay wakeup
> requests that it receives from downstream devices.) However, it's
> understandable if the system doesn't behave properly in this case since
> it's kind of an odd situation.

Do you mean when the system is suspended, or system is still suspending?
The issue only happens when the system is suspending.

Kai-Heng

>
> Alan Stern