aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-04-24 23:40:24 -0700
committerDan Williams <dcbw@redhat.com>2010-04-24 23:40:24 -0700
commitb9bb12a01e0fd0251475622cf2adc3ca04ba7bd0 (patch)
tree7e1a7252982af66ab5c579a222717d7a6fa47685
parent411051b1f37d16d8fa0866e7a1bee0a553029956 (diff)
core: flash failure on disconnect shouldn't be a hard error (rh #578280)
-rw-r--r--plugins/mm-modem-zte.c2
-rw-r--r--src/mm-errors.c1
-rw-r--r--src/mm-errors.h3
-rw-r--r--src/mm-generic-cdma.c6
-rw-r--r--src/mm-generic-gsm.c6
-rw-r--r--src/mm-plugin-base.c2
-rw-r--r--src/mm-serial-port.c18
-rw-r--r--src/mm-serial-port.h1
8 files changed, 26 insertions, 13 deletions
diff --git a/plugins/mm-modem-zte.c b/plugins/mm-modem-zte.c
index 909b88ed..52746ac1 100644
--- a/plugins/mm-modem-zte.c
+++ b/plugins/mm-modem-zte.c
@@ -406,7 +406,7 @@ do_enable (MMGenericGsm *modem, MMModemFn callback, gpointer user_data)
g_assert (primary);
info = mm_callback_info_new (MM_MODEM (modem), callback, user_data);
- mm_serial_port_flash (MM_SERIAL_PORT (primary), 100, enable_flash_done, info);
+ mm_serial_port_flash (MM_SERIAL_PORT (primary), 100, FALSE, enable_flash_done, info);
}
static void
diff --git a/src/mm-errors.c b/src/mm-errors.c
index c0ed608d..f3c16331 100644
--- a/src/mm-errors.c
+++ b/src/mm-errors.c
@@ -43,6 +43,7 @@ mm_serial_error_get_type (void)
ENUM_ENTRY (MM_SERIAL_SEND_FAILED, "SerialSendfailed"),
ENUM_ENTRY (MM_SERIAL_RESPONSE_TIMEOUT, "SerialResponseTimeout"),
ENUM_ENTRY (MM_SERIAL_OPEN_FAILED_NO_DEVICE, "SerialOpenFailedNoDevice"),
+ ENUM_ENTRY (MM_SERIAL_ERROR_FLASH_FAILED, "SerialFlashFailed"),
{ 0, 0, 0 }
};
diff --git a/src/mm-errors.h b/src/mm-errors.h
index 15ac773b..6da2993a 100644
--- a/src/mm-errors.h
+++ b/src/mm-errors.h
@@ -23,7 +23,8 @@ enum {
MM_SERIAL_OPEN_FAILED = 0,
MM_SERIAL_SEND_FAILED = 1,
MM_SERIAL_RESPONSE_TIMEOUT = 2,
- MM_SERIAL_OPEN_FAILED_NO_DEVICE = 3
+ MM_SERIAL_OPEN_FAILED_NO_DEVICE = 3,
+ MM_SERIAL_ERROR_FLASH_FAILED = 4,
};
#define MM_SERIAL_ERROR (mm_serial_error_quark ())
diff --git a/src/mm-generic-cdma.c b/src/mm-generic-cdma.c
index f73b434d..5cad9732 100644
--- a/src/mm-generic-cdma.c
+++ b/src/mm-generic-cdma.c
@@ -588,7 +588,7 @@ enable (MMModem *modem,
MM_MODEM_STATE_ENABLING,
MM_MODEM_STATE_REASON_NONE);
- mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 100, flash_done, info);
+ mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 100, FALSE, flash_done, info);
}
static void
@@ -681,7 +681,7 @@ disable (MMModem *modem,
MM_MODEM_STATE_REASON_NONE);
if (mm_port_get_connected (MM_PORT (priv->primary)))
- mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 1000, disable_flash_done, info);
+ mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 1000, TRUE, disable_flash_done, info);
else
disable_flash_done (MM_SERIAL_PORT (priv->primary), NULL, info);
}
@@ -776,7 +776,7 @@ disconnect (MMModem *modem,
NULL);
mm_modem_set_state (modem, MM_MODEM_STATE_DISCONNECTING, MM_MODEM_STATE_REASON_NONE);
- mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 1000, disconnect_flash_done, info);
+ mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 1000, TRUE, disconnect_flash_done, info);
}
static void
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c
index e5957b24..d7f72300 100644
--- a/src/mm-generic-gsm.c
+++ b/src/mm-generic-gsm.c
@@ -912,7 +912,7 @@ real_do_enable (MMGenericGsm *self, MMModemFn callback, gpointer user_data)
MMCallbackInfo *info;
info = mm_callback_info_new (MM_MODEM (self), callback, user_data);
- mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 100, enable_flash_done, info);
+ mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 100, FALSE, enable_flash_done, info);
}
static void
@@ -1072,7 +1072,7 @@ disable (MMModem *modem,
MM_MODEM_STATE_REASON_NONE);
if (mm_port_get_connected (MM_PORT (priv->primary)))
- mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 1000, disable_flash_done, info);
+ mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 1000, TRUE, disable_flash_done, info);
else
disable_flash_done (MM_SERIAL_PORT (priv->primary), NULL, info);
}
@@ -2195,7 +2195,7 @@ real_do_disconnect (MMGenericGsm *self,
MMCallbackInfo *info;
info = mm_callback_info_new (MM_MODEM (self), callback, user_data);
- mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 1000, disconnect_flash_done, info);
+ mm_serial_port_flash (MM_SERIAL_PORT (priv->primary), 1000, TRUE, disconnect_flash_done, info);
}
static void
diff --git a/src/mm-plugin-base.c b/src/mm-plugin-base.c
index 5bad7d99..ac8b0d5b 100644
--- a/src/mm-plugin-base.c
+++ b/src/mm-plugin-base.c
@@ -805,7 +805,7 @@ try_open (gpointer user_data)
g_debug ("(%s): probe requested by plugin '%s'",
g_udev_device_get_name (port),
mm_plugin_get_name (MM_PLUGIN (task_priv->plugin)));
- mm_serial_port_flash (MM_SERIAL_PORT (task_priv->probe_port), 100, flash_done, task);
+ mm_serial_port_flash (MM_SERIAL_PORT (task_priv->probe_port), 100, TRUE, flash_done, task);
}
return FALSE;
diff --git a/src/mm-serial-port.c b/src/mm-serial-port.c
index b5323670..a10b3ea8 100644
--- a/src/mm-serial-port.c
+++ b/src/mm-serial-port.c
@@ -958,8 +958,14 @@ flash_do (gpointer data)
priv->flash_id = 0;
- if (!set_speed (info->port, info->current_speed, &error))
- g_assert (error);
+ if (info->current_speed) {
+ if (!set_speed (info->port, info->current_speed, &error))
+ g_assert (error);
+ } else {
+ error = g_error_new_literal (MM_SERIAL_ERROR,
+ MM_SERIAL_ERROR_FLASH_FAILED,
+ "Failed to retrieve current speed");
+ }
info->callback (info->port, error, info->user_data);
g_clear_error (&error);
@@ -970,6 +976,7 @@ flash_do (gpointer data)
gboolean
mm_serial_port_flash (MMSerialPort *self,
guint32 flash_time,
+ gboolean ignore_errors,
MMSerialFlashFn callback,
gpointer user_data)
{
@@ -977,6 +984,7 @@ mm_serial_port_flash (MMSerialPort *self,
MMSerialPortPrivate *priv;
speed_t cur_speed = 0;
GError *error = NULL;
+ gboolean success;
g_return_val_if_fail (MM_IS_SERIAL_PORT (self), FALSE);
g_return_val_if_fail (callback != NULL, FALSE);
@@ -992,7 +1000,8 @@ mm_serial_port_flash (MMSerialPort *self,
return FALSE;
}
- if (!get_speed (self, &cur_speed, &error)) {
+ success = get_speed (self, &cur_speed, &error);
+ if (!success && !ignore_errors) {
callback (self, error, user_data);
g_error_free (error);
return FALSE;
@@ -1004,7 +1013,8 @@ mm_serial_port_flash (MMSerialPort *self,
info->callback = callback;
info->user_data = user_data;
- if (!set_speed (self, B0, &error)) {
+ success = set_speed (self, B0, &error);
+ if (!success && !ignore_errors) {
callback (self, error, user_data);
g_error_free (error);
return FALSE;
diff --git a/src/mm-serial-port.h b/src/mm-serial-port.h
index 85dda85c..4da2b23a 100644
--- a/src/mm-serial-port.h
+++ b/src/mm-serial-port.h
@@ -110,6 +110,7 @@ void mm_serial_port_close (MMSerialPort *self);
gboolean mm_serial_port_flash (MMSerialPort *self,
guint32 flash_time,
+ gboolean ignore_errors,
MMSerialFlashFn callback,
gpointer user_data);
void mm_serial_port_flash_cancel (MMSerialPort *self);