broadband-modem-qmi: use only deprecated commands

The QMI protocol is updated frequently with new commands replacing and
improving some already existing ones, which get marked as deprecated.
Instead of initially try to cover the logic with both the old and the new
commands, we'll default to use only the old deprecated ones, which should be
supported also in the modems with newer services.

The supported already implemented for the new QMI commands is hidden behind a
`--with-newest-qmi-commands' configure switch.

Once the implementation is fully developed and tested using the deprecated
commands we can then focus in including the support for the new ones.
This commit is contained in:
Aleksander Morgado
2012-08-09 16:58:34 +02:00
parent 0886322cc4
commit 12246a8c60
2 changed files with 110 additions and 20 deletions

View File

@@ -170,6 +170,21 @@ case $with_tests in
;;
esac
dnl
dnl Newest QMI commands
dnl
AC_ARG_WITH(newest_qmi_commands, AS_HELP_STRING([--with-newest-qmi-commands], [Try to avoid deprecated QMI commands]))
AM_CONDITIONAL(WITH_NEWEST_QMI_COMMANDS, test "x$with_newest_qmi_commands" = "xyes")
case $with_newest_qmi_commands in
yes)
AC_DEFINE(WITH_NEWEST_QMI_COMMANDS, 1, [Define if we enable new QMI commands support])
with_newest_qmi_commands=yes
;;
*)
with_newest_qmi_commands=no
;;
esac
NM_COMPILER_WARNINGS
@@ -233,4 +248,5 @@ echo "
PPP-enabled tests: ${have_pppd_headers}
PolicyKit support: ${with_polkit}
Documentation: ${with_docs}
Newest QMI commands: ${with_newest_qmi_commands}
"

View File

@@ -49,13 +49,17 @@ struct _MMBroadbandModemQmiPrivate {
gchar *esn;
/* Allowed mode related */
#if defined WITH_NEWEST_QMI_COMMANDS
gboolean has_mode_preference_in_system_selection_preference;
#endif /* WITH_NEWEST_QMI_COMMANDS */
/* 3GPP and CDMA share unsolicited events setup/enable/disable/cleanup */
gboolean unsolicited_events_enabled;
gboolean unsolicited_events_setup;
guint event_report_indication_id;
#if defined WITH_NEWEST_QMI_COMMANDS
guint signal_info_indication_id;
#endif /* WITH_NEWEST_QMI_COMMANDS */
/* 3GPP/CDMA registration helpers */
gchar *current_operator_id;
@@ -63,7 +67,9 @@ struct _MMBroadbandModemQmiPrivate {
gboolean unsolicited_registration_events_enabled;
gboolean unsolicited_registration_events_setup;
guint serving_system_indication_id;
#if defined WITH_NEWEST_QMI_COMMANDS
guint system_info_indication_id;
#endif /* WITH_NEWEST_QMI_COMMANDS */
};
/*****************************************************************************/
@@ -1243,6 +1249,8 @@ load_signal_quality_finish (MMIfaceModem *self,
G_SIMPLE_ASYNC_RESULT (res)));
}
#if defined WITH_NEWEST_QMI_COMMANDS
static gint8
signal_info_get_quality (MMBroadbandModemQmi *self,
QmiMessageNasGetSignalInfoOutput *output)
@@ -1320,6 +1328,8 @@ get_signal_info_ready (QmiClientNas *client,
load_signal_quality_context_complete_and_free (ctx);
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
static gint8
signal_strength_get_quality (MMBroadbandModemQmi *self,
QmiMessageNasGetSignalStrengthOutput *output)
@@ -1419,15 +1429,19 @@ load_signal_quality (MMIfaceModem *self,
mm_dbg ("loading signal quality...");
#if defined WITH_NEWEST_QMI_COMMANDS
/* Signal info introduced in NAS 1.8 */
if (qmi_client_check_version (ctx->client, 1, 8))
if (qmi_client_check_version (ctx->client, 1, 8)) {
qmi_client_nas_get_signal_info (QMI_CLIENT_NAS (ctx->client),
NULL,
10,
NULL,
(GAsyncReadyCallback)get_signal_info_ready,
ctx);
else
return;
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
qmi_client_nas_get_signal_strength (QMI_CLIENT_NAS (ctx->client),
NULL,
10,
@@ -1654,7 +1668,9 @@ typedef struct {
MMBroadbandModemQmi *self;
QmiClientNas *client;
GSimpleAsyncResult *result;
#if defined WITH_NEWEST_QMI_COMMANDS
gboolean run_get_system_selection_preference;
#endif /* WITH_NEWEST_QMI_COMMANDS */
gboolean run_get_technology_preference;
} LoadAllowedModesContext;
@@ -1776,6 +1792,8 @@ get_technology_preference_ready (QmiClientNas *client,
load_allowed_modes_context_complete_and_free (ctx);
}
#if defined WITH_NEWEST_QMI_COMMANDS
static MMModemMode
modem_mode_from_qmi_rat_mode_preference (QmiNasRatModePreference qmi)
{
@@ -1891,9 +1909,12 @@ allowed_modes_get_system_selection_preference_ready (QmiClientNas *client,
load_allowed_modes_context_complete_and_free (ctx);
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
static void
load_allowed_modes_context_step (LoadAllowedModesContext *ctx)
{
#if defined WITH_NEWEST_QMI_COMMANDS
if (ctx->run_get_system_selection_preference) {
qmi_client_nas_get_system_selection_preference (
ctx->client,
@@ -1904,6 +1925,7 @@ load_allowed_modes_context_step (LoadAllowedModesContext *ctx)
ctx);
return;
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
if (ctx->run_get_technology_preference) {
qmi_client_nas_get_technology_preference (
@@ -1945,12 +1967,15 @@ load_allowed_modes (MMIfaceModem *self,
user_data,
load_allowed_modes);
#if defined WITH_NEWEST_QMI_COMMANDS
/* System selection preference introduced in NAS 1.1
* TODO: Not sure when the System Selection Preference got the
* 'Mode Preference' TLV, so we'll need to handle the fallback. */
ctx->run_get_system_selection_preference =
(qmi_client_check_version (client, 1, 1) &&
ctx->self->priv->has_mode_preference_in_system_selection_preference);
#endif /* WITH_NEWEST_QMI_COMMANDS */
/* Technology preference introduced in NAS 1.7 */
ctx->run_get_technology_preference = qmi_client_check_version (client, 1, 7);
@@ -1966,7 +1991,9 @@ typedef struct {
GSimpleAsyncResult *result;
MMModemMode allowed;
MMModemMode preferred;
#if defined WITH_NEWEST_QMI_COMMANDS
gboolean run_set_system_selection_preference;
#endif /* WITH_NEWEST_QMI_COMMANDS */
gboolean run_set_technology_preference;
} SetAllowedModesContext;
@@ -2017,6 +2044,8 @@ set_technology_preference_ready (QmiClientNas *client,
set_allowed_modes_context_step (ctx);
}
#if defined WITH_NEWEST_QMI_COMMANDS
static void
allowed_modes_set_system_selection_preference_ready (QmiClientNas *client,
GAsyncResult *res,
@@ -2050,6 +2079,8 @@ allowed_modes_set_system_selection_preference_ready (QmiClientNas *client,
set_allowed_modes_context_step (ctx);
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
static QmiNasRatModePreference
modem_mode_to_qmi_radio_technology_preference (MMModemMode mode,
gboolean is_cdma)
@@ -2076,6 +2107,8 @@ modem_mode_to_qmi_radio_technology_preference (MMModemMode mode,
return pref;
}
#if defined WITH_NEWEST_QMI_COMMANDS
static QmiNasRatModePreference
modem_mode_to_qmi_rat_mode_preference (MMModemMode mode,
gboolean is_cdma,
@@ -2129,9 +2162,12 @@ modem_mode_to_qmi_gsm_wcdma_acquisition_order_preference (MMModemMode mode)
return MM_MODEM_MODE_NONE;
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
static void
set_allowed_modes_context_step (SetAllowedModesContext *ctx)
{
#if defined WITH_NEWEST_QMI_COMMANDS
if (ctx->run_set_system_selection_preference) {
QmiMessageNasSetSystemSelectionPreferenceInput *input;
QmiNasRatModePreference pref;
@@ -2175,6 +2211,7 @@ set_allowed_modes_context_step (SetAllowedModesContext *ctx)
qmi_message_nas_set_system_selection_preference_input_unref (input);
return;
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
if (ctx->run_set_technology_preference) {
QmiMessageNasSetTechnologyPreferenceInput *input;
@@ -2251,12 +2288,16 @@ set_allowed_modes (MMIfaceModem *self,
set_allowed_modes);
ctx->allowed = allowed;
ctx->preferred = preferred;
#if defined WITH_NEWEST_QMI_COMMANDS
/* System selection preference introduced in NAS 1.1
* TODO: Not sure when the System Selection Preference got the
* 'Mode Preference' TLV, so we'll need to handle the fallback. */
ctx->run_set_system_selection_preference =
(qmi_client_check_version (client, 1, 1) &&
ctx->self->priv->has_mode_preference_in_system_selection_preference);
#endif /* WITH_NEWEST_QMI_COMMANDS */
/* Technology preference introduced in NAS 1.7 */
ctx->run_set_technology_preference = qmi_client_check_version (client, 1, 7);
@@ -3178,6 +3219,8 @@ get_serving_system_3gpp_ready (QmiClientNas *client,
run_3gpp_registration_checks_context_complete_and_free (ctx);
}
#if defined WITH_NEWEST_QMI_COMMANDS
static gboolean
process_common_info (QmiNasServiceStatus service_status,
gboolean domain_valid,
@@ -3694,6 +3737,8 @@ get_system_info_ready (QmiClientNas *client,
run_3gpp_registration_checks_context_complete_and_free (ctx);
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
static void
modem_3gpp_run_registration_checks (MMIfaceModem3gpp *self,
gboolean cs_supported,
@@ -3717,15 +3762,19 @@ modem_3gpp_run_registration_checks (MMIfaceModem3gpp *self,
user_data,
modem_3gpp_run_registration_checks);
#if defined WITH_NEWEST_QMI_COMMANDS
/* System Info was added in NAS 1.8 */
if (qmi_client_check_version (client, 1, 8))
if (qmi_client_check_version (client, 1, 8)) {
qmi_client_nas_get_system_info (ctx->client,
NULL,
10,
NULL,
(GAsyncReadyCallback)get_system_info_ready,
ctx);
else
return;
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
qmi_client_nas_get_serving_system (ctx->client,
NULL,
10,
@@ -3825,6 +3874,7 @@ common_enable_disable_unsolicited_registration_events_serving_system (Unsolicite
qmi_message_nas_register_indications_input_unref (input);
}
#if defined WITH_NEWEST_QMI_COMMANDS
static void
common_enable_disable_unsolicited_registration_events_system_info (UnsolicitedRegistrationEventsContext *ctx)
{
@@ -3841,6 +3891,7 @@ common_enable_disable_unsolicited_registration_events_system_info (UnsolicitedRe
ctx);
qmi_message_nas_register_indications_input_unref (input);
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
static void
modem_3gpp_disable_unsolicited_registration_events (MMIfaceModem3gpp *self,
@@ -3863,11 +3914,13 @@ modem_3gpp_disable_unsolicited_registration_events (MMIfaceModem3gpp *self,
callback,
user_data);
#if defined WITH_NEWEST_QMI_COMMANDS
/* System Info was added in NAS 1.8 */
if (qmi_client_check_version (client, 1, 8)) {
common_enable_disable_unsolicited_registration_events_system_info (ctx);
return;
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
/* Ability to explicitly enable/disable serving system indications was
* added in NAS 1.2 */
@@ -4156,6 +4209,7 @@ common_setup_cleanup_unsolicited_registration_events_finish (MMBroadbandModemQmi
return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
}
#if defined WITH_NEWEST_QMI_COMMANDS
static void
system_info_indication_cb (QmiClientNas *client,
QmiIndicationNasSystemInfoOutput *output,
@@ -4164,6 +4218,7 @@ system_info_indication_cb (QmiClientNas *client,
if (mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self)))
common_process_system_info_3gpp (self, NULL, output);
}
#endif
static void
serving_system_indication_cb (QmiClientNas *client,
@@ -4207,6 +4262,7 @@ common_setup_cleanup_unsolicited_registration_events (MMBroadbandModemQmi *self,
/* Store new state */
self->priv->unsolicited_registration_events_setup = enable;
#if defined WITH_NEWEST_QMI_COMMANDS
/* Signal info introduced in NAS 1.8 */
if (qmi_client_check_version (client, 1, 8)) {
/* Connect/Disconnect "System Info" indications */
@@ -4222,7 +4278,9 @@ common_setup_cleanup_unsolicited_registration_events (MMBroadbandModemQmi *self,
g_signal_handler_disconnect (client, self->priv->system_info_indication_id);
self->priv->system_info_indication_id = 0;
}
} else {
} else
#endif /* WITH_NEWEST_QMI_COMMANDS */
{
/* Connect/Disconnect "Serving System" indications */
if (enable) {
g_assert (self->priv->serving_system_indication_id == 0);
@@ -4460,6 +4518,8 @@ common_enable_disable_unsolicited_events_signal_strength (EnableUnsolicitedEvent
qmi_message_nas_set_event_report_input_unref (input);
}
#if defined WITH_NEWEST_QMI_COMMANDS
static void
ri_signal_info_ready (QmiClientNas *client,
GAsyncResult *res,
@@ -4563,6 +4623,8 @@ common_enable_disable_unsolicited_events_signal_info_config (EnableUnsolicitedEv
qmi_message_nas_config_signal_info_input_unref (input);
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
static void
common_enable_disable_unsolicited_events (MMBroadbandModemQmi *self,
gboolean enable,
@@ -4598,10 +4660,14 @@ common_enable_disable_unsolicited_events (MMBroadbandModemQmi *self,
ctx->enable = enable;
ctx->result = result;
#if defined WITH_NEWEST_QMI_COMMANDS
/* Signal info introduced in NAS 1.8 */
if (qmi_client_check_version (client, 1, 8))
if (qmi_client_check_version (client, 1, 8)) {
common_enable_disable_unsolicited_events_signal_info_config (ctx);
else
return;
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
common_enable_disable_unsolicited_events_signal_strength (ctx);
}
@@ -4709,6 +4775,8 @@ event_report_indication_cb (QmiClientNas *client,
}
}
#if defined WITH_NEWEST_QMI_COMMANDS
static void
signal_info_indication_cb (QmiClientNas *client,
QmiIndicationNasSignalInfoOutput *output,
@@ -4757,6 +4825,8 @@ signal_info_indication_cb (QmiClientNas *client,
mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality);
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
static void
common_setup_cleanup_unsolicited_events (MMBroadbandModemQmi *self,
gboolean enable,
@@ -4802,6 +4872,7 @@ common_setup_cleanup_unsolicited_events (MMBroadbandModemQmi *self,
self->priv->event_report_indication_id = 0;
}
#if defined WITH_NEWEST_QMI_COMMANDS
/* Connect/Disconnect "Signal Info" indications.
* Signal info introduced in NAS 1.8 */
if (qmi_client_check_version (client, 1, 8)) {
@@ -4818,6 +4889,7 @@ common_setup_cleanup_unsolicited_events (MMBroadbandModemQmi *self,
self->priv->signal_info_indication_id = 0;
}
}
#endif /* WITH_NEWEST_QMI_COMMANDS */
g_simple_async_result_set_op_res_gboolean (result, TRUE);
g_simple_async_result_complete_in_idle (result);
@@ -5068,9 +5140,11 @@ mm_broadband_modem_qmi_init (MMBroadbandModemQmi *self)
MM_TYPE_BROADBAND_MODEM_QMI,
MMBroadbandModemQmiPrivate);
#if defined WITH_NEWEST_QMI_COMMANDS
/* Some initial defaults for when we need to gather info about
* supported commands/TLVs */
self->priv->has_mode_preference_in_system_selection_preference = TRUE;
#endif /* WITH_NEWEST_QMI_COMMANDS */
}
static void