[ril] Fixed online state tracking. Fixes JB#39592

This commit is contained in:
Slava Monich
2017-09-05 12:14:52 +03:00
parent 4054f09b60
commit 83441bc203
5 changed files with 40 additions and 22 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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);
}
/*

View File

@@ -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);