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