Hi Frédéric, > +static void emulator_dial_callback(const struct ofono_error *error, void *data) > +{ > + struct ofono_voicecall *vc = data; > + const char *number = NULL; > + gboolean need_to_emit; > + struct voicecall *v; > + > + v = dial_handle_result(vc, error, number, &need_to_emit); > + > + if (v == NULL) { > + struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom); > + > + if (is_emergency_number(vc, number) == TRUE) > + __ofono_modem_dec_emergency_mode(modem); > + } > + > + if (need_to_emit) > + voicecalls_emit_call_added(vc, v); > +} > + > +static void emulator_dial(struct ofono_emulator *em, struct ofono_voicecall *vc, > + const char *number) > +{ > + struct ofono_error result; > + int err; > + > + result.error = 0; > + > + if (number == NULL || number[0] == '\0') { > + result.type = OFONO_ERROR_TYPE_FAILURE; > + goto send; > + } > + > + err = voicecall_dial(vc, number, OFONO_CLIR_OPTION_DEFAULT, > + emulator_dial_callback, vc); > + switch (err) { > + case 0: > + result.type = OFONO_ERROR_TYPE_NO_ERROR; > + break; > + Actually you can't do this. There are bizarre circumstances where the dial callback will be called synchronously, so even though all conditions in voicecall_dial are satisfied and it returns 0, the modem driver still fails to dispatch the ATD. In which case you will erroneously return OK. e.g.: voicecall_dial -> at_modem_dial -> emulator_dial_callback voicecall_dial you have to be also careful of the timing of the ofono_voicecall_notify events and the ATD callback. You should not report cind until you have sent the final response to the ATD. Regards, -Denis