novatel-lte: handle $NWQMISTATUS responses for firmware 4.08
In firmware 4.08, the $NWQMISTATUS command returns different values for QMI state to indicate the current connection state. This patch modifies the code to handle $NWQMISTATUS responses in firmware 1.41 and 4.08.
This commit is contained in:

committed by
Aleksander Morgado

parent
7f105dc386
commit
8362171973
@@ -33,6 +33,7 @@
|
|||||||
#include "mm-modem-helpers.h"
|
#include "mm-modem-helpers.h"
|
||||||
|
|
||||||
#define CONNECTION_CHECK_TIMEOUT_SEC 5
|
#define CONNECTION_CHECK_TIMEOUT_SEC 5
|
||||||
|
#define QMISTATUS_TAG "$NWQMISTATUS:"
|
||||||
|
|
||||||
G_DEFINE_TYPE (MMBroadbandBearerNovatelLte, mm_broadband_bearer_novatel_lte, MM_TYPE_BROADBAND_BEARER);
|
G_DEFINE_TYPE (MMBroadbandBearerNovatelLte, mm_broadband_bearer_novatel_lte, MM_TYPE_BROADBAND_BEARER);
|
||||||
|
|
||||||
@@ -121,6 +122,22 @@ connect_3gpp_finish (MMBroadbandBearer *self,
|
|||||||
|
|
||||||
static gboolean connect_3gpp_qmistatus (DetailedConnectContext *ctx);
|
static gboolean connect_3gpp_qmistatus (DetailedConnectContext *ctx);
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
is_qmistatus_connected (const gchar *str)
|
||||||
|
{
|
||||||
|
str = mm_strip_tag (str, QMISTATUS_TAG);
|
||||||
|
|
||||||
|
return g_strrstr (str, "QMI State: CONNECTED") || g_strrstr (str, "QMI State: QMI_WDS_PKT_DATA_CONNECTED");
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
is_qmistatus_disconnected (const gchar *str)
|
||||||
|
{
|
||||||
|
str = mm_strip_tag (str, QMISTATUS_TAG);
|
||||||
|
|
||||||
|
return g_strrstr (str, "QMI State: DISCONNECTED") || g_strrstr (str, "QMI State: QMI_WDS_PKT_DATA_DISCONNECTED");
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
poll_connection_ready (MMBaseModem *modem,
|
poll_connection_ready (MMBaseModem *modem,
|
||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
@@ -136,8 +153,7 @@ poll_connection_ready (MMBaseModem *modem,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = mm_strip_tag (result, "$NWQMISTATUS:");
|
if (is_qmistatus_disconnected (result)) {
|
||||||
if (g_strrstr (result, "QMI State: DISCONNECTED")) {
|
|
||||||
mm_bearer_report_disconnection (MM_BEARER (bearer));
|
mm_bearer_report_disconnection (MM_BEARER (bearer));
|
||||||
g_source_remove (bearer->priv->connection_poller);
|
g_source_remove (bearer->priv->connection_poller);
|
||||||
bearer->priv->connection_poller = 0;
|
bearer->priv->connection_poller = 0;
|
||||||
@@ -182,8 +198,7 @@ connect_3gpp_qmistatus_ready (MMBaseModem *modem,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = mm_strip_tag (result, "$NWQMISTATUS:");
|
if (is_qmistatus_connected (result)) {
|
||||||
if (g_strrstr (result, "QMI State: CONNECTED")) {
|
|
||||||
MMBearerIpConfig *config;
|
MMBearerIpConfig *config;
|
||||||
|
|
||||||
mm_dbg("Connected");
|
mm_dbg("Connected");
|
||||||
@@ -372,8 +387,7 @@ disconnect_3gpp_status_complete (MMBaseModem *modem,
|
|||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = mm_strip_tag (result, "$NWQMISTATUS:");
|
if (result && is_qmistatus_disconnected (result))
|
||||||
if (result && g_strrstr (result, "QMI State: DISCONNECTED"))
|
|
||||||
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
|
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
|
||||||
else
|
else
|
||||||
g_simple_async_result_set_error (ctx->result,
|
g_simple_async_result_set_error (ctx->result,
|
||||||
|
Reference in New Issue
Block a user