Modem creation/startup order

Colin Helliwell colin.helliwell at ln-systems.com
Tue Feb 14 11:54:11 UTC 2017


> On 14 February 2017 at 11:33 Aleksander Morgado <aleksander at aleksander.es> wrote:
> 
> On Tue, Feb 14, 2017 at 11:39 AM, Colin Helliwell
> 
> <colin.helliwell at ln-systems.com> wrote:
> 
> > > > Thanks. The question arises from needing to have monitoring & URCs etc on one port of my mux driver, and ppp on the other - I need to make sure that ppp doesn't get run on the 'monitoring' port i.e. the one that gets in first with having the URCs enabled.
> > > > This all makes me think I need this 'primary'/'secondary' port stuff - after all that's more or less what the mux is doing too.
> > > > Perhaps I can modify Cinterion's grab_port() to flag the ports as primary/secondary? (They're /dev/ttyMux0, /dev/ttyMux1). Does this sound feasible, or is there more to the dual-portness than that....?
> > > 
> > > Just setup new Cinterion-specific udev rules to flag ports as primary
> > > or secondary, as done in other plugins; e.g.
> > > ID_MM_SIMTECH_PORT_TYPE_MODEM (primary+ppp) or
> > > ID_MM_SIMTECH_PORT_TYPE_AUX (secondary).
> > 
> > I've made that change in grab_port() and in the udev rules and it seems to be doing the flagging. But is the idea that the two [virtual] ports should show up as a single modem? (mmcli -L)
> > If so, then I reckon I need something more somewhere - the debug is showing, for both ports, messages including:
> > [src/mm-plugin-manager.c:979] device_context_continue(): [plugin manager] task 0: no more ports to probe
> > [src/mm-device.c:525] mm_device_create_modem(): Creating modem with plugin 'Cinterion' and '1' ports
> > [plugins/cinterion/mm-plugin-cinterion.c:175] grab_port(): (tty/ttyMux0)' Port flagged as primary {or PPP on the other}
> > [src/mm-base-modem.c:280] mm_base_modem_grab_port(): (ttyMux0) type 'at' claimed by /sys/devices/virtual/tty/ttyMux0
> > [src/mm-base-modem.c:864] log_port(): (/sys/devices/virtual/tty/ttyMux0) tty/ttyMux0 at (primary)
> > [src/mm-base-modem.c:864] log_port(): (/sys/devices/virtual/tty/ttyMux0) tty/ttyMux0 data (primary)
> 
> Yes, the idea is that both ports end up grabbed in the same modem. How
> are these ports exposed by the kernel? Not via the usb subsystem it
> seems? MM needs a way to find a common "physical device sysfs path"
> for both ttys.
> 

Indeed, not via USB but via my mux driver sitting on a plain UART. The underlying real hardware port - i.e. the common physical path - is /dev/ttymxc2, or (if this is the correct type of path...) I believe it's  /sys/devices/soc0/soc/2100000.aips-bus/21ec000.serial/tty/ttymxc2
In terms of the mux driver itself, there's /sys/bus/platform/devices/linmux/  whose 'driver' symlink is to /sys/bus/platform/drivers/LinMux


Early on in working with MM, I found I 'needed' to do some modifications to get the Cinterion plugin used. Albeit, I might not have done this is a good way - might have done it in a poor way that's now causing a problem with dual ports (?)

diff -Nu a/src/mm-base-manager.c b/src/mm-base-manager.c
--- a/src/mm-base-manager.c	2017-01-17 09:20:13.872328767 +0000
+++ b/src/mm-base-manager.c	2017-01-17 09:24:27.952329995 +0000
@@ -194,6 +194,9 @@
     name = g_udev_device_get_name (child);
     if (name && strncmp (name, "rfcomm", 6) == 0)
         return g_object_ref (child);
+    /* LinMux doesn't have a parent */
+    if (name && strncmp (name, "ttyMux", 6) == 0)
+        return g_object_ref (child);
 
     iter = g_object_ref (child);
     while (iter && i++ < 8) {

diff -Nur a/plugins/cinterion/mm-plugin-cinterion.c b/plugins/cinterion/mm-plugin-cinterion.c
--- a/plugins/cinterion/mm-plugin-cinterion.c	2016-11-15 10:07:40.000000000 +0000
+++ b/plugins/cinterion/mm-plugin-cinterion.c	2017-01-18 10:00:30.000000000 +0000
@@ -203,6 +203,7 @@
     static const gchar *subsystems[] = { "tty", "net", "usb", NULL };
     static const gchar *vendor_strings[] = { "cinterion", "siemens", NULL };
     static const guint16 vendor_ids[] = { 0x1e2d, 0x0681, 0 };
+    static const gchar *drivers[] = { "linmux", NULL };
     static const MMAsyncMethod custom_init = {
         .async  = G_CALLBACK (cinterion_custom_init),
         .finish = G_CALLBACK (cinterion_custom_init_finish),
@@ -214,6 +215,7 @@
                       MM_PLUGIN_ALLOWED_SUBSYSTEMS,     subsystems,
                       MM_PLUGIN_ALLOWED_VENDOR_STRINGS, vendor_strings,
                       MM_PLUGIN_ALLOWED_VENDOR_IDS,     vendor_ids,
+                      MM_PLUGIN_ALLOWED_DRIVERS,        drivers,
                       MM_PLUGIN_ALLOWED_AT,             TRUE,
                       MM_PLUGIN_ALLOWED_QMI,            TRUE,
                       MM_PLUGIN_CUSTOM_INIT,            &custom_init,
diff -Nur a/src/mm-plugin.c b/src/mm-plugin.c
--- a/src/mm-plugin.c	2016-11-15 10:07:40.000000000 +0000
+++ b/src/mm-plugin.c	2017-01-18 11:05:16.553578652 +0000
@@ -200,6 +200,7 @@
     gboolean product_filtered = FALSE;
     gboolean vendor_filtered = FALSE;
     guint i;
+    gboolean force_cinterion = FALSE;
 
     *need_vendor_probing = FALSE;
     *need_product_probing = FALSE;
@@ -230,12 +231,19 @@
         !self->priv->mbim) {
         static const gchar *virtual_drivers [] = { "virtual", NULL };
         const gchar **drivers;
+        static const gchar *linmux_drivers [] = { "linmux", NULL };
 
         /* Detect any modems accessible through the list of virtual ports */
         drivers = (is_virtual_port (g_udev_device_get_name (port)) ?
                    virtual_drivers :
                    mm_device_get_drivers (device));
 
+        force_cinterion = g_udev_device_get_property_as_boolean (port, "ID_MM_FORCE_CINT"); // my own custom var for udev rule
+        if (force_cinterion)
+        {
+            drivers = linmux_drivers;
+        }
+
         /* If error retrieving driver: unsupported */
         if (!drivers) {
             mm_dbg ("(%s) [%s] filtered as couldn't retrieve drivers",


More information about the ModemManager-devel mailing list