diff options
author | Dan Williams <dcbw@redhat.com> | 2008-10-27 02:19:57 +0000 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2008-10-27 02:19:57 +0000 |
commit | 494b3a662d6aa688dcfc14679327ffa8801a7a32 (patch) | |
tree | 25354c8b5fd046ac52d480d4991c17f231e7299b /src | |
parent | a7949a1230b189251c03dad763615d59bc02c1a8 (diff) | |
download | NetworkManager-494b3a662d6aa688dcfc14679327ffa8801a7a32.tar.gz |
2008-10-26 Dan Williams <dcbw@redhat.com>
Attempt to compensate for modems that don't enable full AT parsing before
the PIN has been entered.
* src/nm-gsm-device.c
- (init_modem): accept different init strings
- (init_done): try different init strings on failure
- (check_pin_done): on PIN success, do full modem init
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4222 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
Diffstat (limited to 'src')
-rw-r--r-- | src/nm-gsm-device.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/src/nm-gsm-device.c b/src/nm-gsm-device.c index 1a9cb0f0c0..e7fb448c02 100644 --- a/src/nm-gsm-device.c +++ b/src/nm-gsm-device.c @@ -29,6 +29,7 @@ typedef struct { guint state_to_disconnected_id; guint reg_tries; + guint init_tries; } NMGsmDevicePrivate; enum { @@ -49,6 +50,7 @@ static guint signals[LAST_SIGNAL] = { 0 }; static void enter_pin (NMGsmDevice *device, NMGsmSecret secret_type, gboolean retry); static void manual_registration (NMGsmDevice *device); static void automatic_registration (NMGsmDevice *device); +static void init_modem (NMSerialDevice *device, gpointer user_data); NMGsmDevice * nm_gsm_device_new (const char *udi, @@ -584,7 +586,7 @@ check_pin_done (NMSerialDevice *device, { switch (reply_index) { case 0: - power_up (NM_GSM_DEVICE (device)); + init_modem_full (NM_GSM_DEVICE (device)); break; case 1: enter_pin (NM_GSM_DEVICE (device), NM_GSM_SECRET_PIN, FALSE); @@ -622,8 +624,11 @@ init_done (NMSerialDevice *device, const char *reply, gpointer user_data) { + NMGsmDevicePrivate *priv = NM_GSM_DEVICE_GET_PRIVATE (device); + switch (reply_index) { case 0: + priv->init_tries = 0; check_pin (NM_GSM_DEVICE (device)); break; case -1: @@ -633,10 +638,23 @@ init_done (NMSerialDevice *device, NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED); break; default: - nm_warning ("Modem initialization failed"); - nm_device_state_changed (NM_DEVICE (device), - NM_DEVICE_STATE_FAILED, - NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED); + switch (priv->init_tries) { + case 0: + nm_warning ("Trying alternate modem initialization"); + init_modem (device, "ATZ E0 V1 &C1"); + break; + case 1: + nm_warning ("Trying second alternate modem initialization"); + init_modem (device, "AT&F E0 V1"); + break; + default: + nm_warning ("Modem initialization failed"); + nm_device_state_changed (NM_DEVICE (device), + NM_DEVICE_STATE_FAILED, + NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED); + break; + } + priv->init_tries++; return; } } @@ -645,8 +663,12 @@ static void init_modem (NMSerialDevice *device, gpointer user_data) { const char *responses[] = { "OK", "ERROR", "ERR", NULL }; + const char *init_string = user_data; - modem_wait_for_reply (NM_GSM_DEVICE (device), "ATZ E0 V1 X4 &C1 +FCLASS=0", 10, responses, responses, init_done, NULL); + if (!init_string) + init_string = "ATZ E0 V1 X4 &C1 +FCLASS=0"; + + modem_wait_for_reply (NM_GSM_DEVICE (device), init_string, 10, responses, responses, init_done, NULL); } static NMActStageReturn @@ -663,6 +685,8 @@ real_act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason) return NM_ACT_STAGE_RETURN_FAILURE; } + NM_GSM_DEVICE_GET_PRIVATE (device)->init_tries = 0; + id = nm_serial_device_flash (serial_device, 100, init_modem, NULL); if (!id) *reason = NM_DEVICE_STATE_REASON_UNKNOWN; |