On Wed, 2022-06-29 at 12:22 +0200, Greg Kroah-Hartman wrote: > On Wed, Jun 29, 2022 at 05:02:54PM +0800, Chunfeng Yun wrote: > > Hi, > > > > I plan to support function remote wakeup on our usb3 device > > controller > > driver. > > Is this based on dwc3 or some new silicon? Based on mtu3; > > > A function may signal that it wants to exit from Function Suspend > > by > > sending a Function Wake Notification to the host, and the > > notification > > need knows the first interface number in this function. > > But the current gadget ops: > > int (*wakeup)(struct usb_gadget *); > > does not provide information about interface number; > > Why would the interface matter as you need to do this for the whole > device, not just one interface, right? Yes, it is, but usb3.2 only supports function remote wakeup. I look at the code of core/hub.c, as described in function usb_enable_remote_wakeup(): " For USB-3 devices: Assume there's only one function on the device and enable remote wake for the first interface. FIXME if the interface association descriptor shows there's more than one function. " It assume the interface number is 0, and don't support multi-function devices with IAD. > > > There seems to be two ways: > > 1. add a new parameter as below, > > int (*wakeup)(struct usb_gadget *, u8 intf); > > 2. add a new ops, such as, > > int (*function_wakeup)(struct usb_gadget *, u8 intf); > > > > Do you have any suggestions? > > Look at what the existing ones do, Yes, I looked at all existing ones that support remote wakeup, but seems no one support function wakeup (maybe also assume the interface number is 0 if it does); If we also follow the ways of host, no need change ops. but there is also limitation for composite device with IAD; > I do not think you have different > suspend levels per USB interface, but rather the whole device. > Try it > and see. > > thanks, > > greg k-h