summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2016-06-15 22:39:49 -0700
committerAleksander Morgado <aleksander@aleksander.es>2016-07-07 19:50:23 +0200
commite851956e440231882d04a0484f90cef3f4e90324 (patch)
tree7a3a9bb24a10304d3b8ec408a78152bd09d2e6e5
parent0e472f26d64f0a29bd65872061f6863ef78a2104 (diff)
downloadModemManager-qmi-over-mbim.tar.gz
broadband-modem: run power up/down actions unconditionallyqmi-over-mbim
-rw-r--r--src/mm-broadband-modem-mbim.c5
-rw-r--r--src/mm-broadband-modem.c13
-rw-r--r--src/mm-iface-modem.c18
-rw-r--r--src/mm-iface-modem.h1
4 files changed, 36 insertions, 1 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 2711780e9..9c72d9f63 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -3129,6 +3129,11 @@ mm_broadband_modem_mbim_new (const gchar *device,
MM_BASE_MODEM_PLUGIN, plugin,
MM_BASE_MODEM_VENDOR_ID, vendor_id,
MM_BASE_MODEM_PRODUCT_ID, product_id,
+ /* We require power set operations always, even if the
+ * one reported by the modem is already the same one.
+ * This is so that we can apply the FCC auth unconditionally
+ * during power up. */
+ MM_IFACE_MODEM_FORCE_POWER, TRUE,
NULL);
}
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index e1fd7ca35..a8ac26a3a 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -112,6 +112,7 @@ enum {
PROP_MODEM_MESSAGING_SMS_DEFAULT_STORAGE,
PROP_MODEM_VOICE_CALL_LIST,
PROP_MODEM_SIMPLE_STATUS,
+ PROP_MODEM_FORCE_POWER,
PROP_LAST
};
@@ -141,6 +142,7 @@ struct _MMBroadbandModemPrivate {
guint modem_cind_max_signal_quality;
guint modem_cind_indicator_roaming;
guint modem_cind_indicator_service;
+ gboolean modem_force_power;
/*<--- Modem 3GPP interface --->*/
/* Properties */
@@ -10091,6 +10093,9 @@ set_property (GObject *object,
g_clear_object (&self->priv->modem_simple_status);
self->priv->modem_simple_status = g_value_dup_object (value);
break;
+ case PROP_MODEM_FORCE_POWER:
+ self->priv->modem_force_power = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -10193,6 +10198,9 @@ get_property (GObject *object,
case PROP_MODEM_SIMPLE_STATUS:
g_value_set_object (value, self->priv->modem_simple_status);
break;
+ case PROP_MODEM_FORCE_POWER:
+ g_value_set_boolean (value, self->priv->modem_force_power);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -10221,6 +10229,7 @@ mm_broadband_modem_init (MMBroadbandModem *self)
self->priv->modem_messaging_sms_default_storage = MM_SMS_STORAGE_UNKNOWN;
self->priv->current_sms_mem1_storage = MM_SMS_STORAGE_UNKNOWN;
self->priv->current_sms_mem2_storage = MM_SMS_STORAGE_UNKNOWN;
+ self->priv->modem_force_power = FALSE;
}
static void
@@ -10671,4 +10680,8 @@ mm_broadband_modem_class_init (MMBroadbandModemClass *klass)
g_object_class_override_property (object_class,
PROP_MODEM_SIMPLE_STATUS,
MM_IFACE_MODEM_SIMPLE_STATUS);
+
+ g_object_class_override_property (object_class,
+ PROP_MODEM_FORCE_POWER,
+ MM_IFACE_MODEM_FORCE_POWER);
}
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index 516ed78e2..dd19ba28d 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -3287,8 +3287,16 @@ modem_power_off_ready (MMIfaceModem *self,
static void
set_power_state (SetPowerStateContext *ctx)
{
+ gboolean force_power;
+
+ g_object_get (ctx->self,
+ MM_IFACE_MODEM_FORCE_POWER, &force_power,
+ NULL);
+
/* Already done if we're in the desired power state */
- if (ctx->previous_real_power_state == ctx->power_state) {
+ if (force_power)
+ mm_dbg ("Power operation forced by the plugin");
+ else if (ctx->previous_real_power_state == ctx->power_state) {
mm_dbg ("No need to change power state: already in '%s' power state",
mm_modem_power_state_get_string (ctx->power_state));
/* If the real and cached ones are different, set the real one */
@@ -5120,6 +5128,14 @@ iface_modem_init (gpointer g_iface)
MM_TYPE_BEARER_LIST,
G_PARAM_READWRITE));
+ g_object_interface_install_property
+ (g_iface,
+ g_param_spec_boolean (MM_IFACE_MODEM_FORCE_POWER,
+ "Force power",
+ "Force power set operation even if reported the same one",
+ FALSE,
+ G_PARAM_READWRITE));
+
initialized = TRUE;
}
diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h
index 74ea9f924..ab2f55d63 100644
--- a/src/mm-iface-modem.h
+++ b/src/mm-iface-modem.h
@@ -36,6 +36,7 @@
#define MM_IFACE_MODEM_STATE "iface-modem-state"
#define MM_IFACE_MODEM_SIM "iface-modem-sim"
#define MM_IFACE_MODEM_BEARER_LIST "iface-modem-bearer-list"
+#define MM_IFACE_MODEM_FORCE_POWER "iface-modem-force-power"
typedef struct _MMIfaceModem MMIfaceModem;