core: add 'hotplugged' flag to indicate if modem is newly plugged in
This patch adds a 'hotplugged' flag to MMBaseModem to indicate if a modem is newly plugged in. A plugin can use this information to determine if, for example, the modem needs to be soft reset using the ATZ command. Dan Williams <dcbw@redhat.com> contributed the idea of implementation.
This commit is contained in:

committed by
Aleksander Morgado

parent
2550cb20a9
commit
e75dba639f
@@ -67,6 +67,7 @@ struct _MMBaseModemPrivate {
|
||||
guint vendor_id;
|
||||
guint product_id;
|
||||
|
||||
gboolean hotplugged;
|
||||
gboolean valid;
|
||||
|
||||
guint max_timeouts;
|
||||
@@ -410,6 +411,23 @@ mm_base_modem_initialize (MMBaseModem *self,
|
||||
user_data);
|
||||
}
|
||||
|
||||
void
|
||||
mm_base_modem_set_hotplugged (MMBaseModem *self,
|
||||
gboolean hotplugged)
|
||||
{
|
||||
g_return_if_fail (MM_IS_BASE_MODEM (self));
|
||||
|
||||
self->priv->hotplugged = hotplugged;
|
||||
}
|
||||
|
||||
gboolean
|
||||
mm_base_modem_get_hotplugged (MMBaseModem *self)
|
||||
{
|
||||
g_return_val_if_fail (MM_IS_BASE_MODEM (self), FALSE);
|
||||
|
||||
return self->priv->hotplugged;
|
||||
}
|
||||
|
||||
void
|
||||
mm_base_modem_set_valid (MMBaseModem *self,
|
||||
gboolean new_valid)
|
||||
|
@@ -143,6 +143,10 @@ MMAtSerialPort *mm_base_modem_get_best_at_port (MMBaseModem *self, GError
|
||||
MMPort *mm_base_modem_get_best_data_port (MMBaseModem *self);
|
||||
GList *mm_base_modem_get_data_ports (MMBaseModem *self);
|
||||
|
||||
void mm_base_modem_set_hotplugged (MMBaseModem *self,
|
||||
gboolean hotplugged);
|
||||
gboolean mm_base_modem_get_hotplugged (MMBaseModem *self);
|
||||
|
||||
void mm_base_modem_set_valid (MMBaseModem *self,
|
||||
gboolean valid);
|
||||
gboolean mm_base_modem_get_valid (MMBaseModem *self);
|
||||
|
@@ -68,6 +68,9 @@ struct _MMDevicePrivate {
|
||||
|
||||
/* When exported, a reference to the object manager */
|
||||
GDBusObjectManagerServer *object_manager;
|
||||
|
||||
/* Whether the device was hot-plugged. */
|
||||
gboolean hotplugged;
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -593,14 +596,24 @@ mm_device_get_port_probe_list (MMDevice *self)
|
||||
return copy;
|
||||
}
|
||||
|
||||
gboolean
|
||||
mm_device_get_hotplugged (MMDevice *self)
|
||||
{
|
||||
return self->priv->hotplugged;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
MMDevice *
|
||||
mm_device_new (GUdevDevice *udev_device)
|
||||
mm_device_new (GUdevDevice *udev_device, gboolean hotplugged)
|
||||
{
|
||||
return MM_DEVICE (g_object_new (MM_TYPE_DEVICE,
|
||||
MM_DEVICE_UDEV_DEVICE, udev_device,
|
||||
NULL));
|
||||
MMDevice *device;
|
||||
|
||||
device = MM_DEVICE (g_object_new (MM_TYPE_DEVICE,
|
||||
MM_DEVICE_UDEV_DEVICE, udev_device,
|
||||
NULL));
|
||||
device->priv->hotplugged = hotplugged;
|
||||
return device;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -58,7 +58,7 @@ struct _MMDeviceClass {
|
||||
|
||||
GType mm_device_get_type (void);
|
||||
|
||||
MMDevice *mm_device_new (GUdevDevice *udev_device);
|
||||
MMDevice *mm_device_new (GUdevDevice *udev_device, gboolean hotplugged);
|
||||
|
||||
void mm_device_grab_port (MMDevice *self,
|
||||
GUdevDevice *udev_port);
|
||||
@@ -96,4 +96,6 @@ GList *mm_device_get_port_probe_list (MMDevice *self);
|
||||
|
||||
const gchar *mm_device_utils_get_port_driver (GUdevDevice *udev_port);
|
||||
|
||||
gboolean mm_device_get_hotplugged (MMDevice *self);
|
||||
|
||||
#endif /* MM_DEVICE_H */
|
||||
|
@@ -216,7 +216,8 @@ find_physical_device (GUdevDevice *child)
|
||||
|
||||
static void
|
||||
device_added (MMManager *manager,
|
||||
GUdevDevice *port)
|
||||
GUdevDevice *port,
|
||||
gboolean hotplugged)
|
||||
{
|
||||
MMDevice *device;
|
||||
const char *subsys, *name, *physdev_path, *physdev_subsys;
|
||||
@@ -292,7 +293,7 @@ device_added (MMManager *manager,
|
||||
FindDeviceSupportContext *ctx;
|
||||
|
||||
/* Keep the device listed in the Manager */
|
||||
device = mm_device_new (physdev);
|
||||
device = mm_device_new (physdev, hotplugged);
|
||||
g_hash_table_insert (manager->priv->devices,
|
||||
g_strdup (physdev_path),
|
||||
device);
|
||||
@@ -394,7 +395,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);
|
||||
device_added (self, device, TRUE);
|
||||
else if (g_str_equal (action, "remove"))
|
||||
device_removed (self, device);
|
||||
}
|
||||
@@ -411,14 +412,14 @@ mm_manager_start (MMManager *manager)
|
||||
|
||||
devices = g_udev_client_query_by_subsystem (manager->priv->udev, "tty");
|
||||
for (iter = devices; iter; iter = g_list_next (iter)) {
|
||||
device_added (manager, G_UDEV_DEVICE (iter->data));
|
||||
device_added (manager, G_UDEV_DEVICE (iter->data), FALSE);
|
||||
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)) {
|
||||
device_added (manager, G_UDEV_DEVICE (iter->data));
|
||||
device_added (manager, G_UDEV_DEVICE (iter->data), FALSE);
|
||||
g_object_unref (G_OBJECT (iter->data));
|
||||
}
|
||||
g_list_free (devices);
|
||||
@@ -429,7 +430,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"))
|
||||
device_added (manager, G_UDEV_DEVICE (iter->data));
|
||||
device_added (manager, G_UDEV_DEVICE (iter->data), FALSE);
|
||||
g_object_unref (G_OBJECT (iter->data));
|
||||
}
|
||||
g_list_free (devices);
|
||||
@@ -441,7 +442,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"))
|
||||
device_added (manager, G_UDEV_DEVICE (iter->data));
|
||||
device_added (manager, G_UDEV_DEVICE (iter->data), FALSE);
|
||||
g_object_unref (G_OBJECT (iter->data));
|
||||
}
|
||||
g_list_free (devices);
|
||||
|
@@ -802,6 +802,8 @@ mm_plugin_create_modem (MMPlugin *self,
|
||||
port_probes,
|
||||
error);
|
||||
if (modem) {
|
||||
mm_base_modem_set_hotplugged (modem, mm_device_get_hotplugged (device));
|
||||
|
||||
/* Grab each port */
|
||||
for (l = port_probes; l; l = g_list_next (l)) {
|
||||
GError *inner_error = NULL;
|
||||
|
Reference in New Issue
Block a user