forked from sailfishos/ofono
		
	[ril] Fixed online state tracking. Fixes JB#39592
This commit is contained in:
		@@ -1227,8 +1227,7 @@ static void ril_data_power_update(struct ril_data *self)
 | 
			
		||||
{
 | 
			
		||||
	struct ril_data_priv *priv = self->priv;
 | 
			
		||||
 | 
			
		||||
	if (priv->pending_req || priv->req_queue ||
 | 
			
		||||
				(priv->flags & RIL_DATA_FLAG_ALLOWED)) {
 | 
			
		||||
	if (priv->pending_req || priv->req_queue) {
 | 
			
		||||
		ril_radio_power_on(priv->radio, self);
 | 
			
		||||
	} else {
 | 
			
		||||
		ril_radio_power_off(priv->radio, self);
 | 
			
		||||
 
 | 
			
		||||
@@ -308,16 +308,18 @@ static void ril_modem_set_online(struct ofono_modem *modem, ofono_bool_t online,
 | 
			
		||||
				ofono_modem_online_cb_t cb, void *data)
 | 
			
		||||
{
 | 
			
		||||
	struct ril_modem_data *md = ril_modem_data_from_ofono(modem);
 | 
			
		||||
	struct ril_radio *radio = md->modem.radio;
 | 
			
		||||
	struct ril_modem_online_request *req;
 | 
			
		||||
 | 
			
		||||
	DBG("%s going %sline", ofono_modem_get_path(modem),
 | 
			
		||||
						online ? "on" : "off");
 | 
			
		||||
 | 
			
		||||
	ril_radio_set_online(radio, online);
 | 
			
		||||
	if (online) {
 | 
			
		||||
		ril_radio_power_on(md->modem.radio, RADIO_POWER_TAG(md));
 | 
			
		||||
		ril_radio_power_on(radio, RADIO_POWER_TAG(md));
 | 
			
		||||
		req = &md->set_online;
 | 
			
		||||
	} else {
 | 
			
		||||
		ril_radio_power_off(md->modem.radio, RADIO_POWER_TAG(md));
 | 
			
		||||
		ril_radio_power_off(radio, RADIO_POWER_TAG(md));
 | 
			
		||||
		req = &md->set_offline;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,8 +20,6 @@
 | 
			
		||||
#include "ril_util.h"
 | 
			
		||||
#include "ril_log.h"
 | 
			
		||||
 | 
			
		||||
#include "sailfish_watch.h"
 | 
			
		||||
 | 
			
		||||
#include <grilio_queue.h>
 | 
			
		||||
#include <grilio_request.h>
 | 
			
		||||
#include <grilio_parser.h>
 | 
			
		||||
@@ -43,11 +41,6 @@ enum ril_network_timer {
 | 
			
		||||
	TIMER_COUNT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum ril_network_watch_events {
 | 
			
		||||
	WATCH_EVENT_ONLINE,
 | 
			
		||||
	WATCH_EVENT_COUNT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum ril_network_radio_event {
 | 
			
		||||
	RADIO_EVENT_STATE_CHANGED,
 | 
			
		||||
	RADIO_EVENT_ONLINE_CHANGED,
 | 
			
		||||
@@ -65,8 +58,6 @@ struct ril_network_priv {
 | 
			
		||||
	GRilIoQueue *q;
 | 
			
		||||
	struct ril_radio *radio;
 | 
			
		||||
	struct ril_sim_card *sim_card;
 | 
			
		||||
	struct sailfish_watch *watch;
 | 
			
		||||
	gulong watch_event_id[WATCH_EVENT_COUNT];
 | 
			
		||||
	int rat;
 | 
			
		||||
	char *log_prefix;
 | 
			
		||||
	guint operator_poll_id;
 | 
			
		||||
@@ -487,7 +478,7 @@ static gboolean ril_network_can_set_pref_mode(struct ril_network *self)
 | 
			
		||||
{
 | 
			
		||||
	struct ril_network_priv *priv = self->priv;
 | 
			
		||||
 | 
			
		||||
	return priv->watch->online && ril_sim_card_ready(priv->sim_card);
 | 
			
		||||
	return priv->radio->online && ril_sim_card_ready(priv->sim_card);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean ril_network_set_rat_holdoff_cb(gpointer user_data)
 | 
			
		||||
@@ -762,7 +753,7 @@ static void ril_network_radio_state_cb(struct ril_radio *radio, void *data)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ril_network_online_cb(struct sailfish_watch *watch, void *data)
 | 
			
		||||
static void ril_network_radio_online_cb(struct ril_radio *radio, void *data)
 | 
			
		||||
{
 | 
			
		||||
	struct ril_network *self = RIL_NETWORK(data);
 | 
			
		||||
 | 
			
		||||
@@ -825,7 +816,6 @@ struct ril_network *ril_network_new(const char *path, GRilIoChannel *io,
 | 
			
		||||
	self->settings = ril_sim_settings_ref(settings);
 | 
			
		||||
	priv->io = grilio_channel_ref(io);
 | 
			
		||||
	priv->q = grilio_queue_new(priv->io);
 | 
			
		||||
	priv->watch = sailfish_watch_new(path);
 | 
			
		||||
	priv->radio = ril_radio_ref(radio);
 | 
			
		||||
	priv->sim_card = ril_sim_card_ref(sim_card);
 | 
			
		||||
	priv->log_prefix = (log_prefix && log_prefix[0]) ?
 | 
			
		||||
@@ -842,9 +832,9 @@ struct ril_network *ril_network_new(const char *path, GRilIoChannel *io,
 | 
			
		||||
	priv->radio_event_id[RADIO_EVENT_STATE_CHANGED] =
 | 
			
		||||
		ril_radio_add_state_changed_handler(priv->radio,
 | 
			
		||||
			ril_network_radio_state_cb, self);
 | 
			
		||||
	priv->watch_event_id[WATCH_EVENT_ONLINE] =
 | 
			
		||||
		sailfish_watch_add_modem_changed_handler(priv->watch,
 | 
			
		||||
			ril_network_online_cb, self);
 | 
			
		||||
	priv->radio_event_id[RADIO_EVENT_ONLINE_CHANGED] =
 | 
			
		||||
		ril_radio_add_online_changed_handler(priv->radio,
 | 
			
		||||
			ril_network_radio_online_cb, self);
 | 
			
		||||
	priv->settings_event_id =
 | 
			
		||||
		ril_sim_settings_add_pref_mode_changed_handler(settings,
 | 
			
		||||
			ril_network_pref_mode_changed_cb, self);
 | 
			
		||||
@@ -901,6 +891,7 @@ static void ril_network_finalize(GObject *object)
 | 
			
		||||
	enum ril_network_timer tid;
 | 
			
		||||
 | 
			
		||||
	DBG_(self, "");
 | 
			
		||||
 | 
			
		||||
	for (tid=0; tid<TIMER_COUNT; tid++) {
 | 
			
		||||
		ril_network_stop_timer(self, tid);
 | 
			
		||||
	}
 | 
			
		||||
@@ -911,8 +902,6 @@ static void ril_network_finalize(GObject *object)
 | 
			
		||||
 | 
			
		||||
	grilio_channel_unref(priv->io);
 | 
			
		||||
	grilio_queue_unref(priv->q);
 | 
			
		||||
	sailfish_watch_remove_all_handlers(priv->watch, priv->watch_event_id);
 | 
			
		||||
	sailfish_watch_unref(priv->watch);
 | 
			
		||||
	ril_radio_remove_all_handlers(priv->radio, priv->radio_event_id);
 | 
			
		||||
	ril_radio_unref(priv->radio);
 | 
			
		||||
	ril_sim_card_remove_handler(priv->sim_card,
 | 
			
		||||
 
 | 
			
		||||
@@ -50,12 +50,14 @@ struct ril_radio_priv {
 | 
			
		||||
 | 
			
		||||
enum ril_radio_signal {
 | 
			
		||||
	SIGNAL_STATE_CHANGED,
 | 
			
		||||
	SIGNAL_ONLINE_CHANGED,
 | 
			
		||||
	SIGNAL_COUNT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define POWER_RETRY_SECS (1)
 | 
			
		||||
 | 
			
		||||
#define SIGNAL_STATE_CHANGED_NAME       "ril-radio-state-changed"
 | 
			
		||||
#define SIGNAL_ONLINE_CHANGED_NAME      "ril-radio-online-changed"
 | 
			
		||||
 | 
			
		||||
static guint ril_radio_signals[SIGNAL_COUNT] = { 0 };
 | 
			
		||||
 | 
			
		||||
@@ -75,7 +77,8 @@ static inline gboolean ril_radio_power_should_be_on(struct ril_radio *self)
 | 
			
		||||
{
 | 
			
		||||
	struct ril_radio_priv *priv = self->priv;
 | 
			
		||||
 | 
			
		||||
	return !priv->power_cycle && g_hash_table_size(priv->req_table) > 0;
 | 
			
		||||
	return self->online && !priv->power_cycle &&
 | 
			
		||||
				g_hash_table_size(priv->req_table) > 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline gboolean ril_radio_state_off(enum ril_radio_state radio_state)
 | 
			
		||||
@@ -280,6 +283,19 @@ void ril_radio_power_off(struct ril_radio *self, gpointer tag)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ril_radio_set_online(struct ril_radio *self, gboolean online)
 | 
			
		||||
{
 | 
			
		||||
	if (G_LIKELY(self) && self->online != online) {
 | 
			
		||||
		gboolean on, was_on = ril_radio_power_should_be_on(self);
 | 
			
		||||
		self->online = online;
 | 
			
		||||
		on = ril_radio_power_should_be_on(self);
 | 
			
		||||
		if (was_on != on) {
 | 
			
		||||
			ril_radio_power_request(self, on, FALSE);
 | 
			
		||||
		}
 | 
			
		||||
		ril_radio_emit_signal(self, SIGNAL_ONLINE_CHANGED);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gulong ril_radio_add_state_changed_handler(struct ril_radio *self,
 | 
			
		||||
					ril_radio_cb_t cb, void *arg)
 | 
			
		||||
{
 | 
			
		||||
@@ -287,6 +303,13 @@ gulong ril_radio_add_state_changed_handler(struct ril_radio *self,
 | 
			
		||||
		SIGNAL_STATE_CHANGED_NAME, G_CALLBACK(cb), arg) : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gulong ril_radio_add_online_changed_handler(struct ril_radio *self,
 | 
			
		||||
					ril_radio_cb_t cb, void *arg)
 | 
			
		||||
{
 | 
			
		||||
	return (G_LIKELY(self) && G_LIKELY(cb)) ? g_signal_connect(self,
 | 
			
		||||
		SIGNAL_ONLINE_CHANGED_NAME, G_CALLBACK(cb), arg) : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ril_radio_remove_handler(struct ril_radio *self, gulong id)
 | 
			
		||||
{
 | 
			
		||||
	if (G_LIKELY(self) && G_LIKELY(id)) {
 | 
			
		||||
@@ -424,6 +447,7 @@ static void ril_radio_class_init(RilRadioClass *klass)
 | 
			
		||||
	object_class->finalize = ril_radio_finalize;
 | 
			
		||||
	g_type_class_add_private(klass, sizeof(struct ril_radio_priv));
 | 
			
		||||
	NEW_SIGNAL(klass, STATE);
 | 
			
		||||
	NEW_SIGNAL(klass, ONLINE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@ struct ril_radio {
 | 
			
		||||
	GObject object;
 | 
			
		||||
	struct ril_radio_priv *priv;
 | 
			
		||||
	enum ril_radio_state state;
 | 
			
		||||
	gboolean online;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef void (*ril_radio_cb_t)(struct ril_radio *radio, void *arg);
 | 
			
		||||
@@ -34,8 +35,11 @@ void ril_radio_power_on(struct ril_radio *radio, gpointer tag);
 | 
			
		||||
void ril_radio_power_off(struct ril_radio *radio, gpointer tag);
 | 
			
		||||
void ril_radio_power_cycle(struct ril_radio *radio);
 | 
			
		||||
void ril_radio_confirm_power_on(struct ril_radio *radio);
 | 
			
		||||
void ril_radio_set_online(struct ril_radio *radio, gboolean online);
 | 
			
		||||
gulong ril_radio_add_state_changed_handler(struct ril_radio *radio,
 | 
			
		||||
					ril_radio_cb_t cb, void *arg);
 | 
			
		||||
gulong ril_radio_add_online_changed_handler(struct ril_radio *radio,
 | 
			
		||||
					ril_radio_cb_t cb, void *arg);
 | 
			
		||||
void ril_radio_remove_handler(struct ril_radio *radio, gulong id);
 | 
			
		||||
void ril_radio_remove_handlers(struct ril_radio *radio, gulong *ids, int n);
 | 
			
		||||
enum ril_radio_state ril_radio_state_parse(const void *data, guint len);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user