[-]
[+]
|
Changed |
_service:tar_git:ofono.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:ofono.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,6 +2,6 @@
<service name="tar_git">
<param name="url">https://git.merproject.org/slava/ofono.git</param>
<param name="branch">master</param>
- <param name="revision">56e0d9d</param>
+ <param name="revision">85fe1b717426fdcfbc75e646d5eab9e9f8f140d7</param>
</service>
</services>
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git12.tar.bz2/ofono/drivers/ril/ril_devinfo.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2016 Jolla Ltd.
+ * Copyright (C) 2015-2017 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -17,16 +17,24 @@
#include "ril_util.h"
#include "ril_log.h"
+#include <gutil_idlequeue.h>
+
/*
* TODO: No public RIL api to query manufacturer or model.
* Check where to get, could /system/build.prop be updated to have good values?
*/
+enum ril_devinfo_cb_tag {
+ DEVINFO_QUERY_SERIAL = 1,
+ DEVINFO_QUERY_SVN
+};
+
struct ril_devinfo {
struct ofono_devinfo *info;
GRilIoQueue *q;
- guint register_id;
- guint imei_id;
+ GUtilIdleQueue *iq;
+ char *log_prefix;
+ char *imeisv;
char *imei;
};
@@ -36,6 +44,7 @@
gpointer data;
};
+#define DBG_(self,fmt,args...) DBG("%s" fmt, (self)->log_prefix, ##args)
#define ril_devinfo_cbd_free g_free
static inline struct ril_devinfo *ril_devinfo_get_data(
@@ -62,7 +71,7 @@
cb(ril_error_failure(&error), "", data);
}
-static void ril_devinfo_query_cb(GRilIoChannel *io, int status,
+static void ril_devinfo_query_revision_cb(GRilIoChannel *io, int status,
const void *data, guint len, void *user_data)
{
struct ofono_error error;
@@ -73,7 +82,7 @@
GRilIoParser rilp;
grilio_parser_init(&rilp, data, len);
res = grilio_parser_get_utf8(&rilp);
- DBG("%s", res);
+ DBG_(cbd->di, "%s", res);
cbd->cb(ril_error_ok(&error), res ? res : "", cbd->data);
g_free(res);
} else {
@@ -86,23 +95,46 @@
{
struct ril_devinfo *di = ril_devinfo_get_data(info);
- DBG("");
- grilio_queue_send_request_full(di->q, NULL, RIL_REQUEST_BASEBAND_VERSION,
- ril_devinfo_query_cb, ril_devinfo_cbd_free,
+ DBG_(di, "");
+ grilio_queue_send_request_full(di->q, NULL,
+ RIL_REQUEST_BASEBAND_VERSION,
+ ril_devinfo_query_revision_cb,
+ ril_devinfo_cbd_free,
ril_devinfo_cbd_new(di, cb, data));
}
-static gboolean ril_devinfo_query_serial_cb(void *user_data)
+static void ril_devinfo_query_serial_cb(gpointer user_data)
{
struct ril_devinfo_cbd *cbd = user_data;
struct ril_devinfo *di = cbd->di;
struct ofono_error error;
- GASSERT(di->imei_id);
- di->imei_id = 0;
-
+ DBG_(di, "%s", di->imei);
cbd->cb(ril_error_ok(&error), di->imei, cbd->data);
- return FALSE;
+}
+
+static void ril_devinfo_query_svn_cb(gpointer user_data)
+{
+ struct ril_devinfo_cbd *cbd = user_data;
+ struct ril_devinfo *di = cbd->di;
+ struct ofono_error error;
+
+ DBG_(di, "%s", di->imeisv);
+ if (di->imeisv && di->imeisv[0]) {
+ cbd->cb(ril_error_ok(&error), di->imeisv, cbd->data);
+ } else {
+ cbd->cb(ril_error_failure(&error), "", cbd->data);
+ }
+}
+
+static void ril_devinfo_query(struct ril_devinfo *di,
+ enum ril_devinfo_cb_tag tag, GUtilIdleFunc fn,
+ ofono_devinfo_query_cb_t cb, void *data)
+{
+ GVERIFY_FALSE(gutil_idle_queue_cancel_tag(di->iq, tag));
+ gutil_idle_queue_add_tag_full(di->iq, tag, fn,
+ ril_devinfo_cbd_new(di, cb, data),
+ ril_devinfo_cbd_free);
}
static void ril_devinfo_query_serial(struct ofono_devinfo *info,
@@ -111,29 +143,28 @@
{
struct ril_devinfo *di = ril_devinfo_get_data(info);
- GASSERT(!di->imei_id);
- if (di->imei_id) {
- g_source_remove(di->imei_id);
- di->imei_id = 0;
- }
+ DBG_(di, "");
+ ril_devinfo_query(di, DEVINFO_QUERY_SERIAL,
+ ril_devinfo_query_serial_cb, cb, data);
+}
- DBG("%s", di->imei);
- di->imei_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
- ril_devinfo_query_serial_cb,
- ril_devinfo_cbd_new(di, cb, data),
- ril_devinfo_cbd_free);
+static void ril_devinfo_query_svn(struct ofono_devinfo *info,
+ ofono_devinfo_query_cb_t cb,
+ void *data)
+{
+ struct ril_devinfo *di = ril_devinfo_get_data(info);
+
+ DBG_(di, "");
+ ril_devinfo_query(di, DEVINFO_QUERY_SVN,
+ ril_devinfo_query_svn_cb, cb, data);
}
-static gboolean ril_devinfo_register(gpointer user_data)
+static void ril_devinfo_register(gpointer user_data)
{
struct ril_devinfo *di = user_data;
- DBG("");
- di->register_id = 0;
+ DBG_(di, "");
ofono_devinfo_register(di->info);
-
- /* This makes the timeout a single-shot */
- return FALSE;
}
static int ril_devinfo_probe(struct ofono_devinfo *info, unsigned int vendor,
@@ -142,13 +173,18 @@
struct ril_modem *modem = data;
struct ril_devinfo *di = g_new0(struct ril_devinfo, 1);
- DBG("%s %s %p", ril_modem_get_path(modem), modem->imei, di);
+ di->log_prefix = (modem->log_prefix && modem->log_prefix[0]) ?
+ g_strconcat(modem->log_prefix, " ", NULL) : g_strdup("");
+
+ DBG_(di, "%s", modem->imei);
GASSERT(modem->imei);
+
di->q = grilio_queue_new(ril_modem_io(modem));
di->info = info;
+ di->imeisv = g_strdup(modem->imeisv);
di->imei = g_strdup(modem->imei);
-
- di->register_id = g_idle_add(ril_devinfo_register, di);
+ di->iq = gutil_idle_queue_new();
+ gutil_idle_queue_add(di->iq, ril_devinfo_register, di);
ofono_devinfo_set_data(info, di);
return 0;
}
@@ -157,19 +193,14 @@
{
struct ril_devinfo *di = ril_devinfo_get_data(info);
- DBG("%p", di);
+ DBG_(di, "");
ofono_devinfo_set_data(info, NULL);
-
- if (di->register_id > 0) {
- g_source_remove(di->register_id);
- }
-
- if (di->imei_id > 0) {
- g_source_remove(di->imei_id);
- }
-
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git12.tar.bz2/ofono/drivers/ril/ril_modem.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2016 Jolla Ltd.
+ * Copyright (C) 2015-2017 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -52,6 +52,7 @@
struct ril_modem modem;
GRilIoQueue *q;
char *log_prefix;
+ char *imeisv;
char *imei;
char *ecclist_file;
gboolean pre_sim_done;
@@ -433,6 +434,7 @@
grilio_queue_unref(md->q);
g_free(md->ecclist_file);
g_free(md->log_prefix);
+ g_free(md->imeisv);
g_free(md->imei);
g_free(md);
}
@@ -460,6 +462,7 @@
/* Copy config */
modem->config = *slot->config;
modem->imei = md->imei = g_strdup(slot->imei);
+ modem->imeisv = md->imeisv = g_strdup(slot->imeisv);
modem->log_prefix = log_prefix;
modem->ecclist_file =
md->ecclist_file = g_strdup(slot->ecclist_file);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git12.tar.bz2/ofono/drivers/ril/ril_plugin.c
^
|
@@ -45,6 +45,8 @@
OFONO_RADIO_ACCESS_MODE_UMTS |\
OFONO_RADIO_ACCESS_MODE_LTE)
+#define RIL_DEVICE_IDENTITY_RETRIES_LAST 2
+
#define RADIO_GID 1001
#define RADIO_UID 1001
#define RIL_SUB_SIZE 4
@@ -135,6 +137,7 @@
struct ril_slot_info pub;
char *path;
char *imei;
+ char *imeisv;
char *name;
char *sockpath;
char *sub;
@@ -162,6 +165,7 @@
gulong io_event_id[IO_EVENT_COUNT];
gulong imei_req_id;
gulong sim_card_state_event_id;
+ gboolean received_sim_status;
guint trace_id;
guint dump_id;
guint retry_id;
@@ -180,6 +184,7 @@
static void ril_debug_mce_notify(struct ofono_debug_desc *desc);
static void ril_plugin_debug_notify(struct ofono_debug_desc *desc);
static void ril_plugin_retry_init_io(struct ril_slot *slot);
+static void ril_plugin_check_modem(struct ril_slot *slot);
GLOG_MODULE_DEFINE("rilmodem");
@@ -252,7 +257,7 @@
static void ril_plugin_send_screen_state(struct ril_slot *slot)
{
- if (slot->io) {
+ if (slot->io && slot->io->connected) {
GRilIoRequest *req = grilio_request_sized_new(8);
grilio_request_append_int32(req, 1); /* Number of params */
grilio_request_append_int32(req, slot->plugin->display_on);
@@ -358,6 +363,7 @@
ril_sim_card_unref(slot->sim_card);
slot->sim_card_state_event_id = 0;
slot->sim_card = NULL;
+ slot->received_sim_status = FALSE;
}
if (slot->io) {
@@ -588,14 +594,79 @@
}
}
+static void ril_plugin_device_identity_cb(GRilIoChannel *io, int status,
+ const void *data, guint len, void *user_data)
+{
+ struct ril_slot *slot = user_data;
+ char *imei = NULL;
+ char *imeisv = NULL;
+
+ GASSERT(slot->imei_req_id);
+ slot->imei_req_id = 0;
+
+ if (status == RIL_E_SUCCESS) {
+ GRilIoParser rilp;
+ guint32 n;
+
+ /*
+ * RIL_REQUEST_DEVICE_IDENTITY
+ *
+ * "response" is const char **
+ * ((const char **)response)[0] is IMEI (for GSM)
+ * ((const char **)response)[1] is IMEISV (for GSM)
+ * ((const char **)response)[2] is ESN (for CDMA)
+ * ((const char **)response)[3] is MEID (for CDMA)
+ */
+ grilio_parser_init(&rilp, data, len);
+ if (grilio_parser_get_uint32(&rilp, &n) && n >= 2) {
+ imei = grilio_parser_get_utf8(&rilp);
+ imeisv = grilio_parser_get_utf8(&rilp);
+ DBG("%s %s", imei, imeisv);
+ } else {
+ DBG("parsing failure!");
+ }
+
+ /*
+ * slot->imei should be either NULL (when we get connected
+ * to rild the very first time) or match the already known
+ * IMEI (if rild crashed and we have reconnected)
+ */
+ if (slot->imei && imei && strcmp(slot->imei, imei)) {
+ ofono_warn("IMEI has changed \"%s\" -> \"%s\"",
+ slot->imei, imei);
+ }
+ } else {
+ ofono_error("Slot %u IMEI query error: %s", slot->config.slot,
+ ril_error_to_string(status));
+ }
+
+ if (slot->imei) {
+ /* We assume that IMEI never changes */
+ g_free(imei);
+ } else {
+ slot->pub.imei =
+ slot->imei = imei ? imei : g_strdup_printf("%d", slot->index);
+ }
+
+ if (slot->imeisv) {
+ g_free(imeisv);
+ } else {
+ slot->pub.imeisv =
+ slot->imeisv = (imeisv ? imeisv : g_strdup(""));
+ }
+
+ ril_plugin_check_modem(slot);
+ ril_plugin_update_ready(slot->plugin);
+}
+
static void ril_plugin_sim_state_changed(struct ril_sim_card *card, void *data)
{
struct ril_slot *slot = data;
struct ril_plugin_priv *plugin = slot->plugin;
+ const struct ril_sim_card_status *status = card->status;
gboolean present;
- if (card && card->status &&
- card->status->card_state == RIL_CARDSTATE_PRESENT) {
+ if (status && status->card_state == RIL_CARDSTATE_PRESENT) {
DBG("SIM found in slot %u", slot->config.slot);
present = TRUE;
} else {
@@ -603,6 +674,36 @@
present = FALSE;
}
+ if (status) {
+ if (!slot->received_sim_status && slot->imei_req_id) {
+ /*
+ * We have received the SIM status but haven't yet
+ * got IMEI from the modem. Some RILs behave this
+ * way if the modem doesn't have IMEI initialized
+ * yet. Cancel the current request (with unlimited
+ * number of retries) and give a few more tries
+ * (this time, limited number).
+ *
+ * Some RILs fail RIL_REQUEST_DEVICE_IDENTITY until
+ * the modem hasn't been properly initialized.
+ */
+ GRilIoRequest* req = grilio_request_new();
+
+ DBG("Giving slot %u last chance", slot->config.slot);
+ grilio_request_set_retry(req, RIL_RETRY_MS,
+ RIL_DEVICE_IDENTITY_RETRIES_LAST);
+ grilio_channel_cancel_request(slot->io,
+ slot->imei_req_id, FALSE);
+ slot->imei_req_id =
+ grilio_channel_send_request_full(slot->io,
+ req, RIL_REQUEST_DEVICE_IDENTITY,
+ ril_plugin_device_identity_cb,
+ NULL, slot);
+ grilio_request_unref(req);
+ }
+ slot->received_sim_status = TRUE;
+ }
+
if (slot->pub.sim_present != present) {
slot->pub.sim_present = present;
ril_plugin_dbus_signal_sim(plugin->dbus, slot->index, present);
@@ -917,42 +1018,6 @@
}
}
-
-static void ril_plugin_imei_cb(GRilIoChannel *io, int status,
- const void *data, guint len, void *user_data)
-{
- struct ril_slot *slot = user_data;
- char *imei = NULL;
-
- GASSERT(slot->imei_req_id);
- slot->imei_req_id = 0;
-
- if (status == RIL_E_SUCCESS) {
- GRilIoParser rilp;
-
- grilio_parser_init(&rilp, data, len);
- imei = grilio_parser_get_utf8(&rilp);
-
- DBG("%s", imei);
-
- /*
- * slot->imei should be either NULL (when we get connected
- * to rild the very first time) or match the already known
- * IMEI (if rild crashed and we have reconnected)
- */
- GASSERT(!slot->imei || !g_strcmp0(slot->imei, imei));
- } else {
- ofono_error("Slot %u IMEI query error: %s", slot->config.slot,
- ril_error_to_string(status));
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git12.tar.bz2/ofono/drivers/ril/ril_plugin.h
^
|
@@ -48,6 +48,7 @@
struct ril_slot_info {
const char *path;
const char *imei;
+ const char *imeisv;
const char *ecclist_file;
gboolean enabled;
gboolean sim_present;
@@ -69,6 +70,7 @@
struct ril_modem {
GRilIoChannel *io;
const char *imei;
+ const char *imeisv;
const char *log_prefix;
const char *ecclist_file;
struct ofono_modem *ofono;
|