diff options
Diffstat (limited to 'src/nm-manager.c')
-rw-r--r-- | src/nm-manager.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c index fe7c005061..5db7313631 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -1796,7 +1796,7 @@ factory_device_added_cb (NMDeviceFactory *factory, { GError *error = NULL; - if (nm_device_realize (device, NULL, &error)) { + if (nm_device_realize (device, NULL, NULL, &error)) { add_device (NM_MANAGER (user_data), device); nm_device_setup_finish (device, NULL); } else { @@ -1848,22 +1848,29 @@ platform_link_added (NMManager *self, device = find_device_by_iface (self, plink->name); if (device) { - if (!nm_device_is_real (device)) { - if (nm_device_realize (device, plink, &error)) - nm_device_setup_finish (device, plink); - else { - nm_log_warn (LOGD_DEVICE, "(%s): %s", plink->name, error->message); - g_clear_error (&error); - remove_device (self, device, FALSE, FALSE); - } + gboolean compatible = FALSE; + + if (nm_device_is_real (device)) return; - } else if (!nm_device_realize (device, plink, &error)) { - nm_log_warn (LOGD_HW, "%s: factory failed to create device: %s", - plink->name, error->message); - g_clear_error (&error); + + if (nm_device_realize (device, plink, &compatible, &error)) { + /* Success */ + nm_device_setup_finish (device, plink); return; } - return; + + nm_log_warn (LOGD_DEVICE, "(%s): %s", plink->name, error->message); + remove_device (self, device, FALSE, FALSE); + g_clear_error (&error); + + if (compatible) { + /* Device compatible with platform link, but some other fatal error + * happened during realization. + */ + return; + } + + /* Fall through and create new compatible device for the link */ } /* Try registered device factories */ @@ -1902,7 +1909,7 @@ platform_link_added (NMManager *self, if (device) { if (nm_plugin_missing) nm_device_set_nm_plugin_missing (device, TRUE); - if (nm_device_realize (device, plink, &error)) { + if (nm_device_realize (device, plink, NULL, &error)) { add_device (self, device); nm_device_setup_finish (device, plink); } else { |