[PATCH] [UPDATED] identify mbm modems by GUID



This updated version of the patch traverses the USB descriptors to find the MBM GUID. If someone could
try this patch with a SE MD300 or SE MD400 I would be grateful, as I've been told that the these devices should
use the same GUID.

Regards,
Jonas Sjöquist

---

diff --git a/plugins/77-mm-ericsson-mbm.rules b/plugins/77-mm-ericsson-mbm.rules
deleted file mode 100644
index 8804036..0000000
--- a/plugins/77-mm-ericsson-mbm.rules
+++ /dev/null
@@ -1,51 +0,0 @@
-# do not edit this file, it will be overwritten on update
-
-ACTION!="add|change", GOTO="mm_mbm_end"
-SUBSYSTEM!="usb", GOTO="mm_mbm_end"
-ENV{DEVTYPE}!="usb_device", GOTO="mm_mbm_end"
-
-# Ericsson F3507g
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1900", ENV{ID_MM_ERICSSON_MBM}="1"
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1902", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Ericsson F3607gw
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1904", ENV{ID_MM_ERICSSON_MBM}="1"
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1905", ENV{ID_MM_ERICSSON_MBM}="1"
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1906", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Ericsson F3307
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="190a", ENV{ID_MM_ERICSSON_MBM}="1"
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1909", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Ericsson C3607w
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1049", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Ericsson C3607w v2
-ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="190b", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Sony-Ericsson MD300
-ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="d0cf", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Sony-Ericsson MD400
-ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="d0e1", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Dell 5530 HSDPA
-ATTRS{idVendor}=="413c", ATTRS{idProduct}=="8147", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Dell F3607gw
-ATTRS{idVendor}=="413c", ATTRS{idProduct}=="8183", ENV{ID_MM_ERICSSON_MBM}="1"
-ATTRS{idVendor}=="413c", ATTRS{idProduct}=="8184", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Dell F3307
-ATTRS{idVendor}=="413c", ATTRS{idProduct}=="818b", ENV{ID_MM_ERICSSON_MBM}="1"
-ATTRS{idVendor}=="413c", ATTRS{idProduct}=="818c", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Toshiba
-ATTRS{idVendor}=="0930", ATTRS{idProduct}=="130b", ENV{ID_MM_ERICSSON_MBM}="1"
-
-# Toshiba F3607gw
-ATTRS{idVendor}=="0930", ATTRS{idProduct}=="130c", ENV{ID_MM_ERICSSON_MBM}="1"
-ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1311", ENV{ID_MM_ERICSSON_MBM}="1"
-
-LABEL="mm_mbm_end"
-
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 8192653..e302965 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -277,7 +277,6 @@ libmm_plugin_simtech_la_LDFLAGS = \
 
 udevrulesdir = $(UDEV_BASE_DIR)/rules.d
 udevrules_DATA = \
-	77-mm-ericsson-mbm.rules \
 	77-mm-zte-port-types.rules \
 	77-mm-longcheer-port-types.rules \
 	77-mm-simtech-port-types.rules
diff --git a/plugins/mm-plugin-mbm.c b/plugins/mm-plugin-mbm.c
index 5554d84..171c9cd 100644
--- a/plugins/mm-plugin-mbm.c
+++ b/plugins/mm-plugin-mbm.c
@@ -25,6 +25,9 @@
 #include "mm-plugin-mbm.h"
 #include "mm-modem-mbm.h"
 
+#include <fcntl.h>
+#include <unistd.h>
+
 G_DEFINE_TYPE (MMPluginMbm, mm_plugin_mbm, MM_TYPE_PLUGIN_BASE)
 
 int mm_plugin_major_version = MM_PLUGIN_MAJOR_VERSION;
@@ -57,6 +60,28 @@ probe_result (MMPluginBase *base,
     mm_plugin_base_supports_task_complete (task, get_level_for_capabilities (capabilities));
 }
 
+#define GUID_OFFSET 5
+#define MDLM_FUNC_DESC 0x12
+
+static int
+cmp_mbm_guid(unsigned char *desc, ssize_t size)
+{
+    unsigned char *buf = desc;
+    unsigned int i;
+
+    const char mbm_guid[16] = {
+            0xa3, 0x17, 0xa8, 0x8b, 0x04, 0x5e, 0x4f, 0x01,
+            0xa6, 0x07, 0xc0, 0xff, 0xcb, 0x7e, 0x39, 0x2a,
+    };
+
+    for (i=0;i<size;i++) {
+            if (buf[2] == MDLM_FUNC_DESC)
+                    return memcmp(&buf[GUID_OFFSET], mbm_guid, sizeof(mbm_guid));
+            buf += buf[0];
+    }
+    return 1;
+}
+
 static MMPluginSupportsResult
 supports_port (MMPluginBase *base,
                MMModem *existing,
@@ -67,7 +92,10 @@ supports_port (MMPluginBase *base,
     GUdevDevice *port, *physdev;
     guint32 cached = 0, level;
     const char *driver, *subsys, *physdev_path;
-    gboolean is_mbm;
+    char *desc_path;
+    unsigned char desc[4096];
+    int fd;
+    ssize_t size;
 
     /* Can't do anything with non-serial ports */
     port = mm_plugin_base_supports_task_get_port (task);
@@ -90,15 +118,28 @@ supports_port (MMPluginBase *base,
 
     /* Look up the port's physical device and see if this port is really an
      * 'mbm' modem, since we have no other way of telling.
+     * The 'mbm' modem is identified by the GUID in the MDLM descriptor.
      */
     physdev_path = mm_plugin_base_supports_task_get_physdev_path (task);
     physdev = g_udev_client_query_by_sysfs_path (client, physdev_path);
     g_assert (physdev);
 
-    is_mbm = g_udev_device_get_property_as_boolean (physdev, "ID_MM_ERICSSON_MBM");
     g_object_unref (client);
 
-    if (!is_mbm)
+    desc_path = g_strconcat(physdev_path,"/descriptors",NULL);
+
+    fd = open(desc_path, O_RDONLY);
+    g_free(desc_path);
+    if (fd < 0)
+            return MM_PLUGIN_SUPPORTS_PORT_UNSUPPORTED;
+
+    size = read(fd, desc, sizeof(desc));
+    close(fd);
+
+    if (size < 0)
+            return MM_PLUGIN_SUPPORTS_PORT_UNSUPPORTED;
+
+    if (cmp_mbm_guid(desc,size))
         return MM_PLUGIN_SUPPORTS_PORT_UNSUPPORTED;
 
     if (!strcmp (subsys, "net")) {
   


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]