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.
This commit is contained in:
Dan Williams
2009-12-11 09:30:51 -08:00
parent 07114d4f43
commit 3d852435c6

View File

@@ -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,