diff options
author | Dan Williams <dcbw@redhat.com> | 2013-02-05 20:17:13 -0600 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2013-02-06 11:57:00 -0600 |
commit | 8253d6f9de7b086a22a564180986b46fda35556b (patch) | |
tree | 013cf6f2869eef7d5f94dcf71bbc1860b68efe21 | |
parent | 74e94e624da0c86561436029922654bff0bf8884 (diff) |
broadband-modem-novatel: use ERI subsystem information to better determine roaming
We use the Icon ID here because a value of 1 *always* means not roaming,
while the other values don't appear to be consistent. For example,
an ERI value of "0" is supposed to mean roaming according to the
standards, but the Novatel devices appear to use 0 to mean home.
Since we're not sure, don't depend on the ERI value itself, just
depend on the Icon ID, where we know for sure that 1 means "home".
-rw-r--r-- | plugins/novatel/mm-broadband-modem-novatel.c | 116 |
1 files changed, 73 insertions, 43 deletions
diff --git a/plugins/novatel/mm-broadband-modem-novatel.c b/plugins/novatel/mm-broadband-modem-novatel.c index f560712a..1b25d839 100644 --- a/plugins/novatel/mm-broadband-modem-novatel.c +++ b/plugins/novatel/mm-broadband-modem-novatel.c @@ -617,46 +617,76 @@ modem_cdma_get_detailed_registration_state_finish (MMIfaceModemCdma *self, } static void -parse_modem_snapshot (DetailedRegistrationStateContext *ctx, - QcdmResult *result) +parse_modem_eri (DetailedRegistrationStateContext *ctx, QcdmResult *result) { MMModemCdmaRegistrationState new_state; - guint8 eri = 0; - - /* Roaming? */ - if (qcdm_result_get_u8 (result, QCDM_CMD_NW_SUBSYS_MODEM_SNAPSHOT_CDMA_ITEM_ERI, &eri) == 0) { - gchar *str; - gboolean roaming = FALSE; - - str = g_strdup_printf ("%u", eri); - if (mm_cdma_parse_eri (str, &roaming, NULL, NULL)) { - new_state = roaming ? MM_MODEM_CDMA_REGISTRATION_STATE_HOME : MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING; - if (ctx->state.detailed_cdma1x_state != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) - ctx->state.detailed_cdma1x_state = new_state; - if (ctx->state.detailed_evdo_state != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) - ctx->state.detailed_evdo_state = new_state; - } - g_free (str); - } + guint8 indicator_id = 0, icon_id = 0, icon_mode = 0; + + qcdm_result_get_u8 (result, QCDM_CMD_NW_SUBSYS_ERI_ITEM_INDICATOR_ID, &indicator_id); + qcdm_result_get_u8 (result, QCDM_CMD_NW_SUBSYS_ERI_ITEM_ICON_ID, &icon_id); + qcdm_result_get_u8 (result, QCDM_CMD_NW_SUBSYS_ERI_ITEM_ICON_MODE, &icon_mode); + + /* We use the "Icon ID" (also called the "Icon Index") because if it is 1, + * the device is never roaming. Any operator-defined IDs (greater than 2) + * may or may not be roaming, but that's operator-defined and we don't + * know anything about them. + * + * Indicator ID: + * 0 appears to be "not roaming", contrary to standard ERI values + * >= 1 appears to be the actual ERI value, which may or may not be + * roaming depending on the operator's custom ERI list + * + * Icon ID: + * 0 = roaming indicator on + * 1 = roaming indicator off + * 2 = roaming indicator flash + * + * Icon Mode: + * 0 = normal + * 1 = flash (only used with Icon ID >= 2) + * + * Roaming example: + * Roam: 160 + * Indicator ID: 160 + * Icon ID: 3 + * Icon Mode: 0 + * Call Prompt: 1 + * + * Home example: + * Roam: 0 + * Indicator ID: 0 + * Icon ID: 1 + * Icon Mode: 0 + * Call Prompt: 1 + */ + if (icon_id == 1) + new_state = MM_MODEM_CDMA_REGISTRATION_STATE_HOME; + else + new_state = MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING; + + if (ctx->state.detailed_cdma1x_state != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) + ctx->state.detailed_cdma1x_state = new_state; + if (ctx->state.detailed_evdo_state != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) + ctx->state.detailed_evdo_state = new_state; } static void -reg_nwsnap_6500_cb (MMQcdmSerialPort *port, - GByteArray *response, - GError *error, - gpointer user_data) +reg_eri_6500_cb (MMQcdmSerialPort *port, + GByteArray *response, + GError *error, + gpointer user_data) { DetailedRegistrationStateContext *ctx = user_data; if (error) { /* Just ignore the error and complete with the input info */ - mm_dbg ("Couldn't run QCDM MSM6500 snapshot: '%s'", error->message); + mm_dbg ("Couldn't run QCDM MSM6500 ERI: '%s'", error->message); } else { QcdmResult *result; - result = qcdm_cmd_nw_subsys_modem_snapshot_cdma_result ((const gchar *) response->data, response->len, NULL); + result = qcdm_cmd_nw_subsys_eri_result ((const gchar *) response->data, response->len, NULL); if (result) { - parse_modem_snapshot (ctx, result); + parse_modem_eri (ctx, result); qcdm_result_unref (result); } } @@ -667,31 +697,31 @@ reg_nwsnap_6500_cb (MMQcdmSerialPort *port, } static void -reg_nwsnap_6800_cb (MMQcdmSerialPort *port, - GByteArray *response, - GError *error, - gpointer user_data) +reg_eri_6800_cb (MMQcdmSerialPort *port, + GByteArray *response, + GError *error, + gpointer user_data) { DetailedRegistrationStateContext *ctx = user_data; if (error) { /* Just ignore the error and complete with the input info */ - mm_dbg ("Couldn't run QCDM MSM6800 snapshot: '%s'", error->message); + mm_dbg ("Couldn't run QCDM MSM6800 ERI: '%s'", error->message); } else { QcdmResult *result; - GByteArray *nwsnap; + GByteArray *nweri; /* Parse the response */ - result = qcdm_cmd_nw_subsys_modem_snapshot_cdma_result ((const gchar *) response->data, response->len, NULL); + result = qcdm_cmd_nw_subsys_eri_result ((const gchar *) response->data, response->len, NULL); if (result) { - parse_modem_snapshot (ctx, result); + parse_modem_eri (ctx, result); qcdm_result_unref (result); } else { /* Try for MSM6500 */ - nwsnap = g_byte_array_sized_new (25); - nwsnap->len = qcdm_cmd_nw_subsys_modem_snapshot_cdma_new ((char *) nwsnap->data, 25, QCDM_NW_CHIPSET_6500); - g_assert (nwsnap->len); - mm_qcdm_serial_port_queue_command (port, nwsnap, 3, NULL, reg_nwsnap_6500_cb, ctx); + nweri = g_byte_array_sized_new (25); + nweri->len = qcdm_cmd_nw_subsys_eri_new ((char *) nweri->data, 25, QCDM_NW_CHIPSET_6500); + g_assert (nweri->len); + mm_qcdm_serial_port_queue_command (port, nweri, 3, NULL, reg_eri_6500_cb, ctx); return; } } @@ -709,7 +739,7 @@ modem_cdma_get_detailed_registration_state (MMIfaceModemCdma *self, gpointer user_data) { DetailedRegistrationStateContext *ctx; - GByteArray *nwsnap; + GByteArray *nweri; MMQcdmSerialPort *port; /* Setup context */ @@ -725,10 +755,10 @@ modem_cdma_get_detailed_registration_state (MMIfaceModemCdma *self, port = mm_base_modem_peek_port_qcdm (MM_BASE_MODEM (self)); /* Try MSM6800 first since newer cards use that */ - nwsnap = g_byte_array_sized_new (25); - nwsnap->len = qcdm_cmd_nw_subsys_modem_snapshot_cdma_new ((char *) nwsnap->data, 25, QCDM_NW_CHIPSET_6800); - g_assert (nwsnap->len); - mm_qcdm_serial_port_queue_command (port, nwsnap, 3, NULL, reg_nwsnap_6800_cb, ctx); + nweri = g_byte_array_sized_new (25); + nweri->len = qcdm_cmd_nw_subsys_eri_new ((char *) nweri->data, 25, QCDM_NW_CHIPSET_6800); + g_assert (nweri->len); + mm_qcdm_serial_port_queue_command (port, nweri, 3, NULL, reg_eri_6800_cb, ctx); } /*****************************************************************************/ |