diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-03-02 14:13:32 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-03-05 19:41:08 +0100 |
commit | 8450b7b2a39a6e1c9fda950dc3f821984c73c56b (patch) | |
tree | 07945756d370217e9174ffcebab602b44f1e56b9 | |
parent | 3678ae53788848d2e202d9afcc7f8eb9577fc427 (diff) |
core: don't automatically probe ports of USB<->serial adapters
We should not automatically probe ports marked as coming from USB to serial
adapters, as we're not sure that a modem is behind the adapter. Still, let the
user request a manual scan and have these devices probed in that case.
https://bugzilla.gnome.org/show_bug.cgi?id=647556
https://bugzilla.gnome.org/show_bug.cgi?id=691076
-rw-r--r-- | src/77-mm-usb-device-blacklist.rules | 6 | ||||
-rw-r--r-- | src/77-mm-usb-serial-adapters-greylist.rules | 22 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/mm-manager.c | 34 | ||||
-rw-r--r-- | src/mm-manager.h | 3 |
6 files changed, 50 insertions, 20 deletions
diff --git a/src/77-mm-usb-device-blacklist.rules b/src/77-mm-usb-device-blacklist.rules index 355bec37..e95464a5 100644 --- a/src/77-mm-usb-device-blacklist.rules +++ b/src/77-mm-usb-device-blacklist.rules @@ -62,12 +62,6 @@ ATTRS{idVendor}=="0592", ATTRS{idProduct}=="0002", ENV{ID_MM_DEVICE_IGNORE}="1" # that isn't blacklisted. ATTRS{idVendor}=="0830", ATTRS{idProduct}=="0061", ENV{ID_MM_DEVICE_IGNORE}="1" -# Belkin F5U183 Serial Adapter (unlikely to have a modem behind it) -ATTRS{idVendor}=="050d", ATTRS{idProduct}=="0103", ENV{ID_MM_DEVICE_IGNORE}="1" - -# ATEN Intl UC-232A (Prolific) -ATTRS{idVendor}=="0557", ATTRS{idProduct}=="2008", ENV{ID_MM_DEVICE_IGNORE}="1" - # GlobalScaleTechnologies SheevaPlug ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", ENV{ID_MM_DEVICE_IGNORE}="1" diff --git a/src/77-mm-usb-serial-adapters-greylist.rules b/src/77-mm-usb-serial-adapters-greylist.rules new file mode 100644 index 00000000..e9097209 --- /dev/null +++ b/src/77-mm-usb-serial-adapters-greylist.rules @@ -0,0 +1,22 @@ +# do not edit this file, it will be overwritten on update + +ACTION!="add|change", GOTO="mm_usb_serial_adapters_greylist_end" +SUBSYSTEM!="usb", GOTO="mm_usb_serial_adapters_greylist_end" +ENV{DEVTYPE}!="usb_device", GOTO="mm_usb_serial_adapters_greylist_end" + +# Belkin F5U183 Serial Adapter +ATTRS{idVendor}=="050d", ATTRS{idProduct}=="0103", ENV{ID_MM_DEVICE_MANUAL_SCAN_ONLY}="1" + +# FTDI-based serial adapters +# FTDI does USB to serial converter ICs; and it's very likely that they'll +# never do modems themselves, so it should be safe to add a rule only based +# on the vendor Id. +ATTRS{idVendor}=="0403", ENV{ID_MM_DEVICE_MANUAL_SCAN_ONLY}="1" + +# ATEN Intl UC-232A (Prolific) +ATTRS{idVendor}=="0557", ATTRS{idProduct}=="2008", ENV{ID_MM_DEVICE_MANUAL_SCAN_ONLY}="1" + +# Prolific USB to Serial adapter +ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", ENV{ID_MM_DEVICE_MANUAL_SCAN_ONLY}="1" + +LABEL="mm_usb_serial_adapters_greylist_end"
\ No newline at end of file diff --git a/src/Makefile.am b/src/Makefile.am index 0403b831..8df350b8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,6 +5,7 @@ udevrules_DATA = \ 77-mm-usb-device-blacklist.rules \ 77-mm-pcmcia-device-blacklist.rules \ 77-mm-platform-serial-whitelist.rules \ + 77-mm-usb-serial-adapters-greylist.rules \ 80-mm-candidate.rules noinst_LTLIBRARIES = libmodem-helpers.la libserial.la @@ -78,9 +78,9 @@ name_acquired_cb (GDBusConnection *connection, { mm_dbg ("Service name '%s' was acquired", name); - /* Launch scan for devices */ + /* Launch automatic scan for devices */ g_assert (manager); - mm_manager_start (manager); + mm_manager_start (manager, FALSE); } static void diff --git a/src/mm-manager.c b/src/mm-manager.c index edb6f294..dca384ec 100644 --- a/src/mm-manager.c +++ b/src/mm-manager.c @@ -217,7 +217,8 @@ find_physical_device (GUdevDevice *child) static void device_added (MMManager *manager, GUdevDevice *port, - gboolean hotplugged) + gboolean hotplugged, + gboolean manual_scan) { MMDevice *device; const char *subsys, *name, *physdev_path, *physdev_subsys; @@ -272,6 +273,13 @@ device_added (MMManager *manager, goto out; } + /* Is the device in the manual-only greylist? If so, return if this is an + * automatic scan. */ + if (!manual_scan && g_udev_device_get_property_as_boolean (physdev, "ID_MM_DEVICE_MANUAL_SCAN_ONLY")) { + mm_dbg ("(%s/%s): port probed only in manual scan", subsys, name); + goto out; + } + /* If the physdev is a 'platform' device that's not whitelisted, ignore it */ physdev_subsys = g_udev_device_get_subsystem (physdev); if ( physdev_subsys @@ -395,7 +403,7 @@ handle_uevent (GUdevClient *client, 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_has_prefix (subsys, "usb") || (name && g_str_has_prefix (name, "cdc-wdm")))) - device_added (self, device, TRUE); + device_added (self, device, TRUE, FALSE); else if (g_str_equal (action, "remove")) device_removed (self, device); } @@ -403,12 +411,13 @@ handle_uevent (GUdevClient *client, typedef struct { MMManager *self; GUdevDevice *device; + gboolean manual_scan; } StartDeviceAdded; static gboolean start_device_added_idle (StartDeviceAdded *ctx) { - device_added (ctx->self, ctx->device, FALSE); + device_added (ctx->self, ctx->device, FALSE, ctx->manual_scan); g_object_unref (ctx->self); g_object_unref (ctx->device); g_slice_free (StartDeviceAdded, ctx); @@ -417,36 +426,39 @@ start_device_added_idle (StartDeviceAdded *ctx) static void start_device_added (MMManager *self, - GUdevDevice *device) + GUdevDevice *device, + gboolean manual_scan) { StartDeviceAdded *ctx; ctx = g_slice_new (StartDeviceAdded); ctx->self = g_object_ref (self); ctx->device = g_object_ref (device); + ctx->manual_scan = manual_scan; g_idle_add ((GSourceFunc)start_device_added_idle, ctx); } void -mm_manager_start (MMManager *manager) +mm_manager_start (MMManager *manager, + gboolean manual_scan) { GList *devices, *iter; g_return_if_fail (manager != NULL); g_return_if_fail (MM_IS_MANAGER (manager)); - mm_dbg ("Starting device scan..."); + mm_dbg ("Starting %s device scan...", manual_scan ? "manual" : "automatic"); devices = g_udev_client_query_by_subsystem (manager->priv->udev, "tty"); for (iter = devices; iter; iter = g_list_next (iter)) { - start_device_added (manager, G_UDEV_DEVICE (iter->data)); + start_device_added (manager, G_UDEV_DEVICE (iter->data), manual_scan); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); devices = g_udev_client_query_by_subsystem (manager->priv->udev, "net"); for (iter = devices; iter; iter = g_list_next (iter)) { - start_device_added (manager, G_UDEV_DEVICE (iter->data)); + start_device_added (manager, G_UDEV_DEVICE (iter->data), manual_scan); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); @@ -457,7 +469,7 @@ mm_manager_start (MMManager *manager) name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data)); if (name && g_str_has_prefix (name, "cdc-wdm")) - start_device_added (manager, G_UDEV_DEVICE (iter->data)); + start_device_added (manager, G_UDEV_DEVICE (iter->data), manual_scan); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); @@ -469,7 +481,7 @@ mm_manager_start (MMManager *manager) name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data)); if (name && g_str_has_prefix (name, "cdc-wdm")) - start_device_added (manager, G_UDEV_DEVICE (iter->data)); + start_device_added (manager, G_UDEV_DEVICE (iter->data), manual_scan); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); @@ -629,7 +641,7 @@ scan_devices_auth_ready (MMAuthProvider *authp, g_dbus_method_invocation_take_error (ctx->invocation, error); else { /* Otherwise relaunch device scan */ - mm_manager_start (MM_MANAGER (ctx->self)); + mm_manager_start (MM_MANAGER (ctx->self), TRUE); mm_gdbus_org_freedesktop_modem_manager1_complete_scan_devices ( MM_GDBUS_ORG_FREEDESKTOP_MODEM_MANAGER1 (ctx->self), ctx->invocation); diff --git a/src/mm-manager.h b/src/mm-manager.h index a26c37d4..7f1a00ad 100644 --- a/src/mm-manager.h +++ b/src/mm-manager.h @@ -48,7 +48,8 @@ GType mm_manager_get_type (void); MMManager *mm_manager_new (GDBusConnection *bus, GError **error); -void mm_manager_start (MMManager *manager); +void mm_manager_start (MMManager *manager, + gboolean manual_scan); void mm_manager_shutdown (MMManager *manager); |