diff options
author | Kalle Valo <kalle.valo@canonical.com> | 2010-05-26 18:36:15 +0300 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-05-26 12:32:03 -0500 |
commit | bf7243eda4300b44753673bffc8f8175b07a43f3 (patch) | |
tree | 63a1959ae855ca1ae5638a016a8936f4e54e9b2d /drivers | |
parent | 79b3199f2352ad8c102586ccd91334087ee5986c (diff) | |
download | ofono-bf7243eda4300b44753673bffc8f8175b07a43f3.tar.bz2 |
atmodem: refactor context deactivation
The old way of using CGACT is no longer needed. It is enough
that we shutdown PPP. Recommended by Denis.
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/atmodem/gprs-context.c | 51 |
1 files changed, 16 insertions, 35 deletions
diff --git a/drivers/atmodem/gprs-context.c b/drivers/atmodem/gprs-context.c index ba5f0c09..9b32d594 100644 --- a/drivers/atmodem/gprs-context.c +++ b/drivers/atmodem/gprs-context.c @@ -65,22 +65,6 @@ struct gprs_context_data { void *cb_data; /* Callback data */ }; -static void at_cgact_down_cb(gboolean ok, GAtResult *result, gpointer user_data) -{ - struct cb_data *cbd = user_data; - ofono_gprs_context_cb_t cb = cbd->cb; - struct ofono_gprs_context *gc = cbd->user; - struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); - struct ofono_error error; - - if (ok) - gcd->active_context = 0; - - decode_at_error(&error, g_at_result_final_response(result)); - - cb(&error, cbd->data); -} - static void ppp_connect(const char *interface, const char *ip, const char *dns1, const char *dns2, gpointer user_data) @@ -104,13 +88,21 @@ static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer user_data) struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); - if (gcd->state == STATE_ENABLING) { + DBG(""); + + switch (gcd->state) { + case STATE_ENABLING: CALLBACK_WITH_FAILURE(gcd->up_cb, NULL, FALSE, NULL, NULL, NULL, NULL, gcd->cb_data); - return; + break; + case STATE_DISABLING: + CALLBACK_WITH_SUCCESS(gcd->down_cb, gcd->cb_data); + break; + default: + ofono_gprs_context_deactivated(gc, gcd->active_context); + break; } - ofono_gprs_context_deactivated(gc, gcd->active_context); gcd->active_context = 0; gcd->state = STATE_IDLE; } @@ -227,25 +219,14 @@ static void at_gprs_deactivate_primary(struct ofono_gprs_context *gc, ofono_gprs_context_cb_t cb, void *data) { struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); - struct cb_data *cbd = cb_data_new(cb, data); - char buf[64]; - - if (!cbd) - goto error; - - cbd->user = gc; - snprintf(buf, sizeof(buf), "AT+CGACT=0,%u", id); + DBG(""); - if (g_at_chat_send(gcd->chat, buf, none_prefix, - at_cgact_down_cb, cbd, g_free) > 0) - return; - -error: - if (cbd) - g_free(cbd); + gcd->state = STATE_DISABLING; + gcd->down_cb = cb; + gcd->cb_data = data; - CALLBACK_WITH_FAILURE(cb, data); + g_at_ppp_shutdown(gcd->ppp); } static int at_gprs_context_probe(struct ofono_gprs_context *gc, |