On Wed, Nov 6, 2024 at 4:35 PM Guan-Yu Lin <guanyulin@xxxxxxxxxx> wrote: > > diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c > index e53cb4c267b3..e5bb26e6c71a 100644 > --- a/drivers/usb/core/driver.c > +++ b/drivers/usb/core/driver.c > @@ -1583,6 +1583,11 @@ int usb_suspend(struct device *dev, pm_message_t msg) > struct usb_device *udev = to_usb_device(dev); > int r; > > + if (msg.event == PM_EVENT_SUSPEND && usb_sideband_check(udev)) { > + dev_dbg(dev, "device accessed via sideband\n"); > + return 0; > + } > + > unbind_no_pm_drivers_interfaces(udev); > > /* From now on we are sure all drivers support suspend/resume > @@ -1619,6 +1624,11 @@ int usb_resume(struct device *dev, pm_message_t msg) > struct usb_device *udev = to_usb_device(dev); > int status; > > + if (msg.event == PM_EVENT_RESUME && usb_sideband_check(udev)) { > + dev_dbg(dev, "device accessed via sideband\n"); > + return 0; > + } > + > /* For all calls, take the device back to full power and > * tell the PM core in case it was autosuspended previously. > * Unbind the interfaces that will need rebinding later, In v5, Greg points out the race window between checking sideband activity and handling power management of usb devices. We should consider a lock mechanism to address the race window. Given that the design hasn't locked down and the race window might change from time to time. I'll address this after the discussion of suspending USB devices/interfaces has converged. In addition, Alan suggests to only keep USB devices active but suspend the USB interfaces. However, hub events and key events require active USB interfaces to function. In the sideband model, the sideband driver only handles USB transfers on specific endpoints, leaving other functionalities like connection changes and key events to the Linux USB kernel drivers. Therefore, a potential design modification is to shift the sideband model's focus from voting for USB devices to voting for USB interfaces. This way, the driver could selectively hold necessary interfaces active during system suspend. This adjustment accommodates use cases where specific interfaces must remain active to support overall USB functionality when partial interfaces are offloaded to a sideband.