diff options
-rw-r--r-- | cli/mmcli-manager.c | 2 | ||||
-rw-r--r-- | src/mm-base-modem.c | 18 | ||||
-rw-r--r-- | src/mm-filter.c | 7 | ||||
-rw-r--r-- | src/mm-filter.h | 23 | ||||
-rw-r--r-- | src/mm-plugin.c | 5 | ||||
-rw-r--r-- | src/mm-port-probe.c | 26 | ||||
-rw-r--r-- | src/mm-port.h | 4 |
7 files changed, 62 insertions, 23 deletions
diff --git a/cli/mmcli-manager.c b/cli/mmcli-manager.c index 950617b6..01d2972c 100644 --- a/cli/mmcli-manager.c +++ b/cli/mmcli-manager.c @@ -444,7 +444,7 @@ get_manager_ready (GObject *source, #if defined WITH_UDEV if (report_kernel_event_auto_scan) { - const gchar *subsys[] = { "tty", "usbmisc", "net", NULL }; + const gchar *subsys[] = { "tty", "usbmisc", "net", "rpmsg", NULL }; guint i; ctx->udev = g_udev_client_new (subsys); diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 09227da5..29256f7d 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -238,6 +238,20 @@ base_modem_create_usbmisc_port (MMBaseModem *self, } static MMPort * +base_modem_create_rpmsg_port (MMBaseModem *self, + const gchar *name, + MMPortType ptype) +{ +#if defined WITH_QMI + if (ptype == MM_PORT_TYPE_QMI) + return MM_PORT (mm_port_qmi_new (name, MM_PORT_SUBSYS_RPMSG)); +#endif + if (ptype == MM_PORT_TYPE_AT) + return MM_PORT (mm_port_serial_at_new (name, MM_PORT_SUBSYS_RPMSG)); + return NULL; +} + +static MMPort * base_modem_create_virtual_port (MMBaseModem *self, const gchar *name) { @@ -278,6 +292,8 @@ mm_base_modem_grab_port (MMBaseModem *self, port = base_modem_create_tty_port (self, name, kernel_device, ptype); else if (g_str_equal (subsys, "usbmisc")) port = base_modem_create_usbmisc_port (self, name, ptype); + else if (g_str_equal (subsys, "rpmsg")) + port = base_modem_create_rpmsg_port (self, name, ptype); else if (g_str_equal (subsys, "virtual")) port = base_modem_create_virtual_port (self, name); @@ -327,8 +343,6 @@ mm_base_modem_grab_port (MMBaseModem *self, return TRUE; } -/******************************************************************************/ - gboolean mm_base_modem_disable_finish (MMBaseModem *self, GAsyncResult *res, diff --git a/src/mm-filter.c b/src/mm-filter.c index c5a15312..52575a1c 100644 --- a/src/mm-filter.c +++ b/src/mm-filter.c @@ -199,6 +199,13 @@ mm_filter_port (MMFilter *self, return TRUE; } + /* If this is a rpmsg channel device, we always allow it */ + if ((self->priv->enabled_rules & MM_FILTER_RULE_RPMSG) && + (g_strcmp0 (subsystem, "rpmsg") == 0)) { + mm_obj_dbg (self, "(%s/%s) port allowed: rpmsg device", subsystem, name); + return TRUE; + } + /* If this is a tty device, we may allow it */ if ((self->priv->enabled_rules & MM_FILTER_RULE_TTY) && (g_strcmp0 (subsystem, "tty") == 0)) { diff --git a/src/mm-filter.h b/src/mm-filter.h index dc5f2bff..8d2e0e22 100644 --- a/src/mm-filter.h +++ b/src/mm-filter.h @@ -53,15 +53,16 @@ typedef enum { /*< underscore_name=mm_filter_rule >*/ MM_FILTER_RULE_VIRTUAL = 1 << 3, MM_FILTER_RULE_NET = 1 << 4, MM_FILTER_RULE_USBMISC = 1 << 5, - MM_FILTER_RULE_TTY = 1 << 6, - MM_FILTER_RULE_TTY_BLACKLIST = 1 << 7, - MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY = 1 << 8, - MM_FILTER_RULE_TTY_PLATFORM_DRIVER = 1 << 9, - MM_FILTER_RULE_TTY_DEFAULT_ALLOWED = 1 << 10, - MM_FILTER_RULE_TTY_DRIVER = 1 << 11, - MM_FILTER_RULE_TTY_ACM_INTERFACE = 1 << 12, - MM_FILTER_RULE_TTY_WITH_NET = 1 << 13, - MM_FILTER_RULE_TTY_DEFAULT_FORBIDDEN = 1 << 14, + MM_FILTER_RULE_RPMSG = 1 << 6, + MM_FILTER_RULE_TTY = 1 << 7, + MM_FILTER_RULE_TTY_BLACKLIST = 1 << 8, + MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY = 1 << 9, + MM_FILTER_RULE_TTY_PLATFORM_DRIVER = 1 << 10, + MM_FILTER_RULE_TTY_DEFAULT_ALLOWED = 1 << 11, + MM_FILTER_RULE_TTY_DRIVER = 1 << 12, + MM_FILTER_RULE_TTY_ACM_INTERFACE = 1 << 13, + MM_FILTER_RULE_TTY_WITH_NET = 1 << 14, + MM_FILTER_RULE_TTY_DEFAULT_FORBIDDEN = 1 << 15, } MMFilterRule; #define MM_FILTER_RULE_ALL \ @@ -71,6 +72,7 @@ typedef enum { /*< underscore_name=mm_filter_rule >*/ MM_FILTER_RULE_VIRTUAL | \ MM_FILTER_RULE_NET | \ MM_FILTER_RULE_USBMISC | \ + MM_FILTER_RULE_RPMSG | \ MM_FILTER_RULE_TTY | \ MM_FILTER_RULE_TTY_BLACKLIST | \ MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY | \ @@ -89,6 +91,7 @@ typedef enum { /*< underscore_name=mm_filter_rule >*/ MM_FILTER_RULE_VIRTUAL | \ MM_FILTER_RULE_NET | \ MM_FILTER_RULE_USBMISC | \ + MM_FILTER_RULE_RPMSG | \ MM_FILTER_RULE_TTY | \ MM_FILTER_RULE_TTY_BLACKLIST | \ MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY | \ @@ -104,6 +107,7 @@ typedef enum { /*< underscore_name=mm_filter_rule >*/ MM_FILTER_RULE_VIRTUAL | \ MM_FILTER_RULE_NET | \ MM_FILTER_RULE_USBMISC | \ + MM_FILTER_RULE_RPMSG | \ MM_FILTER_RULE_TTY | \ MM_FILTER_RULE_TTY_PLATFORM_DRIVER | \ MM_FILTER_RULE_TTY_DRIVER | \ @@ -120,6 +124,7 @@ typedef enum { /*< underscore_name=mm_filter_rule >*/ MM_FILTER_RULE_VIRTUAL | \ MM_FILTER_RULE_NET | \ MM_FILTER_RULE_USBMISC | \ + MM_FILTER_RULE_RPMSG | \ MM_FILTER_RULE_TTY | \ MM_FILTER_RULE_TTY_BLACKLIST | \ MM_FILTER_RULE_TTY_MANUAL_SCAN_ONLY | \ diff --git a/src/mm-plugin.c b/src/mm-plugin.c index be6e39ff..13b46a75 100644 --- a/src/mm-plugin.c +++ b/src/mm-plugin.c @@ -781,6 +781,11 @@ mm_plugin_supports_port (MMPlugin *self, probe_run_flags |= MM_PORT_PROBE_MBIM; else probe_run_flags |= MM_PORT_PROBE_AT; + } else if (g_str_equal (mm_kernel_device_get_subsystem (port), "rpmsg")) { + if (self->priv->at) + probe_run_flags |= MM_PORT_PROBE_AT; + if (self->priv->qmi) + probe_run_flags |= MM_PORT_PROBE_QMI; } /* For potential AT ports, check for more things */ diff --git a/src/mm-port-probe.c b/src/mm-port-probe.c index c6b535b5..d4bffb3e 100644 --- a/src/mm-port-probe.c +++ b/src/mm-port-probe.c @@ -491,16 +491,22 @@ wdm_probe_qmi (MMPortProbe *self) ctx = g_task_get_task_data (self->priv->task); #if defined WITH_QMI - mm_obj_dbg (self, "probing QMI..."); + { + MMPortSubsys subsys = MM_PORT_SUBSYS_USBMISC; - /* Create a port and try to open it */ - ctx->port_qmi = mm_port_qmi_new (mm_kernel_device_get_name (self->priv->port), - MM_PORT_SUBSYS_USBMISC); - mm_port_qmi_open (ctx->port_qmi, - FALSE, - NULL, - (GAsyncReadyCallback) port_qmi_open_ready, - self); + mm_obj_dbg (self, "probing QMI..."); + + if (g_str_equal (mm_kernel_device_get_subsystem (self->priv->port), "rpmsg")) + subsys = MM_PORT_SUBSYS_RPMSG; + + /* Create a port and try to open it */ + ctx->port_qmi = mm_port_qmi_new (mm_kernel_device_get_name (self->priv->port), subsys); + mm_port_qmi_open (ctx->port_qmi, + FALSE, + NULL, + (GAsyncReadyCallback) port_qmi_open_ready, + self); + } #else /* If not compiled with QMI support, just assume we won't have any QMI port */ mm_port_probe_set_result_qmi (self, FALSE); @@ -1273,6 +1279,8 @@ serial_open_at (MMPortProbe *self) if (g_str_equal (mm_kernel_device_get_subsystem (self->priv->port), "usbmisc")) subsys = MM_PORT_SUBSYS_USBMISC; + else if (g_str_equal (mm_kernel_device_get_subsystem (self->priv->port), "rpmsg")) + subsys = MM_PORT_SUBSYS_RPMSG; ctx->serial = MM_PORT_SERIAL (mm_port_serial_at_new (mm_kernel_device_get_name (self->priv->port), subsys)); if (!ctx->serial) { diff --git a/src/mm-port.h b/src/mm-port.h index 2d8d1ad6..8295d264 100644 --- a/src/mm-port.h +++ b/src/mm-port.h @@ -28,8 +28,8 @@ typedef enum { /*< underscore_name=mm_port_subsys >*/ MM_PORT_SUBSYS_NET, MM_PORT_SUBSYS_USBMISC, MM_PORT_SUBSYS_UNIX, - - MM_PORT_SUBSYS_LAST = MM_PORT_SUBSYS_UNIX /*< skip >*/ + MM_PORT_SUBSYS_RPMSG, + MM_PORT_SUBSYS_LAST = MM_PORT_SUBSYS_RPMSG /*< skip >*/ } MMPortSubsys; typedef enum { /*< underscore_name=mm_port_type >*/ |