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;
|
GError *error = NULL;
|
||||||
|
|
||||||
response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
|
response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
|
||||||
if (response)
|
if (response) {
|
||||||
self->priv->syscfg_supported_modes = mm_huawei_parse_syscfg_test (response, &error);
|
/* 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) {
|
if (self->priv->syscfg_supported_modes) {
|
||||||
MMModemModeCombination mode;
|
MMModemModeCombination mode;
|
||||||
|
@@ -73,6 +73,10 @@ const MMHuaweiPrefmodeCombination *mm_huawei_parse_prefmode_response (const gcha
|
|||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* ^SYSCFG test parser */
|
/* ^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 {
|
typedef struct {
|
||||||
guint mode;
|
guint mode;
|
||||||
guint acqorder;
|
guint acqorder;
|
||||||
|
@@ -439,6 +439,41 @@ typedef struct {
|
|||||||
} SyscfgTest;
|
} SyscfgTest;
|
||||||
|
|
||||||
static const SyscfgTest syscfg_tests[] = {
|
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",
|
"^SYSCFG:(2,13,14,16),(0-3),((400000,\"WCDMA2100\")),(0-2),(0-4)\r\n",
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user