summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2019-10-16 11:02:28 +0200
committerAleksander Morgado <aleksander@aleksander.es>2019-10-30 10:52:24 +0100
commit9c3b70bea98cb5fbae5a3854908f11830d24d5d9 (patch)
treea379ae9ddf6d446f9b9f8694f20e7955e7074ec0
parenta69de4117cdfe302cba05712452d0d498c97ffd6 (diff)
downloadModemManager-9c3b70bea98cb5fbae5a3854908f11830d24d5d9.tar.gz
x22x: ignore unhandled URCs in the Alcatel X602D
(cherry picked from commit 407cfa0cd79d28a4b7286f4726f78744c5b04fb3)
-rw-r--r--plugins/x22x/mm-broadband-modem-x22x.c85
-rw-r--r--plugins/x22x/mm-broadband-modem-x22x.h2
2 files changed, 87 insertions, 0 deletions
diff --git a/plugins/x22x/mm-broadband-modem-x22x.c b/plugins/x22x/mm-broadband-modem-x22x.c
index ed9aec54b..0d7794ad4 100644
--- a/plugins/x22x/mm-broadband-modem-x22x.c
+++ b/plugins/x22x/mm-broadband-modem-x22x.c
@@ -38,6 +38,13 @@ static MMIfaceModem *iface_modem_parent;
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemX22x, mm_broadband_modem_x22x, MM_TYPE_BROADBAND_MODEM, 0,
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init))
+struct _MMBroadbandModemX22xPrivate {
+ GRegex *mode_regex;
+ GRegex *sysinfo_regex;
+ GRegex *specc_regex;
+ GRegex *sperror_regex;
+};
+
/*****************************************************************************/
/* Load supported modes (Modem interface) */
@@ -303,6 +310,52 @@ load_access_technologies (MMIfaceModem *self,
}
/*****************************************************************************/
+/* Setup ports (Broadband modem class) */
+
+static void
+set_ignored_unsolicited_events_handlers (MMBroadbandModemX22x *self)
+{
+ MMPortSerialAt *ports[2];
+ guint i;
+
+ ports[0] = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self));
+ ports[1] = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (self));
+
+ /* Enable/disable unsolicited events in given port */
+ for (i = 0; i < G_N_ELEMENTS (ports); i++) {
+ if (!ports[i])
+ continue;
+
+ mm_port_serial_at_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->mode_regex,
+ NULL, NULL, NULL);
+ mm_port_serial_at_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->sysinfo_regex,
+ NULL, NULL, NULL);
+ mm_port_serial_at_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->specc_regex,
+ NULL, NULL, NULL);
+ mm_port_serial_at_add_unsolicited_msg_handler (
+ ports[i],
+ self->priv->sperror_regex,
+ NULL, NULL, NULL);
+ }
+}
+
+static void
+setup_ports (MMBroadbandModem *self)
+{
+ /* Call parent's setup ports first always */
+ MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_x22x_parent_class)->setup_ports (self);
+
+ /* Unsolicited messages to always ignore */
+ set_ignored_unsolicited_events_handlers (MM_BROADBAND_MODEM_X22X (self));
+}
+
+/*****************************************************************************/
MMBroadbandModemX22x *
mm_broadband_modem_x22x_new (const gchar *device,
@@ -323,6 +376,30 @@ mm_broadband_modem_x22x_new (const gchar *device,
static void
mm_broadband_modem_x22x_init (MMBroadbandModemX22x *self)
{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+ MM_TYPE_BROADBAND_MODEM_X22X,
+ MMBroadbandModemX22xPrivate);
+
+ self->priv->mode_regex = g_regex_new ("\\r\\n\\^MODE:.+\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ self->priv->sysinfo_regex = g_regex_new ("\\r\\n\\^SYSINFO:.+\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ self->priv->specc_regex = g_regex_new ("\\r\\n\\+SPECC\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ self->priv->sperror_regex = g_regex_new ("\\r\\n\\+SPERROR:.+\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+}
+
+static void
+finalize (GObject *object)
+{
+ MMBroadbandModemX22x *self = MM_BROADBAND_MODEM_X22X (object);
+
+ g_regex_unref (self->priv->mode_regex);
+ g_regex_unref (self->priv->sysinfo_regex);
+ g_regex_unref (self->priv->specc_regex);
+ g_regex_unref (self->priv->sperror_regex);
+ G_OBJECT_CLASS (mm_broadband_modem_x22x_parent_class)->finalize (object);
}
static void
@@ -343,4 +420,12 @@ iface_modem_init (MMIfaceModem *iface)
static void
mm_broadband_modem_x22x_class_init (MMBroadbandModemX22xClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
+
+ g_type_class_add_private (object_class, sizeof (MMBroadbandModemX22xPrivate));
+
+ object_class->finalize = finalize;
+
+ broadband_modem_class->setup_ports = setup_ports;
}
diff --git a/plugins/x22x/mm-broadband-modem-x22x.h b/plugins/x22x/mm-broadband-modem-x22x.h
index f61e301da..74c2b48a9 100644
--- a/plugins/x22x/mm-broadband-modem-x22x.h
+++ b/plugins/x22x/mm-broadband-modem-x22x.h
@@ -29,9 +29,11 @@
typedef struct _MMBroadbandModemX22x MMBroadbandModemX22x;
typedef struct _MMBroadbandModemX22xClass MMBroadbandModemX22xClass;
+typedef struct _MMBroadbandModemX22xPrivate MMBroadbandModemX22xPrivate;
struct _MMBroadbandModemX22x {
MMBroadbandModem parent;
+ MMBroadbandModemX22xPrivate *priv;
};
struct _MMBroadbandModemX22xClass{