broadband-modem-qmi: move pri/modem pair list building to separate method
This commit is contained in:
@@ -7242,6 +7242,59 @@ match_images (const gchar *pri_id, const gchar *modem_id)
|
|||||||
return strncmp (pri_id, modem_id, modem_id_len - 1) == 0;
|
return strncmp (pri_id, modem_id, modem_id_len - 1) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GList *
|
||||||
|
find_image_pairs (QmiMessageDmsListStoredImagesOutputListImage *image_pri,
|
||||||
|
QmiMessageDmsListStoredImagesOutputListImage *image_modem,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
guint i, j;
|
||||||
|
GList *pairs = NULL;
|
||||||
|
|
||||||
|
/* Loop PRI images and try to find a pairing MODEM image with same build ID */
|
||||||
|
for (i = 0; i < image_pri->sublist->len; i++) {
|
||||||
|
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement *subimage_pri;
|
||||||
|
|
||||||
|
subimage_pri = &g_array_index (image_pri->sublist,
|
||||||
|
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement,
|
||||||
|
i);
|
||||||
|
for (j = 0; j < image_modem->sublist->len; j++) {
|
||||||
|
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement *subimage_modem;
|
||||||
|
|
||||||
|
subimage_modem = &g_array_index (image_modem->sublist,
|
||||||
|
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement,
|
||||||
|
j);
|
||||||
|
|
||||||
|
if (match_images (subimage_pri->build_id, subimage_modem->build_id)) {
|
||||||
|
FirmwarePair *pair;
|
||||||
|
|
||||||
|
mm_dbg ("Found pairing PRI+MODEM images with build ID '%s'", subimage_pri->build_id);
|
||||||
|
pair = g_slice_new (FirmwarePair);
|
||||||
|
pair->build_id = g_strdup (subimage_pri->build_id);
|
||||||
|
pair->modem_unique_id = g_array_ref (subimage_modem->unique_id);
|
||||||
|
pair->pri_unique_id = g_array_ref (subimage_pri->unique_id);
|
||||||
|
|
||||||
|
/* We're using the PRI 'index_of_running_image' only as source to select
|
||||||
|
* which is the current running firmware. This avoids issues with the wrong
|
||||||
|
* 'index_of_running_image' reported for the MODEM images, see:
|
||||||
|
* https://forum.sierrawireless.com/t/mc74xx-wrong-running-image-in-qmi-get-stored-images/8998
|
||||||
|
*/
|
||||||
|
pair->current = (image_pri->index_of_running_image == i ? TRUE : FALSE);
|
||||||
|
|
||||||
|
pairs = g_list_append (pairs, pair);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == image_modem->sublist->len)
|
||||||
|
mm_dbg ("Pairing for PRI image with build ID '%s' not found", subimage_pri->build_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pairs)
|
||||||
|
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_NOT_FOUND, "No valid PRI+MODEM pairs found");
|
||||||
|
|
||||||
|
return pairs;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
find_image_type_indices (GArray *array,
|
find_image_type_indices (GArray *array,
|
||||||
QmiMessageDmsListStoredImagesOutputListImage **image_pri,
|
QmiMessageDmsListStoredImagesOutputListImage **image_pri,
|
||||||
@@ -7301,13 +7354,14 @@ list_stored_images_ready (QmiClientDms *client,
|
|||||||
{
|
{
|
||||||
FirmwareListPreloadContext *ctx;
|
FirmwareListPreloadContext *ctx;
|
||||||
GArray *array;
|
GArray *array;
|
||||||
guint i;
|
QmiMessageDmsListStoredImagesOutputListImage *image_pri;
|
||||||
guint j;
|
QmiMessageDmsListStoredImagesOutputListImage *image_modem;
|
||||||
QmiMessageDmsListStoredImagesOutputListImage *image_pri = NULL;
|
|
||||||
QmiMessageDmsListStoredImagesOutputListImage *image_modem = NULL;
|
|
||||||
QmiMessageDmsListStoredImagesOutput *output;
|
QmiMessageDmsListStoredImagesOutput *output;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
|
ctx = g_task_get_task_data (task);
|
||||||
|
|
||||||
|
/* Read array from output */
|
||||||
output = qmi_client_dms_list_stored_images_finish (client, res, &error);
|
output = qmi_client_dms_list_stored_images_finish (client, res, &error);
|
||||||
if (!output ||
|
if (!output ||
|
||||||
!qmi_message_dms_list_stored_images_output_get_result (output, &error) ||
|
!qmi_message_dms_list_stored_images_output_get_result (output, &error) ||
|
||||||
@@ -7324,50 +7378,10 @@ list_stored_images_ready (QmiClientDms *client,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx = g_task_get_task_data (task);
|
/* Build firmware PRI+MODEM pair list */
|
||||||
|
ctx->pairs = find_image_pairs (image_pri, image_modem, &error);
|
||||||
/* Loop PRI images and try to find a pairing MODEM image with same build ID */
|
|
||||||
for (i = 0; i < image_pri->sublist->len; i++) {
|
|
||||||
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement *subimage_pri;
|
|
||||||
|
|
||||||
subimage_pri = &g_array_index (image_pri->sublist,
|
|
||||||
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement,
|
|
||||||
i);
|
|
||||||
for (j = 0; j < image_modem->sublist->len; j++) {
|
|
||||||
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement *subimage_modem;
|
|
||||||
|
|
||||||
subimage_modem = &g_array_index (image_modem->sublist,
|
|
||||||
QmiMessageDmsListStoredImagesOutputListImageSublistSublistElement,
|
|
||||||
j);
|
|
||||||
|
|
||||||
if (match_images (subimage_pri->build_id, subimage_modem->build_id)) {
|
|
||||||
FirmwarePair *pair;
|
|
||||||
|
|
||||||
mm_dbg ("Found pairing PRI+MODEM images with build ID '%s'", subimage_pri->build_id);
|
|
||||||
pair = g_slice_new (FirmwarePair);
|
|
||||||
pair->build_id = g_strdup (subimage_pri->build_id);
|
|
||||||
pair->modem_unique_id = g_array_ref (subimage_modem->unique_id);
|
|
||||||
pair->pri_unique_id = g_array_ref (subimage_pri->unique_id);
|
|
||||||
|
|
||||||
/* We're using the PRI 'index_of_running_image' only as source to select
|
|
||||||
* which is the current running firmware. This avoids issues with the wrong
|
|
||||||
* 'index_of_running_image' reported for the MODEM images, see:
|
|
||||||
* https://forum.sierrawireless.com/t/mc74xx-wrong-running-image-in-qmi-get-stored-images/8998
|
|
||||||
*/
|
|
||||||
pair->current = (image_pri->index_of_running_image == i ? TRUE : FALSE);
|
|
||||||
|
|
||||||
ctx->pairs = g_list_append (ctx->pairs, pair);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (j == image_modem->sublist->len)
|
|
||||||
mm_dbg ("Pairing for PRI image with build ID '%s' not found", subimage_pri->build_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ctx->pairs) {
|
if (!ctx->pairs) {
|
||||||
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_NOT_FOUND,
|
g_task_return_error (task, error);
|
||||||
"No valid PRI+MODEM pairs found");
|
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user