Unregister AT notifications when removing ssn driver.
---
 drivers/atmodem/ssn.c |   30 ++++++++++++++++++++++++++----
 1 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/drivers/atmodem/ssn.c b/drivers/atmodem/ssn.c
index f219cde..ce8f1e0 100644
--- a/drivers/atmodem/ssn.c
+++ b/drivers/atmodem/ssn.c
@@ -39,6 +39,12 @@
 
 static const char *none_prefix[] = { NULL };
 
+struct ssn_data {
+       GAtChat *chat;
+       guint cssi_id;
+       guint cssu_id;
+};
+
 static void cssi_notify(GAtResult *result, gpointer user_data)
 {
        struct ofono_ssn *ssn = user_data;
@@ -100,10 +106,12 @@ static void at_ssn_initialized(gboolean ok, GAtResult 
*result,
                                gpointer user_data)
 {
        struct ofono_ssn *ssn = user_data;
-       GAtChat *chat = ofono_ssn_get_data(ssn);
+       struct ssn_data *sd = ofono_ssn_get_data(ssn);
 
-       g_at_chat_register(chat, "+CSSI:", cssi_notify, FALSE, ssn, NULL);
-       g_at_chat_register(chat, "+CSSU:", cssu_notify, FALSE, ssn, NULL);
+       sd->cssi_id = g_at_chat_register(sd->chat, "+CSSI:", cssi_notify,
+                                               FALSE, ssn, NULL);
+       sd->cssu_id = g_at_chat_register(sd->chat, "+CSSU:", cssu_notify,
+                                               FALSE, ssn, NULL);
 
        ofono_ssn_register(ssn);
 }
@@ -112,8 +120,14 @@ static int at_ssn_probe(struct ofono_ssn *ssn, unsigned 
int vendor,
                                void *data)
 {
        GAtChat *chat = data;
+       struct ssn_data *sd;
+
+       sd = g_new0(struct ssn_data, 1);
+
+       sd->chat = chat;
+
+       ofono_ssn_set_data(ssn, sd);
 
-       ofono_ssn_set_data(ssn, chat);
        g_at_chat_send(chat, "AT+CSSN=1,1", none_prefix,
                        at_ssn_initialized, ssn, NULL);
 
@@ -122,6 +136,14 @@ static int at_ssn_probe(struct ofono_ssn *ssn, unsigned 
int vendor,
 
 static void at_ssn_remove(struct ofono_ssn *ssn)
 {
+       struct ssn_data *sd = ofono_ssn_get_data(ssn);
+
+       g_at_chat_unregister(sd->chat, sd->cssi_id);
+       g_at_chat_unregister(sd->chat, sd->cssu_id);
+
+       ofono_ssn_set_data(ssn, NULL);
+
+       g_free(sd);
 }
 
 static struct ofono_ssn_driver driver = {
-- 
1.7.0.4

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to