static void ril_gprs_context_deactivate_primary(struct ofono_gprs_context *gc, unsigned int id, ofono_gprs_context_cb_t cb, void *data) { struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); struct cb_data *cbd = NULL; struct parcel rilp; struct req_deactivate_data_call request; struct ofono_error error; int reqid = RIL_REQUEST_DEACTIVATE_DATA_CALL; int ret = 0; ofono_info("deactivate primary"); if (gcd->active_rild_cid == -1) { set_context_disconnected(gcd); if (cb) { CALLBACK_WITH_SUCCESS(cb, data); g_free(cbd); } return; } cbd = cb_data_new(cb, data); cbd->user = gc; gcd->state = STATE_DISABLING; request.cid = gcd->active_rild_cid; request.reason = RIL_DEACTIVATE_DATA_CALL_NO_REASON; if (g_ril_request_deactivate_data_call(gcd->ril, &request, &rilp, &error) == FALSE) { ofono_error("Couldn't build DEACTIVATE_DATA_CALL request."); goto error; } ret = g_ril_send(gcd->ril, reqid, rilp.data, rilp.size, ril_deactivate_data_call_cb, cbd, g_free); g_ril_append_print_buf(gcd->ril, "(%d,0)", request.cid); g_ril_print_request(gcd->ril, ret, reqid); parcel_free(&rilp); error: if (ret <= 0) { ofono_error("Send RIL_REQUEST_DEACTIVATE_DATA_CALL failed."); g_free(cbd); if (cb) CALLBACK_WITH_FAILURE(cb, data); } }
static int drop_data_call(struct ofono_gprs *gprs, int cid) { struct ril_gprs_data *gd = ofono_gprs_get_data(gprs); struct req_deactivate_data_call request; struct parcel rilp; struct ofono_error error; request.cid = cid; request.reason = RIL_DEACTIVATE_DATA_CALL_NO_REASON; g_ril_request_deactivate_data_call(gd->ril, &request, &rilp, &error); if (g_ril_send(gd->ril, RIL_REQUEST_DEACTIVATE_DATA_CALL, &rilp, drop_data_call_cb, gprs, NULL) == 0) { ofono_error("%s: send failed", __func__); return -1; } return 0; }