broadband-modem-qmi: check MDN set after manual activation
This commit is contained in:
@@ -5115,6 +5115,8 @@ modem_cdma_load_activation_state (MMIfaceModemCdma *self,
|
|||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Manual and OTA Activation (CDMA interface) */
|
/* Manual and OTA Activation (CDMA interface) */
|
||||||
|
|
||||||
|
#define MAX_MDN_CHECK_RETRIES 10
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CDMA_ACTIVATION_STEP_FIRST,
|
CDMA_ACTIVATION_STEP_FIRST,
|
||||||
CDMA_ACTIVATION_STEP_ENABLE_INDICATIONS,
|
CDMA_ACTIVATION_STEP_ENABLE_INDICATIONS,
|
||||||
@@ -5137,6 +5139,7 @@ typedef struct {
|
|||||||
guint segment_i;
|
guint segment_i;
|
||||||
guint n_segments;
|
guint n_segments;
|
||||||
GArray **segments;
|
GArray **segments;
|
||||||
|
guint n_mdn_check_retries;
|
||||||
} CdmaActivationContext;
|
} CdmaActivationContext;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -5213,6 +5216,61 @@ activation_power_cycle_ready (MMBroadbandModemQmi *self,
|
|||||||
cdma_activation_context_step (ctx);
|
cdma_activation_context_step (ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
retry_msisdn_check_cb (CdmaActivationContext *ctx)
|
||||||
|
{
|
||||||
|
cdma_activation_context_step (ctx);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
activate_manual_get_msisdn_ready (QmiClientDms *client,
|
||||||
|
GAsyncResult *res,
|
||||||
|
CdmaActivationContext *ctx)
|
||||||
|
{
|
||||||
|
QmiMessageDmsGetMsisdnOutput *output = NULL;
|
||||||
|
GError *error = NULL;
|
||||||
|
const gchar *current_mdn = NULL;
|
||||||
|
const gchar *expected_mdn = NULL;
|
||||||
|
|
||||||
|
qmi_message_dms_activate_manual_input_get_info (ctx->input_manual,
|
||||||
|
NULL, /* spc */
|
||||||
|
NULL, /* sid */
|
||||||
|
&expected_mdn,
|
||||||
|
NULL, /* min */
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
output = qmi_client_dms_get_msisdn_finish (client, res, &error);
|
||||||
|
if (output &&
|
||||||
|
qmi_message_dms_get_msisdn_output_get_result (output, NULL) &&
|
||||||
|
qmi_message_dms_get_msisdn_output_get_msisdn (output, ¤t_mdn, NULL) &&
|
||||||
|
g_str_equal (current_mdn, expected_mdn)) {
|
||||||
|
mm_dbg ("MDN successfully updated to '%s'", expected_mdn);
|
||||||
|
qmi_message_dms_get_msisdn_output_unref (output);
|
||||||
|
/* And go on to next step */
|
||||||
|
ctx->step++;
|
||||||
|
cdma_activation_context_step (ctx);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (output)
|
||||||
|
qmi_message_dms_get_msisdn_output_unref (output);
|
||||||
|
|
||||||
|
if (ctx->n_mdn_check_retries < MAX_MDN_CHECK_RETRIES) {
|
||||||
|
/* Retry after some time */
|
||||||
|
mm_dbg ("MDN not yet updated, retrying...");
|
||||||
|
g_timeout_add (1, (GSourceFunc) retry_msisdn_check_cb, ctx);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Well, all retries consumed already, return error */
|
||||||
|
g_simple_async_result_set_error (ctx->result,
|
||||||
|
MM_CORE_ERROR,
|
||||||
|
MM_CORE_ERROR_FAILED,
|
||||||
|
"MDN was not correctly set during manual activation");
|
||||||
|
cdma_activation_context_complete_and_free (ctx);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
activation_event_report_indication_cb (QmiClientDms *client,
|
activation_event_report_indication_cb (QmiClientDms *client,
|
||||||
QmiIndicationDmsEventReportOutput *output,
|
QmiIndicationDmsEventReportOutput *output,
|
||||||
@@ -5399,23 +5457,31 @@ cdma_activation_context_step (CdmaActivationContext *ctx)
|
|||||||
ctx->step++;
|
ctx->step++;
|
||||||
/* Fall down to next step */
|
/* Fall down to next step */
|
||||||
|
|
||||||
case CDMA_ACTIVATION_STEP_ENABLE_INDICATIONS: {
|
case CDMA_ACTIVATION_STEP_ENABLE_INDICATIONS:
|
||||||
QmiMessageDmsSetEventReportInput *input;
|
/* Indications needed in automatic activation */
|
||||||
|
if (ctx->input_automatic) {
|
||||||
|
QmiMessageDmsSetEventReportInput *input;
|
||||||
|
|
||||||
mm_info ("Activation step [1/5]: enabling indications");
|
mm_info ("Activation step [1/5]: enabling indications");
|
||||||
|
|
||||||
input = qmi_message_dms_set_event_report_input_new ();
|
input = qmi_message_dms_set_event_report_input_new ();
|
||||||
qmi_message_dms_set_event_report_input_set_activation_state_reporting (input, TRUE, NULL);
|
qmi_message_dms_set_event_report_input_set_activation_state_reporting (input, TRUE, NULL);
|
||||||
qmi_client_dms_set_event_report (
|
qmi_client_dms_set_event_report (
|
||||||
ctx->client,
|
ctx->client,
|
||||||
input,
|
input,
|
||||||
5,
|
5,
|
||||||
NULL,
|
NULL,
|
||||||
(GAsyncReadyCallback)ser_activation_state_ready,
|
(GAsyncReadyCallback)ser_activation_state_ready,
|
||||||
ctx);
|
ctx);
|
||||||
qmi_message_dms_set_event_report_input_unref (input);
|
qmi_message_dms_set_event_report_input_unref (input);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Manual activation, no indications needed */
|
||||||
|
g_assert (ctx->input_manual != NULL);
|
||||||
|
mm_info ("Activation step [1/5]: indications not needed in manual activation");
|
||||||
|
ctx->step++;
|
||||||
|
/* Fall down to next step */
|
||||||
|
|
||||||
case CDMA_ACTIVATION_STEP_REQUEST_ACTIVATION:
|
case CDMA_ACTIVATION_STEP_REQUEST_ACTIVATION:
|
||||||
/* Automatic activation */
|
/* Automatic activation */
|
||||||
@@ -5432,34 +5498,46 @@ cdma_activation_context_step (CdmaActivationContext *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Manual activation */
|
/* Manual activation */
|
||||||
if (ctx->input_manual) {
|
g_assert (ctx->input_manual != NULL);
|
||||||
if (!ctx->segments)
|
if (!ctx->segments)
|
||||||
mm_info ("Activation step [2/5]: requesting manual activation");
|
mm_info ("Activation step [2/5]: requesting manual activation");
|
||||||
else {
|
else {
|
||||||
mm_info ("Activation step [2/5]: requesting manual activation (PRL segment %u/%u)",
|
mm_info ("Activation step [2/5]: requesting manual activation (PRL segment %u/%u)",
|
||||||
(ctx->segment_i + 1), ctx->n_segments);
|
(ctx->segment_i + 1), ctx->n_segments);
|
||||||
qmi_message_dms_activate_manual_input_set_prl (
|
qmi_message_dms_activate_manual_input_set_prl (
|
||||||
ctx->input_manual,
|
ctx->input_manual,
|
||||||
(guint16)ctx->total_segments_size,
|
(guint16)ctx->total_segments_size,
|
||||||
(guint8)ctx->segment_i,
|
(guint8)ctx->segment_i,
|
||||||
ctx->segments[ctx->segment_i],
|
ctx->segments[ctx->segment_i],
|
||||||
NULL);
|
NULL);
|
||||||
}
|
|
||||||
|
|
||||||
qmi_client_dms_activate_manual (ctx->client,
|
|
||||||
ctx->input_manual,
|
|
||||||
10,
|
|
||||||
NULL,
|
|
||||||
(GAsyncReadyCallback)activate_manual_ready,
|
|
||||||
ctx);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert_not_reached ();
|
qmi_client_dms_activate_manual (ctx->client,
|
||||||
|
ctx->input_manual,
|
||||||
|
10,
|
||||||
|
NULL,
|
||||||
|
(GAsyncReadyCallback)activate_manual_ready,
|
||||||
|
ctx);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case CDMA_ACTIVATION_STEP_WAIT_UNTIL_FINISHED:
|
case CDMA_ACTIVATION_STEP_WAIT_UNTIL_FINISHED:
|
||||||
mm_info ("Activation step [3/5]: waiting for activation state updates");
|
/* Automatic activation */
|
||||||
|
if (ctx->input_automatic) {
|
||||||
|
/* State updates via unsolicited messages */
|
||||||
|
mm_info ("Activation step [3/5]: waiting for activation state updates");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Manual activation; needs MSISDN checks */
|
||||||
|
g_assert (ctx->input_manual != NULL);
|
||||||
|
ctx->n_mdn_check_retries++;
|
||||||
|
mm_info ("Activation step [3/5]: checking MDN update (retry %u)", ctx->n_mdn_check_retries);
|
||||||
|
qmi_client_dms_get_msisdn (ctx->client,
|
||||||
|
NULL,
|
||||||
|
5,
|
||||||
|
NULL,
|
||||||
|
(GAsyncReadyCallback)activate_manual_get_msisdn_ready,
|
||||||
|
ctx);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case CDMA_ACTIVATION_STEP_POWER_CYCLE:
|
case CDMA_ACTIVATION_STEP_POWER_CYCLE:
|
||||||
|
Reference in New Issue
Block a user