qcom-soc: Add support for WWAN subsystem instead of RPMSG

Recent Linux kernel versions have introduced a generic WWAN subsystem
that provides various char devices for QMI, AT etc, similar to the
subsystem-specific char devices for USB or RPMSG.

The RPMSG char device for Qualcomm SoCs (e.g. MSM8916/MSM8974)
are particularly complicated to work with because they need to be
explicitly created from userspace with rpmsgexport and don't show up
automatically.

However, it turns out it's fairly simple to wrap the RPMSG subsystem
in a simple driver for the WWAN subsystem. This has several advantages:

  - We can drop support for the special RPMSG char devices entirely
    at some point.
  - The WWAN char devices show up automatically, without having to export
    them explicitly, making ModemManager work out of the box on these devices.

For now, just support using the WWAN subsystem alternatively for the
qcom-soc plugin. Later we can consider dropping the old RPMSG code.
This commit is contained in:
Stephan Gerhold
2021-06-05 16:31:33 +02:00
committed by Aleksander Morgado
parent ea645522fa
commit 681d5d29d5
3 changed files with 4 additions and 3 deletions

View File

@@ -5,6 +5,7 @@ ACTION!="add|change|move|bind", GOTO="mm_qcom_soc_end"
# Process only known net and rpmsg ports
SUBSYSTEM=="net", DRIVERS=="bam-dmux", GOTO="mm_qcom_soc_process"
SUBSYSTEM=="net", DRIVERS=="ipa", GOTO="mm_qcom_soc_process"
SUBSYSTEM=="wwan", DRIVERS=="qcom-q6v5-mss", GOTO="mm_qcom_soc_process"
SUBSYSTEM=="rpmsg", DRIVERS=="qcom-q6v5-mss", GOTO="mm_qcom_soc_process"
GOTO="mm_qcom_soc_end"
@@ -14,7 +15,7 @@ LABEL="mm_qcom_soc_process"
# Add a common physdev UID to all ports in the Qualcomm SoC, so that they
# are all bound together to the same modem object.
#
# The MSM8916, MSM8974, .... Qualcomm SoCs use the combination of RPMSG
# The MSM8916, MSM8974, .... Qualcomm SoCs use the combination of RPMSG/WWAN
# based control ports plus BAM-DMUX based network ports.
#
ENV{ID_MM_PHYSDEV_UID}="qcom-soc"

View File

@@ -67,7 +67,7 @@ peek_port_qmi_for_data_bam_dmux (MMBroadbandModemQmi *self,
/* Find one QMI port, we don't care which one */
rpmsg_qmi_ports = mm_base_modem_find_ports (MM_BASE_MODEM (self),
MM_PORT_SUBSYS_RPMSG,
MM_PORT_SUBSYS_UNKNOWN,
MM_PORT_TYPE_QMI);
if (!rpmsg_qmi_ports) {
g_set_error (error,

View File

@@ -67,7 +67,7 @@ create_modem (MMPlugin *self,
G_MODULE_EXPORT MMPlugin *
mm_plugin_create (void)
{
static const gchar *subsystems[] = { "rpmsg", "net", "qrtr", NULL };
static const gchar *subsystems[] = { "wwan", "rpmsg", "net", "qrtr", NULL };
return MM_PLUGIN (
g_object_new (MM_TYPE_PLUGIN_QCOM_SOC,