aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-serial-port.c102
-rw-r--r--src/mm-serial-port.h4
2 files changed, 68 insertions, 38 deletions
diff --git a/src/mm-serial-port.c b/src/mm-serial-port.c
index 116eb611..00d35d5e 100644
--- a/src/mm-serial-port.c
+++ b/src/mm-serial-port.c
@@ -46,6 +46,7 @@ enum {
PROP_FD,
PROP_SPEW_CONTROL,
PROP_RTS_CTS,
+ PROP_FLASH_OK,
LAST_PROP
};
@@ -80,6 +81,7 @@ typedef struct {
guint64 send_delay;
gboolean spew_control;
gboolean rts_cts;
+ gboolean flash_ok;
guint queue_id;
guint watch_id;
@@ -1068,13 +1070,6 @@ mm_serial_port_queue_command_cached (MMSerialPort *self,
internal_queue_command (self, command, take_command, TRUE, timeout_seconds, callback, user_data);
}
-typedef struct {
- MMSerialPort *port;
- speed_t current_speed;
- MMSerialFlashFn callback;
- gpointer user_data;
-} FlashInfo;
-
static gboolean
get_speed (MMSerialPort *self, speed_t *speed, GError **error)
{
@@ -1154,6 +1149,13 @@ set_speed (MMSerialPort *self, speed_t speed, GError **error)
return TRUE;
}
+typedef struct {
+ MMSerialPort *port;
+ speed_t current_speed;
+ MMSerialFlashFn callback;
+ gpointer user_data;
+} FlashInfo;
+
static gboolean
flash_do (gpointer data)
{
@@ -1163,13 +1165,15 @@ flash_do (gpointer data)
priv->flash_id = 0;
- 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");
+ if (priv->flash_ok) {
+ 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);
@@ -1185,9 +1189,8 @@ mm_serial_port_flash (MMSerialPort *self,
MMSerialFlashFn callback,
gpointer user_data)
{
- FlashInfo *info;
+ FlashInfo *info = NULL;
MMSerialPortPrivate *priv;
- speed_t cur_speed = 0;
GError *error = NULL;
gboolean success;
@@ -1200,43 +1203,43 @@ mm_serial_port_flash (MMSerialPort *self,
error = g_error_new_literal (MM_SERIAL_ERROR,
MM_SERIAL_ERROR_NOT_OPEN,
"The serial port is not open.");
- callback (self, error, user_data);
- g_error_free (error);
- return FALSE;
+ goto error;
}
if (priv->flash_id > 0) {
error = g_error_new_literal (MM_MODEM_ERROR,
MM_MODEM_ERROR_OPERATION_IN_PROGRESS,
"Modem is already being flashed.");
- callback (self, error, user_data);
- g_error_free (error);
- return FALSE;
- }
-
- success = get_speed (self, &cur_speed, &error);
- if (!success && !ignore_errors) {
- callback (self, error, user_data);
- g_error_free (error);
- return FALSE;
+ goto error;
}
- g_clear_error (&error);
info = g_slice_new0 (FlashInfo);
info->port = self;
- info->current_speed = cur_speed;
info->callback = callback;
info->user_data = user_data;
- success = set_speed (self, B0, &error);
- if (!success && !ignore_errors) {
- callback (self, error, user_data);
- g_error_free (error);
- return FALSE;
- }
+ if (priv->flash_ok) {
+ /* Grab current speed so we can reset it after flashing */
+ success = get_speed (self, &info->current_speed, &error);
+ if (!success && !ignore_errors)
+ goto error;
+ g_clear_error (&error);
+
+ success = set_speed (self, B0, &error);
+ if (!success && !ignore_errors)
+ goto error;
+ priv->flash_id = g_timeout_add (flash_time, flash_do, info);
+ } else
+ priv->flash_id = g_idle_add (flash_do, info);
- priv->flash_id = g_timeout_add (flash_time, flash_do, info);
return TRUE;
+
+error:
+ callback (self, error, user_data);
+ g_clear_error (&error);
+ if (info)
+ g_slice_free (FlashInfo, info);
+ return FALSE;
}
void
@@ -1254,6 +1257,14 @@ mm_serial_port_flash_cancel (MMSerialPort *self)
}
}
+gboolean
+mm_serial_port_get_flash_ok (MMSerialPort *self)
+{
+ g_return_val_if_fail (MM_IS_SERIAL_PORT (self), TRUE);
+
+ return MM_SERIAL_PORT_GET_PRIVATE (self)->flash_ok;
+}
+
/*****************************************************************************/
MMSerialPort *
@@ -1357,6 +1368,9 @@ set_property (GObject *object, guint prop_id,
case PROP_RTS_CTS:
priv->rts_cts = g_value_get_boolean (value);
break;
+ case PROP_FLASH_OK:
+ priv->flash_ok = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1394,6 +1408,9 @@ get_property (GObject *object, guint prop_id,
case PROP_RTS_CTS:
g_value_set_boolean (value, priv->rts_cts);
break;
+ case PROP_FLASH_OK:
+ g_value_set_boolean (value, priv->flash_ok);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1512,6 +1529,15 @@ mm_serial_port_class_init (MMSerialPortClass *klass)
FALSE,
G_PARAM_READWRITE));
+ g_object_class_install_property
+ (object_class, PROP_FLASH_OK,
+ g_param_spec_boolean (MM_SERIAL_PORT_FLASH_OK,
+ "FlaskOk",
+ "Flashing the port (0 baud for a short period) "
+ "is allowed.",
+ TRUE,
+ G_PARAM_READWRITE));
+
/* Signals */
signals[BUFFER_FULL] =
g_signal_new ("buffer-full",
diff --git a/src/mm-serial-port.h b/src/mm-serial-port.h
index a9f34402..eb12cbbe 100644
--- a/src/mm-serial-port.h
+++ b/src/mm-serial-port.h
@@ -38,6 +38,7 @@
#define MM_SERIAL_PORT_RTS_CTS "rts-cts"
#define MM_SERIAL_PORT_FD "fd" /* Construct-only */
#define MM_SERIAL_PORT_SPEW_CONTROL "spew-control" /* Construct-only */
+#define MM_SERIAL_PORT_FLASH_OK "flash-ok" /* Construct-only */
typedef struct _MMSerialPort MMSerialPort;
typedef struct _MMSerialPortClass MMSerialPortClass;
@@ -123,8 +124,11 @@ gboolean mm_serial_port_flash (MMSerialPort *self,
gboolean ignore_errors,
MMSerialFlashFn callback,
gpointer user_data);
+
void mm_serial_port_flash_cancel (MMSerialPort *self);
+gboolean mm_serial_port_get_flash_ok (MMSerialPort *self);
+
void mm_serial_port_queue_command (MMSerialPort *self,
GByteArray *command,
gboolean take_command,