mirror of
https://github.com/sailfishos/ofono
synced 2025-11-26 20:31:06 +08:00
[ril] Allow (some) DEVICE_IDENTITY requests to time out. Fixes JB#38632
If GET_SIM_STATUS succeeds but DEVICE_IDENTITY keeps on failing, allow the latter to time out. Some RILs behave that way until the modem has been properly initialized. Conflicts: ofono/drivers/ril/ril_plugin.c
This commit is contained in:
@@ -41,6 +41,8 @@
|
|||||||
#include "ofono.h"
|
#include "ofono.h"
|
||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
|
|
||||||
|
#define RIL_DEVICE_IDENTITY_RETRIES_LAST 2
|
||||||
|
|
||||||
#define RADIO_GID 1001
|
#define RADIO_GID 1001
|
||||||
#define RADIO_UID 1001
|
#define RADIO_UID 1001
|
||||||
#define RIL_SUB_SIZE 4
|
#define RIL_SUB_SIZE 4
|
||||||
@@ -158,6 +160,7 @@ struct ril_slot {
|
|||||||
gulong io_event_id[IO_EVENT_COUNT];
|
gulong io_event_id[IO_EVENT_COUNT];
|
||||||
gulong imei_req_id;
|
gulong imei_req_id;
|
||||||
gulong sim_card_state_event_id;
|
gulong sim_card_state_event_id;
|
||||||
|
gboolean received_sim_status;
|
||||||
guint trace_id;
|
guint trace_id;
|
||||||
guint dump_id;
|
guint dump_id;
|
||||||
guint retry_id;
|
guint retry_id;
|
||||||
@@ -249,7 +252,7 @@ static void ril_plugin_foreach_slot(struct ril_plugin_priv *plugin,
|
|||||||
|
|
||||||
static void ril_plugin_send_screen_state(struct ril_slot *slot)
|
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);
|
GRilIoRequest *req = grilio_request_sized_new(8);
|
||||||
grilio_request_append_int32(req, 1); /* Number of params */
|
grilio_request_append_int32(req, 1); /* Number of params */
|
||||||
grilio_request_append_int32(req, slot->plugin->display_on);
|
grilio_request_append_int32(req, slot->plugin->display_on);
|
||||||
@@ -355,6 +358,7 @@ static void ril_plugin_shutdown_slot(struct ril_slot *slot, gboolean kill_io)
|
|||||||
ril_sim_card_unref(slot->sim_card);
|
ril_sim_card_unref(slot->sim_card);
|
||||||
slot->sim_card_state_event_id = 0;
|
slot->sim_card_state_event_id = 0;
|
||||||
slot->sim_card = NULL;
|
slot->sim_card = NULL;
|
||||||
|
slot->received_sim_status = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slot->io) {
|
if (slot->io) {
|
||||||
@@ -654,10 +658,10 @@ static void ril_plugin_sim_state_changed(struct ril_sim_card *card, void *data)
|
|||||||
{
|
{
|
||||||
struct ril_slot *slot = data;
|
struct ril_slot *slot = data;
|
||||||
struct ril_plugin_priv *plugin = slot->plugin;
|
struct ril_plugin_priv *plugin = slot->plugin;
|
||||||
|
const struct ril_sim_card_status *status = card->status;
|
||||||
gboolean present;
|
gboolean present;
|
||||||
|
|
||||||
if (card && card->status &&
|
if (status && status->card_state == RIL_CARDSTATE_PRESENT) {
|
||||||
card->status->card_state == RIL_CARDSTATE_PRESENT) {
|
|
||||||
DBG("SIM found in slot %u", slot->config.slot);
|
DBG("SIM found in slot %u", slot->config.slot);
|
||||||
present = TRUE;
|
present = TRUE;
|
||||||
} else {
|
} else {
|
||||||
@@ -665,6 +669,36 @@ static void ril_plugin_sim_state_changed(struct ril_sim_card *card, void *data)
|
|||||||
present = FALSE;
|
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) {
|
if (slot->pub.sim_present != present) {
|
||||||
slot->pub.sim_present = present;
|
slot->pub.sim_present = present;
|
||||||
ril_plugin_dbus_signal_sim(plugin->dbus, slot->index, present);
|
ril_plugin_dbus_signal_sim(plugin->dbus, slot->index, present);
|
||||||
@@ -1043,6 +1077,10 @@ static void ril_plugin_slot_connected(struct ril_slot *slot)
|
|||||||
slot->sim_flags);
|
slot->sim_flags);
|
||||||
slot->sim_card_state_event_id = ril_sim_card_add_state_changed_handler(
|
slot->sim_card_state_event_id = ril_sim_card_add_state_changed_handler(
|
||||||
slot->sim_card, ril_plugin_sim_state_changed, slot);
|
slot->sim_card, ril_plugin_sim_state_changed, slot);
|
||||||
|
/* ril_sim_card is expected to perform RIL_REQUEST_GET_SIM_STATUS
|
||||||
|
* asynchronously and report back when request has completed: */
|
||||||
|
GASSERT(!slot->sim_card->status);
|
||||||
|
GASSERT(!slot->received_sim_status);
|
||||||
|
|
||||||
GASSERT(!slot->network);
|
GASSERT(!slot->network);
|
||||||
slot->network = ril_network_new(slot->io, log_prefix, slot->radio,
|
slot->network = ril_network_new(slot->io, log_prefix, slot->radio,
|
||||||
|
|||||||
Reference in New Issue
Block a user