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:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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",
|
||||
{
|
||||
|
Reference in New Issue
Block a user