aboutsummaryrefslogtreecommitdiff
path: root/src/mm-plugin-base.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-plugin-base.c')
-rw-r--r--src/mm-plugin-base.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/mm-plugin-base.c b/src/mm-plugin-base.c
index 01fe9c5d..e4ebed6f 100644
--- a/src/mm-plugin-base.c
+++ b/src/mm-plugin-base.c
@@ -515,6 +515,11 @@ static const char *dq_strings[] = {
NULL
};
+static guint8 zerobuf[32] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
static void
probed_info_free (MMPluginBaseProbedInfo *info)
{
@@ -535,6 +540,13 @@ port_buffer_full (MMSerialPort *port, GByteArray *buffer, gpointer user_data)
size_t iter_len;
int i;
+ /* Some devices (observed on a ZTE branded "QUALCOMM INCORPORATED" model
+ * "154") spew NULLs from some ports.
+ */
+ if ( (buffer->len >= sizeof (zerobuf))
+ && (memcmp (buffer->data, zerobuf, sizeof (zerobuf)) == 0))
+ goto stop_probing;
+
/* Check for an immediate disqualification response. There are some
* ports (Option Icera-based chipsets have them, as do Qualcomm Gobi
* devices before their firmware is loaded) that just shouldn't be
@@ -551,15 +563,18 @@ port_buffer_full (MMSerialPort *port, GByteArray *buffer, gpointer user_data)
for (i = 0; i < buffer->len - iter_len; i++) {
if (!memcmp (&buffer->data[i], *iter, iter_len)) {
/* Immediately close the port and complete probing */
- priv->probed_caps = 0;
- priv->probed_vendor = NULL;
- priv->probed_product = NULL;
- mm_serial_port_close (MM_SERIAL_PORT (priv->probe_port));
- probe_complete (task);
- return;
+ goto stop_probing;
}
}
}
+ return;
+
+stop_probing:
+ priv->probed_caps = 0;
+ priv->probed_vendor = NULL;
+ priv->probed_product = NULL;
+ mm_serial_port_close (MM_SERIAL_PORT (priv->probe_port));
+ probe_complete (task);
}
static gboolean