From: Forest Bond <[email protected]>

Sierra Wireless CDMA devices have a single interface with multiple
ports.
---
 plugins/udevng.c |   43 +++++++++++++++++++++++++++++++++----------
 1 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/plugins/udevng.c b/plugins/udevng.c
index afb02ca..feef4cc 100644
--- a/plugins/udevng.c
+++ b/plugins/udevng.c
@@ -218,10 +218,28 @@ static gboolean setup_gobi(struct modem_info *modem)
 static gboolean setup_sierra(struct modem_info *modem)
 {
        const char *mdm = NULL, *app = NULL, *net = NULL, *diag = NULL;
+       gboolean multi_iface = FALSE;
+       char *last_iface = NULL;
        GSList *list;
 
        DBG("%s", modem->syspath);
 
+       /*
+        * DirectIP devices use multiple interfaces, but non-DirectIP
+        * (e.g. CDMA) devices have a single interface with multiple
+        * ports distinguished by the "port_number" sysfs attribute.
+        */
+
+       for (list = modem->devices; list; list = list->next) {
+               struct device_info *info = list->data;
+
+               if (last_iface != NULL && g_strcmp0(info->number, last_iface) 
!= 0) {
+                       multi_iface = TRUE;
+                       break;
+               }
+               last_iface = info->number;
+       }
+
        for (list = modem->devices; list; list = list->next) {
                struct device_info *info = list->data;
 
@@ -229,18 +247,23 @@ static gboolean setup_sierra(struct modem_info *modem)
                                                info->number, info->label);
 
                if (g_strcmp0(info->interface, "255/255/255") == 0) {
-                       if (g_strcmp0(info->number, "01") == 0)
-                               diag = info->devnode;
-                       if (g_strcmp0(info->number, "03") == 0)
-                               mdm = info->devnode;
-                       else if (g_strcmp0(info->number, "04") == 0)
-                               app = info->devnode;
-                       else if (g_strcmp0(info->number, "07") == 0)
-                               net = info->devnode;
+                       if (multi_iface) {
+                               if (g_strcmp0(info->number, "01") == 0)
+                                       diag = info->devnode;
+                               else if (g_strcmp0(info->number, "03") == 0)
+                                       mdm = info->devnode;
+                               else if (g_strcmp0(info->number, "04") == 0)
+                                       app = info->devnode;
+                               else if (g_strcmp0(info->number, "07") == 0)
+                                       net = info->devnode;
+                       } else {
+                               if (g_strcmp0(info->sysattr, "0") == 0)
+                                       mdm = info->devnode;
+                       }
                }
        }
 
-       if (mdm == NULL || net == NULL)
+       if (mdm == NULL || (multi_iface && net == NULL))
                return FALSE;
 
        DBG("modem=%s app=%s net=%s diag=%s", mdm, app, net, diag);
@@ -768,7 +791,7 @@ static struct {
        { "mbm",        setup_mbm,      "device/interface"      },
        { "hso",        setup_hso,      "hsotype"               },
        { "gobi",       setup_gobi      },
-       { "sierra",     setup_sierra    },
+       { "sierra",     setup_sierra,   "device/port_number"    },
        { "option",     setup_option    },
        { "huawei",     setup_huawei    },
        { "speedupcdma",setup_speedup   },
-- 
1.7.0.4
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to