static void qmi_register_auto(struct ofono_netreg *netreg, ofono_netreg_register_cb_t cb, void *user_data) { struct netreg_data *data = ofono_netreg_get_data(netreg); struct cb_data *cbd = cb_data_new(cb, user_data); struct qmi_param *param; DBG(""); param = qmi_param_new_uint8(QMI_NAS_PARAM_REGISTER_ACTION, QMI_NAS_REGISTER_ACTION_AUTO); if (!param) goto error; if (qmi_service_send(data->nas, QMI_NAS_REGISTER_NET, param, register_net_cb, cbd, g_free) > 0) return; qmi_param_free(param); error: CALLBACK_WITH_FAILURE(cb, cbd->data); g_free(cbd); }
static void qmi_register_manual(struct ofono_netreg *netreg, const char *mcc, const char *mnc, ofono_netreg_register_cb_t cb, void *user_data) { struct netreg_data *data = ofono_netreg_get_data(netreg); struct cb_data *cbd = cb_data_new(cb, user_data); struct qmi_nas_param_register_manual_info info; struct qmi_param *param; DBG(""); param = qmi_param_new_uint8(QMI_NAS_PARAM_REGISTER_ACTION, QMI_NAS_REGISTER_ACTION_MANUAL); if (!param) goto error; info.mcc = atoi(mcc); info.mnc = atoi(mnc); info.rat = data->current_rat; qmi_param_append(param, QMI_NAS_PARAM_REGISTER_MANUAL_INFO, sizeof(info), &info); if (qmi_service_send(data->nas, QMI_NAS_REGISTER_NET, param, register_net_cb, cbd, g_free) > 0) return; qmi_param_free(param); error: CALLBACK_WITH_FAILURE(cb, cbd->data); g_free(cbd); }
static void qmi_signal_strength(struct ofono_netreg *netreg, ofono_netreg_strength_cb_t cb, void *user_data) { struct netreg_data *data = ofono_netreg_get_data(netreg); struct cb_data *cbd = cb_data_new(cb, user_data); DBG(""); if (qmi_service_send(data->nas, QMI_NAS_GET_RSSI, NULL, get_rssi_cb, cbd, g_free) > 0) return; CALLBACK_WITH_FAILURE(cb, -1, cbd->data); g_free(cbd); }
static void qmi_read_imsi(struct ofono_sim *sim, ofono_sim_imsi_cb_t cb, void *user_data) { struct sim_data *data = ofono_sim_get_data(sim); struct cb_data *cbd = cb_data_new(cb, user_data); DBG(""); if (qmi_service_send(data->dms, QMI_DMS_GET_IMSI, NULL, get_imsi_cb, cbd, g_free) > 0) return; CALLBACK_WITH_FAILURE(cb, NULL, cbd->data); g_free(cbd); }
static void qmi_list_operators(struct ofono_netreg *netreg, ofono_netreg_operator_list_cb_t cb, void *user_data) { struct netreg_data *data = ofono_netreg_get_data(netreg); struct cb_data *cbd = cb_data_new(cb, user_data); DBG(""); if (qmi_service_send(data->nas, QMI_NAS_SCAN_NETS, NULL, scan_nets_cb, cbd, g_free) > 0) return; CALLBACK_WITH_FAILURE(cb, 0, NULL, cbd->data); g_free(cbd); }
static void set_event_cb(struct qmi_result *result, void *user_data) { struct ofono_sim *sim = user_data; struct sim_data *data = ofono_sim_get_data(sim); DBG(""); if (qmi_result_set_error(result, NULL)) goto done; if (qmi_service_send(data->dms, QMI_DMS_GET_UIM_STATE, NULL, get_uim_state, sim, NULL) > 0) return; done: ofono_sim_register(sim); }
static void qmi_registration_status(struct ofono_netreg *netreg, ofono_netreg_status_cb_t cb, void *user_data) { struct netreg_data *data = ofono_netreg_get_data(netreg); struct cb_data *cbd = cb_data_new(cb, user_data); DBG(""); cbd->user = data; if (qmi_service_send(data->nas, QMI_NAS_GET_SS_INFO, NULL, get_ss_info_cb, cbd, g_free) > 0) return; CALLBACK_WITH_FAILURE(cb, -1, -1, -1, -1, cbd->data); g_free(cbd); }
static void qmi_query_passwd_state(struct ofono_sim *sim, ofono_sim_passwd_cb_t cb, void *user_data) { struct sim_data *data = ofono_sim_get_data(sim); struct cb_data *cbd = cb_data_new(cb, user_data); DBG(""); cbd->user = data; if (qmi_service_send(data->dms, QMI_DMS_GET_PIN_STATUS, NULL, get_pin_status_cb, cbd, g_free) > 0) return; CALLBACK_WITH_FAILURE(cb, -1, cbd->data); g_free(cbd); }
static void qmi_read_file_transparent(struct ofono_sim *sim, int fileid, int start, int length, ofono_sim_read_cb_t cb, void *user_data) { struct sim_data *data = ofono_sim_get_data(sim); struct cb_data *cbd = cb_data_new(cb, user_data); DBG("file id 0x%04x", fileid); switch (fileid) { case SIM_EF_ICCID_FILEID: if (qmi_service_send(data->dms, QMI_DMS_GET_ICCID, NULL, get_iccid_cb, cbd, g_free) > 0) return; break; } CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data); g_free(cbd); }
static void create_dms_cb(struct qmi_service *service, void *user_data) { struct ofono_sim *sim = user_data; struct sim_data *data = ofono_sim_get_data(sim); struct qmi_param *param; DBG(""); if (!service) { ofono_error("Failed to request DMS service"); ofono_sim_remove(sim); return; } data->dms = qmi_service_ref(service); qmi_service_register(data->dms, QMI_DMS_EVENT, event_notify, sim, NULL); param = qmi_param_new(); if (!param) goto done; qmi_param_append_uint8(param, QMI_DMS_PARAM_REPORT_PIN_STATUS, 0x01); qmi_param_append_uint8(param, QMI_DMS_PARAM_REPORT_OPER_MODE, 0x01); qmi_param_append_uint8(param, QMI_DMS_PARAM_REPORT_UIM_STATE, 0x01); if (qmi_service_send(data->dms, QMI_DMS_SET_EVENT, param, set_event_cb, sim, NULL) > 0) return; qmi_param_free(param); done: ofono_sim_register(sim); }
static void create_nas_cb(struct qmi_service *service, void *user_data) { struct ofono_netreg *netreg = user_data; struct netreg_data *data = ofono_netreg_get_data(netreg); struct qmi_param *param; struct qmi_nas_param_event_signal_strength ss = { .report = 0x01, .count = 5, .dbm[0] = -55, .dbm[1] = -65, .dbm[2] = -75, .dbm[3] = -85, .dbm[4] = -95 }; DBG(""); if (!service) { ofono_error("Failed to request NAS service"); ofono_netreg_remove(netreg); return; } data->nas = qmi_service_ref(service); qmi_service_register(data->nas, QMI_NAS_EVENT, event_notify, netreg, NULL); qmi_service_register(data->nas, QMI_NAS_SS_INFO_IND, ss_info_notify, netreg, NULL); param = qmi_param_new(); if (!param) goto done; qmi_param_append(param, QMI_NAS_PARAM_REPORT_SIGNAL_STRENGTH, sizeof(ss), &ss); qmi_param_append_uint8(param, QMI_NAS_PARAM_REPORT_RF_INFO, 0x01); if (qmi_service_send(data->nas, QMI_NAS_SET_EVENT, param, set_event_cb, netreg, NULL) > 0) return; qmi_param_free(param); done: ofono_netreg_register(netreg); } static int qmi_netreg_probe(struct ofono_netreg *netreg, unsigned int vendor, void *user_data) { struct qmi_device *device = user_data; struct netreg_data *data; DBG(""); data = g_new0(struct netreg_data, 1); data->operator.name[0] = '\0'; data->operator.mcc[0] = '\0'; data->operator.mnc[0] = '\0'; data->operator.status = -1; data->operator.tech = -1; data->current_rat = QMI_NAS_NETWORK_RAT_NO_CHANGE; ofono_netreg_set_data(netreg, data); qmi_service_create_shared(device, QMI_SERVICE_NAS, create_nas_cb, netreg, NULL); return 0; } static void qmi_netreg_remove(struct ofono_netreg *netreg) { struct netreg_data *data = ofono_netreg_get_data(netreg); DBG(""); ofono_netreg_set_data(netreg, NULL); qmi_service_unregister_all(data->nas); qmi_service_unref(data->nas); g_free(data); } static struct ofono_netreg_driver driver = { .name = "qmimodem", .probe = qmi_netreg_probe, .remove = qmi_netreg_remove, .registration_status = qmi_registration_status, .current_operator = qmi_current_operator, .list_operators = qmi_list_operators, .register_auto = qmi_register_auto, .register_manual = qmi_register_manual, .strength = qmi_signal_strength, }; void qmi_netreg_init(void) { ofono_netreg_driver_register(&driver); } void qmi_netreg_exit(void) { ofono_netreg_driver_unregister(&driver); }