Hi Pekka,
On 08/26/2010 10:49 AM, Pekka Pessi wrote:
Hi Kristen and all,
This is what I have in mind:
- no sim_pin_check after return from sim_pin_enter() but driver calls
sim_ready_notify()
- if driver has no pin check, retry initialization after sim_ready_notify()
- when SIM requires PUK, change state back to SIM_INSERTED
Isn't it already in state SIM_INSERTED? We go to SIM_INSERTED as soon
as the driver calls sim_inserted_notify()
There is no sim_set_state() yet, it has to be added
PIN2 and PUK2 results from pin query should be ignored, they are
transient and do not prevent SIM from being ready.
--Pekka
--- a/src/sim.c
+++ b/src/sim.c
@@ -80,6 +80,15 @@ struct ofono_sim {
gboolean sdn_ready;
enum ofono_sim_state state;
enum ofono_sim_password_type pin_type;
+ union {
+ struct {
+ unsigned pre_pin_started:1;
+ unsigned pre_pin_done:1;
+ unsigned post_pin_started:1;
+ unsigned ready_notified:1;
+ };
+ unsigned all;
+ } init;
gboolean locked_pins[OFONO_SIM_PASSWORD_SIM_PUK]; /* Number of PINs */
char **language_prefs;
GQueue *simop_q;
@@ -693,8 +702,6 @@ static void sim_enter_pin_cb(const struct
ofono_error *error, void *data)
reply = dbus_message_new_method_return(sim->pending);
__ofono_dbus_pending_reply(&sim->pending, reply);
-
- sim_pin_check(sim);
You do want to check the PIN if this is not PIN/PIN2. E.g. some weird
carrier/corp/etc lock.
}
static DBusMessage *sim_enter_pin(DBusConnection *conn, DBusMessage *msg,
@@ -980,6 +987,12 @@ static void sim_imsi_cb(const struct ofono_error
*error, const char *imsi,
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
ofono_error("Unable to read IMSI, emergency calls only");
+
+ sim->init.post_pin_started = 0;
+
+ if (sim->init.ready_notified)
+ sim_pin_check(sim);
+
I am lost, are we polling the IMSI here? What is the point of
sim_ready_notify then?
return;
}
@@ -1130,6 +1143,9 @@ static void sim_efphase_read_cb(int ok, int
length, int record,
static void sim_initialize_after_pin(struct ofono_sim *sim)
{
+ sim->init.post_pin_started = 1;
+ sim->init.ready_notified = 0;
+
ofono_sim_read(sim, SIM_EFPHASE_FILEID,
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
sim_efphase_read_cb, sim);
@@ -1167,6 +1183,10 @@ static void sim_pin_query_cb(const struct
ofono_error *error,
goto checkdone;
}
+ if (pin_type == OFONO_SIM_PASSWORD_PIN2 ||
+ pin_type == OFONO_SIM_PASSWORD_PUK2)
+ pin_type = OFONO_SIM_PASSWORD_NONE;
+
Again, not sure you can really assume that if there are other PINs present.
if (sim->pin_type != pin_type) {
sim->pin_type = pin_type;
pin_name = sim_passwd_name(pin_type);
@@ -1185,7 +1205,18 @@ static void sim_pin_query_cb(const struct
ofono_error *error,
}
checkdone:
- if (pin_type == OFONO_SIM_PASSWORD_NONE)
+ if (pin_type != OFONO_SIM_PASSWORD_NONE) {
+ int ready_notified = sim->init.ready_notified;
+
+ sim->init.post_pin_started = 0;
+ sim->init.ready_notified = 0;
+
+ sim_set_state(sim, OFONO_SIM_STATE_INSERTED);
+
+ return;
+ }
+
+ if (sim->init.pre_pin_done && !sim->init.post_pin_started)
sim_initialize_after_pin(sim);
I am lost here :) I think we need to talk this over on IRC.
}
@@ -1199,6 +1230,22 @@ static void sim_pin_check(struct ofono_sim *sim)
sim->driver->query_passwd_state(sim, sim_pin_query_cb, sim);
}
+void ofono_sim_ready_notify(struct ofono_sim *sim)
+{
+ if (sim == NULL)
+ return;
+
+ sim->init.ready_notified = 1;
+
+ if (sim->state == OFONO_SIM_STATE_NOT_PRESENT)
+ return;
+
+ if (!sim->init.pre_pin_done)
+ return;
+
+ sim_pin_check(sim);
+}
+
static void sim_efli_read_cb(int ok, int length, int record,
const unsigned char *data,
int record_length, void *userdata)
@@ -1379,6 +1426,8 @@ skip_efpl:
DBUS_TYPE_STRING,
&sim->language_prefs);
+ sim->init.pre_pin_done = 1;
+
sim_pin_check(sim);
}
@@ -1407,6 +1456,8 @@ static void sim_iccid_read_cb(int ok, int
length, int record,
static void sim_initialize(struct ofono_sim *sim)
{
+ sim->init.pre_pin_started = 1;
+
/* Perform SIM initialization according to 3GPP 31.102 Section 5.1.1.2
* The assumption here is that if sim manager is being initialized,
* then sim commands are implemented, and the sim manager is then
static void sim_free_state(struct ofono_sim *sim)
@@ -2007,6 +2060,8 @@ static void sim_free_state(struct ofono_sim *sim)
g_free(sim->iccid);
sim->iccid = NULL;
}
+
+ sim->init.all = 0;
}
void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted)
_______________________________________________
ofono mailing list
ofono(a)ofono.org
http://lists.ofono.org/listinfo/ofono
Regards,
-Denis