aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2009-12-11 09:30:51 -0800
committerDan Williams <dcbw@redhat.com>2009-12-11 09:30:51 -0800
commit3d852435c6032cdae09659e103561a0ecac62b7e (patch)
tree584edfaa1aa6cd080a81174cd1431de09f446cb2
parent07114d4f43c6e724d22294108b1e73785e7aab2a (diff)
cdma: accept SID 0 in some cases
Most AT command references allow modems to report SID 0, even though SID 0 is not a valid SID and is not assigned to any CDMA network. Some Sierra 5725 cards have been seen to report valid class and band from the +CSS response but a SID 0. Accept SID 0 when at least one other element of the +CSS response indicates that the modem has service. Otherwise, report "no service" as before.
-rw-r--r--src/mm-generic-cdma.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/mm-generic-cdma.c b/src/mm-generic-cdma.c
index 0e99ec77..9696bd62 100644
--- a/src/mm-generic-cdma.c
+++ b/src/mm-generic-cdma.c
@@ -904,7 +904,7 @@ normalize_band (const char *long_band, int *out_class)
}
static int
-normalize_sid (const char *sid)
+convert_sid (const char *sid)
{
long int tmp_sid;
@@ -942,7 +942,12 @@ serving_system_done (MMSerialPort *port,
num = sscanf (reply, "? , %d", &sid);
if (num == 1) {
- /* UTStarcom and Huawei modems that use IS-707-A format */
+ /* UTStarcom and Huawei modems that use IS-707-A format; note that
+ * this format obviously doesn't have other indicators like band and
+ * class and thus SID 0 will be reported as "no service" (see below).
+ */
+ class = 0;
+ band = 'Z';
success = TRUE;
} else {
GRegex *r;
@@ -976,7 +981,7 @@ serving_system_done (MMSerialPort *port,
/* sid */
str = g_match_info_fetch (match_info, 3);
- sid = normalize_sid (str);
+ sid = convert_sid (str);
g_free (str);
success = TRUE;
@@ -987,11 +992,28 @@ serving_system_done (MMSerialPort *port,
}
if (success) {
- /* 99999 means unknown/no service */
+ gboolean class_ok = FALSE, band_ok = FALSE;
+
+ /* Normalize the SID */
if (sid < 0 || sid > 32767)
sid = 99999;
- if (sid == 0 || sid == 99999) {
+ if (class == 1 || class == 2)
+ class_ok = TRUE;
+ if (band != 'Z')
+ band_ok = TRUE;
+
+ /* Return 'no service' if none of the elements of the +CSS response
+ * indicate that the modem has service. Note that this allows SID 0
+ * when at least one of the other elements indicates service.
+ * Normally we'd treat SID 0 as 'no service' but some modems
+ * (Sierra 5725) sometimes return SID 0 even when registered.
+ */
+ if (sid == 0 && !class_ok && !band_ok)
+ sid = 99999;
+
+ /* 99999 means unknown/no service */
+ if (sid == 99999) {
/* NOTE: update reg_state_css_response() if this error changes */
info->error = g_error_new_literal (MM_MOBILE_ERROR,
MM_MOBILE_ERROR_NO_NETWORK,