static int mtk_probe(struct ofono_modem *modem) { struct mtk_data *md = g_try_new0(struct mtk_data, 1); if (md == NULL) { errno = ENOMEM; goto error; } md->ofono_online = FALSE; md->radio_state = RADIO_STATE_UNAVAILABLE; md->suspend_id = INVALID_SUSPEND_ID; md->slot = ofono_modem_get_integer(modem, "Slot"); if (md->slot == MULTISIM_SLOT_0) mtk_data_0 = md; else mtk_data_1 = md; DBG("slot %d", md->slot); md->modem = modem; ofono_modem_set_data(modem, md); return 0; error: g_free(md); return -errno; }
static int localhfp_enable(struct ofono_modem *modem) { struct hfp_slc_info *info = ofono_modem_get_data(modem); GIOChannel *io; GAtSyntax *syntax; GAtChat *chat; const char *address; int sk, port; address = ofono_modem_get_string(modem, "Address"); if (address == NULL) return -EINVAL; port = ofono_modem_get_integer(modem, "Port"); if (port < 0) return -EINVAL; sk = connect_socket(address, port); if (sk < 0) return sk; io = g_io_channel_unix_new(sk); if (io == NULL) { close(sk); return -ENOMEM; } syntax = g_at_syntax_new_gsmv1(); chat = g_at_chat_new(io, syntax); g_at_syntax_unref(syntax); g_io_channel_unref(io); if (chat == NULL) return -ENOMEM; if (getenv("OFONO_AT_DEBUG")) g_at_chat_set_debug(chat, phonesim_debug, "LocalHfp: "); g_at_chat_set_disconnect_function(chat, slc_failed, modem); hfp_slc_info_init(info, HFP_VERSION_LATEST); info->chat = chat; hfp_slc_establish(info, slc_established, slc_failed, modem); return -EINPROGRESS; }
void ril_delayed_register(const struct ofono_error *error, void *user_data) { struct ofono_radio_settings *rs = user_data; struct radio_data *rd = ofono_radio_settings_get_data(rs); if (error->type != OFONO_ERROR_TYPE_NO_ERROR) ofono_error("%s: cannot set default fast dormancy", __func__); rd->radio_settings = rs; if (ofono_modem_get_integer(rd->modem, "Slot") == 0) radio_data_0 = rd; else radio_data_1 = rd; rd->virt_tbl->query_rat_mode(rs, ril_after_query_rat_mode, rs); }
static int create_gril(struct ofono_modem *modem) { struct ril_data *rd = ofono_modem_get_data(modem); int slot_id = ofono_modem_get_integer(modem, "Slot"); ofono_info("Using %s as socket for slot %d.", RILD_CMD_SOCKET[slot_id], slot_id); /* RIL expects user radio to connect to the socket */ rd->ril = g_ril_new_with_ucred(RILD_CMD_SOCKET[slot_id], OFONO_RIL_VENDOR_AOSP, RADIO_UID, RADIO_GID); /* NOTE: Since AT modems open a tty, and then call * g_at_chat_new(), they're able to return -EIO if * the first fails, and -ENOMEM if the second fails. * in our case, we already return -EIO if the ril_new * fails. If this is important, we can create a ril_socket * abstraction... ( probaby not a bad idea ). */ if (rd->ril == NULL) { ofono_error("g_ril_new() failed to create modem!"); return -EIO; } g_ril_set_slot(rd->ril, slot_id); if (getenv("OFONO_RIL_TRACE")) g_ril_set_trace(rd->ril, TRUE); if (getenv("OFONO_RIL_HEX_TRACE")) g_ril_set_debugf(rd->ril, ril_debug, GRIL_HEX_PREFIX[slot_id]); g_ril_register(rd->ril, RIL_UNSOL_RIL_CONNECTED, ril_connected, modem); g_ril_register(rd->ril, RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, ril_radio_state_changed, modem); return 0; }
static int sim_select_uicc_subscription(struct ofono_sim *sim, struct reply_sim_status *status) { struct sim_data *sd = ofono_sim_get_data(sim); int slot_id = ofono_modem_get_integer(sd->modem, "Slot"); int selected_app = -1; unsigned int i; for (i = 0; i < status->num_apps; i++) { switch (status->apps[i]->app_type) { case RIL_APPTYPE_UNKNOWN: continue; case RIL_APPTYPE_USIM: case RIL_APPTYPE_RUIM: if (selected_app != -1) { switch (status->apps[selected_app]->app_type) { case RIL_APPTYPE_USIM: case RIL_APPTYPE_RUIM: break; default: selected_app = i; } } else { selected_app = i; } break; default: if (selected_app == -1) selected_app = i; } } DBG("Select app %d for subscription.", selected_app); if (selected_app != -1) /* Number 1 means activates that app */ sim_send_set_uicc_subscription(sim, slot_id, selected_app, slot_id, 1); return selected_app; }
static int u8500_probe(struct ofono_modem *modem) { const char *ifname = ofono_modem_get_string(modem, "Interface"); unsigned address = ofono_modem_get_integer(modem, "Address"); GIsiModem *isimodem; GIsiClient *client = NULL; GIsiPhonetNetlink *link = NULL; struct isi_data *isi = NULL; if (ifname == NULL) return -EINVAL; DBG("(%p) with %s", modem, ifname); isimodem = g_isi_modem_create_by_name(ifname); if (isimodem == NULL) { DBG("Interface=%s: %s", ifname, strerror(errno)); return -errno; } g_isi_modem_set_userdata(isimodem, modem); if (getenv("OFONO_ISI_DEBUG")) g_isi_modem_set_debug(isimodem, ofono_debug); if (getenv("OFONO_ISI_TRACE")) g_isi_modem_set_trace(isimodem, isi_trace); if (g_isi_pn_netlink_by_modem(isimodem)) { DBG("%s: %s", ifname, strerror(EBUSY)); errno = EBUSY; goto error; } link = g_isi_pn_netlink_start(isimodem, phonet_status_cb, modem); if (link == NULL) { DBG("%s: %s", ifname, strerror(errno)); goto error; } if (address) { int error = g_isi_pn_netlink_set_address(isimodem, address); if (error && error != -EEXIST) { DBG("g_isi_pn_netlink_set_address(): %s\n", strerror(-error)); errno = -error; goto error; } } isi = g_try_new0(struct isi_data, 1); if (isi == NULL) { errno = ENOMEM; goto error; } client = g_isi_client_create(isimodem, PN_MODEM_MCE); if (!client) goto error; g_isi_modem_set_device(isimodem, PN_DEV_MODEM); isi->modem = isimodem; isi->ifname = ifname; isi->link = link; isi->reported = -1; isi->client = client; ofono_modem_set_data(modem, isi); return 0; error: g_isi_pn_netlink_stop(link); g_isi_client_destroy(client); g_isi_modem_destroy(isimodem); g_free(isi); return -errno; }
static int phonesim_enable(struct ofono_modem *modem) { struct phonesim_data *data = ofono_modem_get_data(modem); GIOChannel *io; GAtSyntax *syntax; const char *address, *value; int sk, port; DBG("%p", modem); address = ofono_modem_get_string(modem, "Address"); if (address == NULL) return -EINVAL; port = ofono_modem_get_integer(modem, "Port"); if (port < 0) return -EINVAL; value = ofono_modem_get_string(modem, "Modem"); if (!g_strcmp0(value, "calypso")) data->calypso = TRUE; value = ofono_modem_get_string(modem, "Multiplexer"); if (!g_strcmp0(value, "internal")) data->use_mux = TRUE; sk = connect_socket(address, port); if (sk < 0) return sk; io = g_io_channel_unix_new(sk); if (io == NULL) { close(sk); return -ENOMEM; } if (data->calypso) syntax = g_at_syntax_new_gsm_permissive(); else syntax = g_at_syntax_new_gsmv1(); data->chat = g_at_chat_new(io, syntax); g_at_syntax_unref(syntax); g_io_channel_unref(io); if (data->chat == NULL) return -ENOMEM; if (getenv("OFONO_AT_DEBUG")) g_at_chat_set_debug(data->chat, phonesim_debug, ""); g_at_chat_set_disconnect_function(data->chat, phonesim_disconnected, modem); if (data->calypso) { g_at_chat_set_wakeup_command(data->chat, "AT\r", 500, 5000); g_at_chat_send(data->chat, "ATE0", NULL, NULL, NULL, NULL); g_at_chat_send(data->chat, "AT%CUNS=0", NULL, NULL, NULL, NULL); } if (data->use_mux) { g_at_chat_send(data->chat, "ATE0", NULL, NULL, NULL, NULL); g_at_mux_setup_gsm0710(data->chat, mux_setup, modem, NULL); g_at_chat_unref(data->chat); data->chat = NULL; return -EINPROGRESS; } g_at_chat_send(data->chat, "AT+CSCS=\"GSM\"", none_prefix, NULL, NULL, NULL); g_at_chat_register(data->chat, "+CRST:", crst_notify, FALSE, modem, NULL); g_at_chat_register(data->chat, "+CBC:", cbc_notify, FALSE, modem, NULL); g_at_chat_send(data->chat, "AT+CBC", none_prefix, NULL, NULL, NULL); data->hfp_watch = __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_EMULATOR_HFP, emulator_hfp_watch, data, NULL); return 0; }