Draft: intel: support for RPC-powered xmm7360 (legacy)
Note that work on this continues in the new clean MR !1235
This MR adds support for Intel XMM7360 (e.g. Fibocom L850) modems to the intel
plugin.
This includes modem initialization, enabling (including PIN unlock), registration, connecting, and disconnecting. Some SIM managing features (like disabling/enabling PIN or changing the PIN) work, as well. The following parts (possibly among others) do not work:
- The modem might freeze in certain situations, e.g. after waking up from suspend. ModemManager will not be able to reset it to a usable state. Only rebooting will solve this for the average user (cold-resetting/power-cycling the PCI interface would be an alternative). Often, even rebooting and/or power cycling doesn't help, but a cold boot of the computer is required to revive the device. This is not caused by this implementation, but must be related to the kernel-side. I don't know whether it would make sense to implement power-cycling of the device in ModemManager. This involves removing the PCI device, and triggering a rescan on the PCI port.
- No IPv6 connection to the internet, only IPv4.
- One user reported that the device yields slower download speeds when used with this driver under Ubuntu, compared to using it under a parallel installation of Windows with the OEM driver.
Isn't the XMM7360 already supported via MBIM?
XMM7360 devices that are connected via a PCI interface will only expose an RPC and no MBIM port. Hence, support for XMM7360 in ModemManager is currently limited to setups where the device is connected via an USB interface. Forcing the device to use the USB instead of the PCI interface is not an option for many users (e.g. ThinkPad T495 laptops).
Why are some features missing, and can they be added in the context of this MR?
The reason is that the RPC interface is not officially documented anywhere, but our knowledge about it is solely based on reverse engineering efforts by James Wah (https://github.com/xmm7360/reversing). Therefore, this will probably never be as stable as the MBIM interface. In principle, it would be possible to get more information about the interface by reverse engineering the Windows drivers. However, I will not work on this in the context of this MR.
Who contributed to this implementation?
- Reverse engineering. James Wah, 2019: https://github.com/xmm7360/reversing
- Python script to set up a connection. James Wah, 2019: https://github.com/xmm7360/xmm7360-pci/tree/master/rpc
- Tentative implementation in C as a ModemManager plugin. Marinus Enzinger, 2020: https://github.com/enzingerm/ModemManager
- Updated implementation to more recent version of ModemManager. Shane Parslow, 2023: https://gitlab.freedesktop.org/ShaneParslow/ModemManager/-/tree/enz7360
- Updated, fully asynchronous implementation as part of the
intel
plugin. Thomas Vogt, 2024 (this MR)
Some open questions from my side
- During probing, both AT ports are probed even though one of them will never respond. Is there a way to speed up this process somehow, e.g. by cancelling the probing if at least one responsive AT port has been found? I mean, only for the XMM7360 - not in general.
Some remarks about coding style and structure
I tried to follow the style and structure of code in similar pre-existing parts of the ModemManager code as closely as possible. For example, I created the file src/plugins/intel/mm-broadband-modem-xmm7360-rpc.c
by copying and adapting the code in src/mm-base-modem-at.c
. Also, the structure of the file src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c
has notable similarities with src/mm-port-serial-at.c
.
How to compile and test this
See my note below with instructions on how to compile and test the version of ModemManager from this MR on Ubuntu or Fedora.