When modem does not answer or answers slowly to a discovery request,
a timeout occurs.
In timeout callback, request should be removed from queues to avoid
treating answer if it arrives later.
---
 drivers/qmimodem/qmi.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/drivers/qmimodem/qmi.c b/drivers/qmimodem/qmi.c
index c538cb9..65263d2 100644
--- a/drivers/qmimodem/qmi.c
+++ b/drivers/qmimodem/qmi.c
@@ -1073,6 +1073,7 @@ struct discover_data {
        qmi_discover_func_t func;
        void *user_data;
        qmi_destroy_func_t destroy;
+       uint8_t tid;
        guint timeout;
 };
 
@@ -1181,14 +1182,38 @@ static gboolean discover_reply(gpointer user_data)
 {
        struct discover_data *data = user_data;
        struct qmi_device *device = data->device;
+       unsigned int tid = (unsigned int)(data->tid);
+       GList *list;
+       struct qmi_request *req = NULL;
 
        data->timeout = 0;
 
+       /* remove request from queues */
+       if (tid != 0) {
+               list = g_queue_find_custom(device->req_queue,
+                               GUINT_TO_POINTER(tid), __request_compare);
+
+               if (list) {
+                       req = list->data;
+                       g_queue_delete_link(device->req_queue, list);
+               } else {
+                       list = g_queue_find_custom(device->control_queue,
+                               GUINT_TO_POINTER(tid), __request_compare);
+
+                       if (list) {
+                               req = list->data;
+                               g_queue_delete_link(device->control_queue,
+                                                               list);
+                       }
+               }
+       }
+
        if (data->func)
                data->func(device->version_count,
                                device->version_list, data->user_data);
 
        __qmi_device_discovery_complete(data->device, &data->super);
+       __request_free(req, NULL);
 
        return FALSE;
 }
@@ -1234,6 +1259,7 @@ bool qmi_device_discover(struct qmi_device *device, 
qmi_discover_func_t func,
 
        hdr->type = 0x00;
        hdr->transaction = device->next_control_tid++;
+       data->tid = hdr->transaction;
 
        __request_submit(device, req, hdr->transaction);
 
-- 
2.7.4

_______________________________________________
ofono mailing list
ofono@ofono.org
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to