aboutsummaryrefslogtreecommitdiff
path: root/src/mm-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-manager.c')
-rw-r--r--src/mm-manager.c39
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...");
}