Hi,
> I've also been working with USB QMI modems (Quectel and Simcom) and > getting suspend-to-ram/resume working smoothly, so I figured perhaps > I > can share some of the things I've learnt along the way. But do note > that I'm not by any means an expert here - this is my first foray > into > usb & modems, so do take what I say with a grain of salt. > > Firstly, I agree with Aleksander's opinion above - I think the > underlying problem is the fact that the USB connection is being reset > upon resume. I'd try to solve that first - disable MM & NM altogether > for now, and focus on the qmi & usb layers. Use qmicli to set up a > connection or at least check basic info with commands like > qmicli --device=/dev/cdc-wdm0 --device-open-proxy --dms-get-model > Then start looking at the USB side of things. The kernel docs > > https://www.kernel.org/doc/html/v4.14/driver-api/usb/power-management.html > provide some good background info on this area. > > If I had a pinephone or similar hardware to test with I might be able > to provide some more guidance, however I can perhaps shed some light > by showing what was required to get my particular device working. > My device is an IMX6ULL, and the modem is connected directly to the > USB host pins on the chip itself. No USB hub ICs involved. Power to > the modem is controlled externally (in my case it's always on). Sounds like the PinePhone :) The EG25-G modem is also continously powered on and directly connected to the A64 USB. Audio is routed over I2S directly in the hardware. I will have a look at your suggestion on the PinePhone :) > USB info: > root@imx6ul-var-dart:~# lsusb -tv > /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ci_hdrc/1p, 480M > ID 1d6b:0002 Linux Foundation 2.0 root hub > /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ci_hdrc/1p, 480M > ID 1d6b:0002 Linux Foundation 2.0 root hub > |__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, > Driver=option, 480M > ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 > LTE modem > |__ Port 1: Dev 2, If 1, Class=Vendor Specific Class, > Driver=option, 480M > ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 > LTE modem > |__ Port 1: Dev 2, If 2, Class=Vendor Specific Class, > Driver=option, 480M > ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 > LTE modem > |__ Port 1: Dev 2, If 3, Class=Vendor Specific Class, > Driver=option, 480M > ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 > LTE modem > |__ Port 1: Dev 2, If 4, Class=Vendor Specific Class, > Driver=qmi_wwan, 480M > ID 2c7c:0125 Quectel Wireless Solutions Co., Ltd. EC25 > LTE modem > > The following 3 tweaks are needed to get the modem persisting across > a > suspend/resume: > echo auto > /sys/bus/usb/devices/1-1/power/control > echo enabled > /sys/bus/platform/devices/2184000.usb/power/wakeup > echo enabled > /sys/bus/platform/devices/ci_hdrc.0/power/wakeup > So with these your modem always stays connected over USB? How does ModemManager react to this when resuming/suspending? ModemManager still reprobes the device right? > Obviously your USB setup will be different so the above won't work, > but perhaps it might provide some direction. The first one - setting > control to auto - makes sense to me, but I cannot see why the other > two are needed. Having a good poke around the /sys/ tree is a good > start anyway - set control=auto and wakeup=enabled on all the usb > devices on/above the modem. Finding the equivalent of my 2nd line > might be trickier and need some datasheet or device-tree reading to > correctly identify it. > If you have USB hub devices in the chain then things will be more > complex, but I'd be surprised if they've set up the hardware that > way. > > Finally, to allow the modem to wakeup the host, the following two > tweaks were needed: > echo enabled > /sys/bus/usb/devices/usb1/power/wakeup > echo enabled > /sys/bus/usb/devices/1-1/power/wakeup > PinePhone uses the RING indicator of the EG25-G modem which gets triggered when an URC or something is available. This RING indicator is connected to a interrupt capable GPIO pin of the A64 host CPU. As soon as the RING indicator is triggered, the host CPU will wake up, even without any USB connection. > Also, note I'm suspending via the very raw > echo mem > /sys/power/state > so I can be sure that no setup/teardown is occuring. But obviously > pm-suspend or systemctl suspend is the right way to do things for > production units. > We use indeed systemctl suspend of elogind to suspend the system. Kind regards, Dylan Van Assche _______________________________________________ ModemManager-devel mailing list ModemManager-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel