aboutsummaryrefslogtreecommitdiff
path: root/src/mm-base-modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-base-modem.c')
-rw-r--r--src/mm-base-modem.c83
1 files changed, 56 insertions, 27 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c
index 7213852f..15469b5c 100644
--- a/src/mm-base-modem.c
+++ b/src/mm-base-modem.c
@@ -190,11 +190,13 @@ port_timed_out_cb (MMPort *port,
static MMPort *
base_modem_create_ignored_port (MMBaseModem *self,
+ MMPortType ptype,
const gchar *name)
{
return MM_PORT (g_object_new (MM_TYPE_PORT,
MM_PORT_DEVICE, name,
- MM_PORT_TYPE, MM_PORT_TYPE_IGNORED,
+ MM_PORT_GROUP, MM_PORT_GROUP_IGNORED,
+ MM_PORT_TYPE, ptype,
NULL));
}
@@ -326,6 +328,7 @@ base_modem_create_wwan_port (MMBaseModem *self,
return MM_PORT (g_object_new (MM_TYPE_PORT,
MM_PORT_DEVICE, name,
MM_PORT_SUBSYS, MM_PORT_SUBSYS_WWAN,
+ MM_PORT_GROUP, MM_PORT_GROUP_USED,
MM_PORT_TYPE, MM_PORT_TYPE_XMMRPC,
NULL));
@@ -343,6 +346,7 @@ static MMPort *
base_modem_internal_grab_port (MMBaseModem *self,
MMKernelDevice *kernel_device,
gboolean link_port,
+ MMPortGroup pgroup,
MMPortType ptype,
MMPortSerialAtFlag at_pflags,
GError **error)
@@ -377,8 +381,8 @@ base_modem_internal_grab_port (MMBaseModem *self,
/* Explicitly ignored ports, grab them but explicitly flag them as ignored
* right away, all the same way (i.e. regardless of subsystem). */
- if (ptype == MM_PORT_TYPE_IGNORED)
- port = base_modem_create_ignored_port (self, name);
+ if (pgroup == MM_PORT_GROUP_IGNORED)
+ port = base_modem_create_ignored_port (self, ptype, name);
else if (g_str_equal (subsys, "net"))
port = base_modem_create_net_port (self, name);
else if (g_str_equal (subsys, "tty"))
@@ -403,25 +407,27 @@ base_modem_internal_grab_port (MMBaseModem *self,
}
/* Setup consecutive ports and removal watchers in all control ports */
- if (MM_IS_PORT_SERIAL_AT (port)) {
- mm_obj_dbg (port, "port monitoring enabled in AT port");
- port_monitoring = TRUE;
- } else if (MM_IS_PORT_SERIAL_QCDM (port)) {
- mm_obj_dbg (port, "port monitoring enabled in QCDM port");
- port_monitoring = TRUE;
- }
+ if (pgroup == MM_PORT_GROUP_USED) {
+ if (MM_IS_PORT_SERIAL_AT (port)) {
+ mm_obj_dbg (port, "port monitoring enabled in AT port");
+ port_monitoring = TRUE;
+ } else if (MM_IS_PORT_SERIAL_QCDM (port)) {
+ mm_obj_dbg (port, "port monitoring enabled in QCDM port");
+ port_monitoring = TRUE;
+ }
#if defined WITH_QMI
- else if (MM_IS_PORT_QMI (port)) {
- mm_obj_dbg (port, "port monitoring enabled in QMI port");
- port_monitoring = TRUE;
- }
+ else if (MM_IS_PORT_QMI (port)) {
+ mm_obj_dbg (port, "port monitoring enabled in QMI port");
+ port_monitoring = TRUE;
+ }
#endif
#if defined WITH_MBIM
- else if (MM_IS_PORT_MBIM (port)) {
- mm_obj_dbg (port, "port monitoring enabled in MBIM port");
- port_monitoring = TRUE;
- }
+ else if (MM_IS_PORT_MBIM (port)) {
+ mm_obj_dbg (port, "port monitoring enabled in MBIM port");
+ port_monitoring = TRUE;
+ }
#endif
+ }
if (port_monitoring) {
if (self->priv->max_timeouts > 0)
@@ -487,13 +493,14 @@ base_modem_internal_grab_port (MMBaseModem *self,
gboolean
mm_base_modem_grab_port (MMBaseModem *self,
MMKernelDevice *kernel_device,
+ MMPortGroup pgroup,
MMPortType ptype,
MMPortSerialAtFlag at_pflags,
GError **error)
{
g_autoptr(GError) inner_error = NULL;
- if (!base_modem_internal_grab_port (self, kernel_device, FALSE, ptype, at_pflags, &inner_error)) {
+ if (!base_modem_internal_grab_port (self, kernel_device, FALSE, pgroup, ptype, at_pflags, &inner_error)) {
/* If the port was REQUIRED via udev tags and we failed to grab it, we will report
* a fatal error. */
if (mm_kernel_device_get_property_as_boolean (kernel_device, ID_MM_REQUIRED)) {
@@ -540,6 +547,7 @@ mm_base_modem_grab_link_port (MMBaseModem *self,
port = base_modem_internal_grab_port (self,
kernel_device,
TRUE,
+ MM_PORT_GROUP_USED,
MM_PORT_TYPE_NET,
MM_PORT_SERIAL_AT_FLAG_NONE,
error);
@@ -1264,25 +1272,28 @@ port_info_cmp (const MMModemPortInfo *a,
return g_strcmp0 (a->name, b->name);
}
-MMModemPortInfo *
-mm_base_modem_get_port_infos (MMBaseModem *self,
- guint *n_port_infos)
+static MMModemPortInfo *
+parse_port_infos (GHashTable *ports,
+ guint *n_port_infos,
+ MMPortGroup pgroup_filter)
{
GHashTableIter iter;
GArray *port_infos;
MMPort *port;
- if (!self->priv->ports) {
+ if (!ports) {
*n_port_infos = 0;
return NULL;
}
- *n_port_infos = g_hash_table_size (self->priv->ports);
- port_infos = g_array_sized_new (FALSE, FALSE, sizeof (MMModemPortInfo), *n_port_infos);
- g_hash_table_iter_init (&iter, self->priv->ports);
+ port_infos = g_array_new (FALSE, FALSE, sizeof (MMModemPortInfo));
+ g_hash_table_iter_init (&iter, ports);
while (g_hash_table_iter_next (&iter, NULL, (gpointer)&port)) {
MMModemPortInfo port_info;
+ if (mm_port_get_port_group (port) != pgroup_filter)
+ continue;
+
port_info.name = g_strdup (mm_port_get_device (port));
switch (mm_port_get_port_type (port)) {
case MM_PORT_TYPE_NET:
@@ -1321,11 +1332,25 @@ mm_base_modem_get_port_infos (MMBaseModem *self,
g_array_append_val (port_infos, port_info);
}
- g_assert (*n_port_infos == port_infos->len);
+ *n_port_infos = port_infos->len;
g_array_sort (port_infos, (GCompareFunc) port_info_cmp);
return (MMModemPortInfo *) g_array_free (port_infos, FALSE);
}
+MMModemPortInfo *
+mm_base_modem_get_port_infos (MMBaseModem *self,
+ guint *n_port_infos)
+{
+ return parse_port_infos (self->priv->ports, n_port_infos, MM_PORT_GROUP_USED);
+}
+
+MMModemPortInfo *
+mm_base_modem_get_ignored_port_infos (MMBaseModem *self,
+ guint *n_port_infos)
+{
+ return parse_port_infos (self->priv->ports, n_port_infos, MM_PORT_GROUP_IGNORED);
+}
+
static gint
port_cmp (MMPort *a,
MMPort *b)
@@ -1467,6 +1492,10 @@ mm_base_modem_organize_ports (MMBaseModem *self,
g_hash_table_iter_init (&iter, self->priv->ports);
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &candidate)) {
+ /* Skip ports that should not be used */
+ if (mm_port_get_port_group (candidate) != MM_PORT_GROUP_USED)
+ continue;
+
switch (mm_port_get_port_type (candidate)) {
case MM_PORT_TYPE_AT: