aboutsummaryrefslogtreecommitdiff
path: root/src/mm-broadband-modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mm-broadband-modem.c')
-rw-r--r--src/mm-broadband-modem.c81
1 files changed, 70 insertions, 11 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 7b34f78c..396ef974 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -750,16 +750,29 @@ modem_load_equipment_identifier_finish (MMIfaceModem *self,
GError **error)
{
GVariant *result;
- gchar *equip_id = NULL, *tmp;
+ gchar *equip_id = NULL, *esn = NULL, *meid = NULL, *imei = NULL;
result = mm_base_modem_at_sequence_finish (MM_BASE_MODEM (self), res, NULL, error);
if (result) {
equip_id = sanitize_info_reply (result, "GSN:");
- /* Some CDMA devices prefix the ESN with "0x" */
- if (strncmp (equip_id, "0x", 2) == 0 && strlen (equip_id) == 10) {
- tmp = g_strdup (equip_id + 2);
+
+ /* Modems put all sorts of things into the GSN response; sanitize it */
+ if (mm_parse_gsn (equip_id, &imei, &meid, &esn)) {
g_free (equip_id);
- equip_id = tmp;
+
+ if (imei)
+ equip_id = g_strdup (imei);
+ else if (meid)
+ equip_id = g_strdup (meid);
+ else if (esn)
+ equip_id = g_strdup (esn);
+ g_free (esn);
+ g_free (meid);
+ g_free (imei);
+
+ g_assert (equip_id);
+ } else {
+ /* Leave whatever the modem returned alone */
}
mm_dbg ("loaded equipment identifier: %s", equip_id);
}
@@ -2942,12 +2955,15 @@ modem_3gpp_load_imei_finish (MMIfaceModem3gpp *self,
GAsyncResult *res,
GError **error)
{
- gchar *imei;
+ const gchar *result;
+ gchar *imei = NULL;
- imei = g_strdup (mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error));
- if (!imei)
+ result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error);
+ if (!result)
return NULL;
+ result = mm_strip_tag (result, "+CGSN:");
+ mm_parse_gsn (result, &imei, NULL, NULL);
mm_dbg ("loaded IMEI: %s", imei);
return imei;
}
@@ -3084,6 +3100,8 @@ clck_test_ready (MMBaseModem *self,
return;
}
+ctx->facilities &= ~MM_MODEM_3GPP_FACILITY_PH_SIM;
+
/* Go on... */
get_next_facility_lock_status (ctx);
}
@@ -5888,12 +5906,15 @@ modem_cdma_load_esn_finish (MMIfaceModemCdma *self,
GAsyncResult *res,
GError **error)
{
- gchar *esn;
+ const gchar *result;
+ gchar *esn = NULL;
- esn = g_strdup (mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error));
- if (!esn)
+ result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error);
+ if (!result)
return NULL;
+ result = mm_strip_tag (result, "+GSN:");
+ mm_parse_gsn (result, NULL, NULL, &esn);
mm_dbg ("loaded ESN: %s", esn);
return esn;
}
@@ -5913,6 +5934,42 @@ modem_cdma_load_esn (MMIfaceModemCdma *self,
}
/*****************************************************************************/
+/* MEID loading (CDMA interface) */
+
+static gchar *
+modem_cdma_load_meid_finish (MMIfaceModemCdma *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ const gchar *result;
+ gchar *meid = NULL;
+
+ result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error);
+ if (!result)
+ return NULL;
+
+ result = mm_strip_tag (result, "+GSN:");
+ mm_parse_gsn (result, NULL, &meid, NULL);
+ mm_dbg ("loaded MEID: %s", meid);
+ return meid;
+}
+
+static void
+modem_cdma_load_meid (MMIfaceModemCdma *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ /* Some devices return both the MEID and the ESN in the +GSN response */
+ mm_dbg ("loading MEID...");
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "+GSN",
+ 3,
+ TRUE,
+ callback,
+ user_data);
+}
+
+/*****************************************************************************/
/* HDR state check (CDMA interface) */
typedef struct {
@@ -9278,6 +9335,8 @@ iface_modem_cdma_init (MMIfaceModemCdma *iface)
/* Initialization steps */
iface->load_esn = modem_cdma_load_esn;
iface->load_esn_finish = modem_cdma_load_esn_finish;
+ iface->load_meid = modem_cdma_load_meid;
+ iface->load_meid_finish = modem_cdma_load_meid_finish;
/* Registration check steps */
iface->setup_registration_checks = modem_cdma_setup_registration_checks;