The detach_shutdown method is invoked to unconditionally release
an active context.  For QMI, this is equivalent to a call to
deactivate_primary.

This patch makes the callback to deactivate_primary optional and
implements detach_shutdown to simply call that function.
---
 drivers/qmimodem/gprs-context.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/drivers/qmimodem/gprs-context.c b/drivers/qmimodem/gprs-context.c
index 247ee9e..b72245c 100644
--- a/drivers/qmimodem/gprs-context.c
+++ b/drivers/qmimodem/gprs-context.c
@@ -304,14 +304,16 @@ static void stop_net_cb(struct qmi_result *result, void 
*user_data)
        DBG("");
 
        if (qmi_result_set_error(result, NULL)) {
-               CALLBACK_WITH_FAILURE(cb, cbd->data);
+               if (cb)
+                       CALLBACK_WITH_FAILURE(cb, cbd->data);
                return;
        }
 
        data->active_context = 0;
        data->pkt_handle = 0;
 
-       CALLBACK_WITH_SUCCESS(cb, cbd->data);
+       if (cb)
+               CALLBACK_WITH_SUCCESS(cb, cbd->data);
 }
 
 static void qmi_deactivate_primary(struct ofono_gprs_context *gc,
@@ -319,18 +321,19 @@ static void qmi_deactivate_primary(struct 
ofono_gprs_context *gc,
                                ofono_gprs_context_cb_t cb, void *user_data)
 {
        struct gprs_context_data *data = ofono_gprs_context_get_data(gc);
-       struct cb_data *cbd = cb_data_new(cb, user_data);
+       struct cb_data *cbd;
        struct qmi_param *param;
 
        DBG("cid %u", cid);
 
-       cbd->user = gc;
-
        param = qmi_param_new_uint32(QMI_WDS_PARAM_PKT_HANDLE,
                                                data->pkt_handle);
        if (!param)
                goto error;
 
+       cbd = cb_data_new(cb, user_data);
+       cbd->user = gc;
+
        if (qmi_service_send(data->wds, QMI_WDS_STOP_NET, param,
                                        stop_net_cb, cbd, g_free) > 0)
                return;
@@ -338,9 +341,16 @@ static void qmi_deactivate_primary(struct 
ofono_gprs_context *gc,
        qmi_param_free(param);
 
 error:
-       CALLBACK_WITH_FAILURE(cb, cbd->data);
+       if (cb)
+               CALLBACK_WITH_FAILURE(cb, user_data);
+}
 
-       g_free(cbd);
+static void qmi_gprs_context_detach_shutdown(struct ofono_gprs_context *gc,
+                                               unsigned int cid)
+{
+       DBG("");
+
+       qmi_deactivate_primary(gc, cid, NULL, NULL);
 }
 
 static void create_wds_cb(struct qmi_service *service, void *user_data)
@@ -471,6 +481,7 @@ static struct ofono_gprs_context_driver driver = {
        .activate_primary       = qmi_activate_primary,
        .deactivate_primary     = qmi_deactivate_primary,
        .read_settings          = qmi_gprs_read_settings,
+       .detach_shutdown        = qmi_gprs_context_detach_shutdown,
 };
 
 void qmi_gprs_context_init(void)
-- 
2.9.3

_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to