diff options
Diffstat (limited to 'src/mm-manager.c')
-rw-r--r-- | src/mm-manager.c | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/src/mm-manager.c b/src/mm-manager.c index 5dc8bc87..23ef8e68 100644 --- a/src/mm-manager.c +++ b/src/mm-manager.c @@ -321,16 +321,22 @@ device_removed (MMManager *self, GUdevDevice *udev_device) { MMDevice *device; + const gchar *subsys; + const gchar *name; g_return_if_fail (udev_device != NULL); - if (!g_str_equal (g_udev_device_get_subsystem (udev_device), "usb")) { - /* Handle tty/net port removal */ + subsys = g_udev_device_get_subsystem (udev_device); + name = g_udev_device_get_name (udev_device); + + if (!g_str_equal (subsys, "usb") || + (name && g_str_has_prefix (name, "cdc-wdm"))) { + /* Handle tty/net/wdm port removal */ device = find_device_by_port (self, udev_device); if (device) { mm_info ("(%s/%s): released by modem %s", - g_udev_device_get_subsystem (udev_device), - g_udev_device_get_name (udev_device), + subsys, + name, g_udev_device_get_sysfs_path (mm_device_peek_udev_device (device))); mm_device_release_port (device, udev_device); @@ -372,22 +378,24 @@ handle_uevent (GUdevClient *client, gpointer user_data) { MMManager *self = MM_MANAGER (user_data); - const char *subsys; + const gchar *subsys; + const gchar *name; g_return_if_fail (action != NULL); /* A bit paranoid */ subsys = g_udev_device_get_subsystem (device); g_return_if_fail (subsys != NULL); - g_return_if_fail (!strcmp (subsys, "tty") || !strcmp (subsys, "net") || !strcmp (subsys, "usb")); + g_return_if_fail (g_str_equal (subsys, "tty") || g_str_equal (subsys, "net") || g_str_equal (subsys, "usb")); - /* We only care about tty/net devices when adding modem ports, + /* We only care about tty/net and usb/cdc-wdm devices when adding modem ports, * but for remove, also handle usb parent device remove events */ - if ( (!strcmp (action, "add") || !strcmp (action, "move") || !strcmp (action, "change")) - && (strcmp (subsys, "usb") != 0)) + name = g_udev_device_get_name (device); + if ( (g_str_equal (action, "add") || g_str_equal (action, "move") || g_str_equal (action, "change")) + && (!g_str_equal (subsys, "usb") || (name && g_str_has_prefix (name, "cdc-wdm")))) device_added (self, device); - else if (!strcmp (action, "remove")) + else if (g_str_equal (action, "remove")) device_removed (self, device); } @@ -415,6 +423,17 @@ mm_manager_start (MMManager *manager) } g_list_free (devices); + devices = g_udev_client_query_by_subsystem (manager->priv->udev, "usb"); + for (iter = devices; iter; iter = g_list_next (iter)) { + const gchar *name; + + name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data)); + if (name && g_str_has_prefix (name, "cdc-wdm")) + device_added (manager, G_UDEV_DEVICE (iter->data)); + g_object_unref (G_OBJECT (iter->data)); + } + g_list_free (devices); + mm_dbg ("Finished device scan..."); } |