diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2019-09-16 12:37:58 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2019-10-11 08:16:04 +0000 |
commit | 1b29f7524c114435539870b6ab06875ade598661 (patch) | |
tree | 61f7d8a6dd70a1fae3811f7f79c20ca51cb12d0b | |
parent | 7986b2737da85e37591c45bc1c5fc335081e99ab (diff) |
broadband-modem-qmi: move pri/modem pair list building to separate method
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 114 |
1 files changed, 64 insertions, 50 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index dc8f1b9b..bb8b20af 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -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; } +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 find_image_type_indices (GArray *array, QmiMessageDmsListStoredImagesOutputListImage **image_pri, @@ -7299,15 +7352,16 @@ list_stored_images_ready (QmiClientDms *client, GAsyncResult *res, GTask *task) { - FirmwareListPreloadContext *ctx; - GArray *array; - guint i; - guint j; - QmiMessageDmsListStoredImagesOutputListImage *image_pri = NULL; - QmiMessageDmsListStoredImagesOutputListImage *image_modem = NULL; + FirmwareListPreloadContext *ctx; + GArray *array; + QmiMessageDmsListStoredImagesOutputListImage *image_pri; + QmiMessageDmsListStoredImagesOutputListImage *image_modem; 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); if (!output || !qmi_message_dms_list_stored_images_output_get_result (output, &error) || @@ -7324,50 +7378,10 @@ list_stored_images_ready (QmiClientDms *client, goto out; } - ctx = g_task_get_task_data (task); - - /* 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); - } - + /* Build firmware PRI+MODEM pair list */ + ctx->pairs = find_image_pairs (image_pri, image_modem, &error); if (!ctx->pairs) { - g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_NOT_FOUND, - "No valid PRI+MODEM pairs found"); + g_task_return_error (task, error); g_object_unref (task); goto out; } |