From bfaf09a2fdff45b7740743b19d7a6c4db561999f Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Wed, 1 Feb 2017 23:43:36 +0100 Subject: qmi-firmware-update: start wait sequence before QmiDevice close [01 feb 2017, 23:14:53] [Debug] [qfu-updater] reset requested successfully... [01 feb 2017, 23:14:53] [Debug] [qfu-updater] cleaning up QMI device... [01 feb 2017, 23:14:53] [Debug] [/dev/cdc-wdm2] Releasing 'dms' client with flags 'none'... [01 feb 2017, 23:14:53] [Debug] [/dev/cdc-wdm2] Unregistered 'dms' client with ID '2' [01 feb 2017, 23:14:53] [Debug] [/dev/cdc-wdm2] Sent message... <<<<<< RAW: <<<<<< length = 12 <<<<<< data = 02:00:00:00:0C:00:00:00:0B:00:00:00 [01 feb 2017, 23:14:53] [Debug] [/dev/cdc-wdm2] Sent message (translated)... <<<<<< Header: <<<<<< length = 12 <<<<<< type = close (0x00000002) <<<<<< transaction = 11 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove ttyUSB0 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove ttyUSB1 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove wwan0 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove 2-1.4:1.0 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove 2-1.4:1.3 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove cdc-wdm2 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove 2-1.4:1.13 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove 2-1.4:1.12 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: remove 2-1.4 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add 2-1.4 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add 2-1.4:1.0 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add 2-1.4:1.3 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add 2-1.4:1.12 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add 2-1.4:1.13 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add cdc-wdm2 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add ttyUSB0 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add wwan0 [01 feb 2017, 23:15:13] [Debug] [qfu-udev] event: add ttyUSB1 [01 feb 2017, 23:15:13] [Debug] [qfu-updater] now waiting for cdc-wdm device... error: error waiting for cdc-wdm: waiting for device at '/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4' timed out --- src/qmi-firmware-update/qfu-updater.c | 38 ++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/qmi-firmware-update/qfu-updater.c b/src/qmi-firmware-update/qfu-updater.c index 229b56d..10eb27c 100644 --- a/src/qmi-firmware-update/qfu-updater.c +++ b/src/qmi-firmware-update/qfu-updater.c @@ -343,6 +343,18 @@ run_context_step_next (GTask *task, RunContextStep next) } static void +run_context_step_next_no_idle (GTask *task, RunContextStep next) +{ + RunContext *ctx; + + ctx = (RunContext *) g_task_get_task_data (task); + ctx->step = next; + + /* Run right away */ + run_context_step (task); +} + +static void new_client_dms_after_ready (gpointer unused, GAsyncResult *res, GTask *task) @@ -733,6 +745,7 @@ static void run_context_step_cleanup_qmi_device (GTask *task) { RunContext *ctx; + QmiDevice *tmp; ctx = (RunContext *) g_task_get_task_data (task); @@ -745,19 +758,26 @@ run_context_step_cleanup_qmi_device (GTask *task) 10, NULL, NULL, NULL); g_clear_object (&ctx->qmi_client); - qmi_device_close (ctx->qmi_device, NULL); - g_clear_object (&ctx->qmi_device); + /* We want to close and unref the QmiDevice only AFTER having set the wait + * tasks for cdc-wdm or tty devices. This is because the close operation may + * take a long time if doing QMI over MBIM (as the MBIM close async + * operation is run internally). If we don't do this in this sequence, we + * may end up getting udev events reported before the wait have started. */ + tmp = g_object_ref (ctx->qmi_device); + g_clear_object (&ctx->qmi_device); g_clear_object (&ctx->cdc_wdm_file); /* If nothing to download we don't need to wait for QDL download mode */ - if (!ctx->pending_images) { - run_context_step_next (task, RUN_CONTEXT_STEP_WAIT_FOR_CDC_WDM); - return; - } - - /* Go on */ - run_context_step_next (task, ctx->step + 1); + if (!ctx->pending_images) + run_context_step_next_no_idle (task, RUN_CONTEXT_STEP_WAIT_FOR_CDC_WDM); + else + /* Go on */ + run_context_step_next_no_idle (task, ctx->step + 1); + + /* After the wait operation has been started, we do run the close */ + qmi_device_close (tmp, NULL); + g_object_unref (tmp); } -- cgit v1.1