aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-port-qmi.c52
-rw-r--r--src/mm-port-qmi.h4
2 files changed, 49 insertions, 7 deletions
diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c
index 98dd8c44..3f39bfc0 100644
--- a/src/mm-port-qmi.c
+++ b/src/mm-port-qmi.c
@@ -41,25 +41,39 @@ struct _MMPortQmiPrivate {
/*****************************************************************************/
-QmiClient *
-mm_port_qmi_peek_client (MMPortQmi *self,
- QmiService service,
- MMPortQmiFlag flag)
+static QmiClient *
+lookup_client (MMPortQmi *self,
+ QmiService service,
+ MMPortQmiFlag flag,
+ gboolean steal)
{
GList *l;
for (l = self->priv->services; l; l = g_list_next (l)) {
ServiceInfo *info = l->data;
- if (info->service == service &&
- info->flag == flag)
- return info->client;
+ if (info->service == service && info->flag == flag) {
+ QmiClient *found;
+
+ found = info->client;
+ if (steal)
+ self->priv->services = g_list_delete_link (self->priv->services, l);
+ return found;
+ }
}
return NULL;
}
QmiClient *
+mm_port_qmi_peek_client (MMPortQmi *self,
+ QmiService service,
+ MMPortQmiFlag flag)
+{
+ return lookup_client (self, service, flag, FALSE);
+}
+
+QmiClient *
mm_port_qmi_get_client (MMPortQmi *self,
QmiService service,
MMPortQmiFlag flag)
@@ -82,6 +96,30 @@ mm_port_qmi_peek_device (MMPortQmi *self)
/*****************************************************************************/
+void
+mm_port_qmi_release_client (MMPortQmi *self,
+ QmiService service,
+ MMPortQmiFlag flag)
+{
+ QmiClient *client;
+
+ if (!self->priv->qmi_device)
+ return;
+
+ client = lookup_client (self, service, flag, TRUE);
+ if (!client)
+ return;
+
+ mm_obj_dbg (self, "explicitly releasing client for service '%s'...", qmi_service_get_string (service));
+ qmi_device_release_client (self->priv->qmi_device,
+ client,
+ QMI_DEVICE_RELEASE_CLIENT_FLAGS_RELEASE_CID,
+ 3, NULL, NULL, NULL);
+ g_object_unref (client);
+}
+
+/*****************************************************************************/
+
typedef struct {
ServiceInfo *info;
} AllocateClientContext;
diff --git a/src/mm-port-qmi.h b/src/mm-port-qmi.h
index f8ea9eec..b4e8460c 100644
--- a/src/mm-port-qmi.h
+++ b/src/mm-port-qmi.h
@@ -80,6 +80,10 @@ gboolean mm_port_qmi_allocate_client_finish (MMPortQmi *self,
GAsyncResult *res,
GError **error);
+void mm_port_qmi_release_client (MMPortQmi *self,
+ QmiService service,
+ MMPortQmiFlag flag);
+
QmiClient *mm_port_qmi_peek_client (MMPortQmi *self,
QmiService service,
MMPortQmiFlag flag);