huawei: handle empty response to AT^SYSCFG=?

Some Huawei modems (e.g. E220) may give an empty response for AT^SYSCFG=?, even
if they do support the command. Handle this case by prividing a default fallback
format string when this happens.
This commit is contained in:
Aleksander Morgado
2013-11-11 01:12:21 +01:00
parent e81fdd07c3
commit fc42b2df8c
3 changed files with 52 additions and 2 deletions

View File

@@ -912,8 +912,19 @@ syscfg_test_ready (MMBroadbandModemHuawei *self,
GError *error = NULL;
response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
if (response)
self->priv->syscfg_supported_modes = mm_huawei_parse_syscfg_test (response, &error);
if (response) {
/* There are 2G+3G Huawei modems out there which support mode switching with
* AT^SYSCFG, but fail to provide a valid response for AT^SYSCFG=? (they just
* return an empty string). So handle that case by providing a default response
* string to get parsed. Ugly, ugly, blame Huawei.
*/
if (response[0])
self->priv->syscfg_supported_modes = mm_huawei_parse_syscfg_test (response, &error);
else {
self->priv->syscfg_supported_modes = mm_huawei_parse_syscfg_test (MM_HUAWEI_DEFAULT_SYSCFG_FMT, NULL);
g_assert (self->priv->syscfg_supported_modes != NULL);
}
}
if (self->priv->syscfg_supported_modes) {
MMModemModeCombination mode;

View File

@@ -73,6 +73,10 @@ const MMHuaweiPrefmodeCombination *mm_huawei_parse_prefmode_response (const gcha
/*****************************************************************************/
/* ^SYSCFG test parser */
/* This is the default string we use as fallback when the modem gives
* an empty response to AT^SYSCFG=? */
#define MM_HUAWEI_DEFAULT_SYSCFG_FMT "^SYSCFG:(2,13,14,16),(0-3),,,"
typedef struct {
guint mode;
guint acqorder;

View File

@@ -439,6 +439,41 @@ typedef struct {
} SyscfgTest;
static const SyscfgTest syscfg_tests[] = {
{
MM_HUAWEI_DEFAULT_SYSCFG_FMT,
{
{
.mode = 2,
.acqorder = 0,
.allowed = (MM_MODEM_MODE_3G | MM_MODEM_MODE_2G),
.preferred = MM_MODEM_MODE_NONE
},
{
.mode = 2,
.acqorder = 1,
.allowed = (MM_MODEM_MODE_3G | MM_MODEM_MODE_2G),
.preferred = MM_MODEM_MODE_2G
},
{
.mode = 2,
.acqorder = 2,
.allowed = (MM_MODEM_MODE_3G | MM_MODEM_MODE_2G),
.preferred = MM_MODEM_MODE_3G
},
{
.mode = 13,
.acqorder = 0,
.allowed = MM_MODEM_MODE_2G,
.preferred = MM_MODEM_MODE_NONE
},
{
.mode = 14,
.acqorder = 0,
.allowed = MM_MODEM_MODE_3G,
.preferred = MM_MODEM_MODE_NONE
}
}
},
{
"^SYSCFG:(2,13,14,16),(0-3),((400000,\"WCDMA2100\")),(0-2),(0-4)\r\n",
{