[PATCH] ublox: Correct the USBCONF reply prefix
by richard.rojfors@gmail.com
From: Richard Röjfors <richard(a)puffinpack.se>
According to the u-blox AT Commands Manual and my tests
the response prefix of AT+UUSBCONF is "+UUSBCONF:", including
a colon. The colon was missing in the code, causing next step
to parse a number to fail, since a colon is not a number.
---
plugins/ublox.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/ublox.c b/plugins/ublox.c
index dc001765..142a5af7 100644
--- a/plugins/ublox.c
+++ b/plugins/ublox.c
@@ -164,7 +164,7 @@ static void query_usbconf_cb(gboolean ok,
g_at_result_iter_init(&iter, result);
retry:
- if (!g_at_result_iter_next(&iter, "+UUSBCONF")) {
+ if (!g_at_result_iter_next(&iter, "+UUSBCONF:")) {
ofono_error("Unable to query USB configuration");
goto error;
}
--
2.19.1
1 year, 9 months
[PATCH] ublox: Do not leave vendor_family unset
by richard.rojfors@gmail.com
From: Richard Röjfors <richard(a)puffinpack.se>
In a recent patch vendor family was only set if the device
did not support USBCONF, but that resulted in drivers
being registered the "generic" vendor. That caused
for instance netreg to use incorrect cmer mode and fail
on TOBY-L210.
---
plugins/ublox.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/plugins/ublox.c b/plugins/ublox.c
index dc001765..355bdf9e 100644
--- a/plugins/ublox.c
+++ b/plugins/ublox.c
@@ -227,6 +227,8 @@ static void query_model_cb(gboolean ok, GAtResult *result, gpointer user_data)
DBG("Model: %s", data->model->name);
+ data->vendor_family = OFONO_VENDOR_UBLOX;
+
if (data->model->flags & UBLOX_F_HAVE_USBCONF) {
if (g_at_chat_send(data->aux, "AT+UUSBCONF?", uusbconf_prefix,
query_usbconf_cb, modem, NULL))
@@ -234,8 +236,6 @@ static void query_model_cb(gboolean ok, GAtResult *result, gpointer user_data)
ofono_error("Unable to query USB configuration");
goto fail;
- } else {
- data->vendor_family = OFONO_VENDOR_UBLOX;
}
if (g_at_chat_send(data->aux, "AT+CFUN=4", none_prefix,
--
2.19.1
1 year, 9 months
[PATCH 4/5] xmm7modem: handling of dual sim single active feature
by Antara Borwankar
Handled DSSA use case for xmm7modem. Added driver function
to switch between available card slots for SIM.
Only one SIM will be active at a given time. On calling this
function the active SIM will be removed and the card slot made
inactive and SIM in the other card slot will be made active.
Use case is similar to a SIM swap/change where one SIM is replaced
another SIM in the same slot.
---
drivers/atmodem/sim.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 114 insertions(+), 1 deletion(-)
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c
index 5f66a09..5fdfe30 100644
--- a/drivers/atmodem/sim.c
+++ b/drivers/atmodem/sim.c
@@ -75,6 +75,7 @@ static const char *cuad_prefix[] = { "+CUAD:", NULL };
static const char *ccho_prefix[] = { "+CCHO:", NULL };
static const char *crla_prefix[] = { "+CRLA:", NULL };
static const char *cgla_prefix[] = { "+CGLA:", NULL };
+static const char *xcmscsc_prefix[] = { "+XCMSCSC:", NULL};
static const char *none_prefix[] = { NULL };
static void append_file_path(char *buf, const unsigned char *path,
@@ -1160,6 +1161,7 @@ static void at_pin_retries_query(struct ofono_sim *sim,
DBG("");
switch (sd->vendor) {
+ case OFONO_VENDOR_XMM:
case OFONO_VENDOR_IFX:
if (g_at_chat_send(sd->chat, "AT+XPINCNT", xpincnt_prefix,
xpincnt_cb, cbd, g_free) > 0)
@@ -1920,6 +1922,76 @@ static void at_logical_access(struct ofono_sim *sim, int session_id,
CALLBACK_WITH_FAILURE(cb, NULL, 0, data);
}
+static void xcmscsc_query_cb(gboolean ok, GAtResult *result, gpointer user)
+{
+ struct ofono_sim *sim = user;
+ struct sim_data *sd = ofono_sim_get_data(sim);
+ GAtResultIter iter;
+ int active_slot;
+
+ if (!ok)
+ goto done;
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+XCMSCSC:"))
+ goto done;
+
+ g_at_result_iter_skip_next(&iter);
+ g_at_result_iter_skip_next(&iter);
+
+ g_at_result_iter_next_number(&iter, &active_slot);
+
+ /* set active SIM slot */
+ ofono_sim_set_active_card_slot(sim, active_slot+1);
+
+done:
+ /* Query supported <fac>s */
+ g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
+ at_clck_query_cb, sim, NULL);
+}
+
+static void at_xcmscsc_test_cb(gboolean ok, GAtResult *result, gpointer user)
+{
+ struct ofono_sim *sim = user;
+ struct sim_data *sd = ofono_sim_get_data(sim);
+ GAtResultIter iter;
+ int card_slot_count;
+
+ if (!ok)
+ goto done;
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+XCMSCSC:"))
+ goto done;
+
+ g_at_result_iter_skip_next(&iter);
+ g_at_result_iter_skip_next(&iter);
+
+ if (!g_at_result_iter_open_list(&iter))
+ goto done;
+
+ g_at_result_iter_skip_next(&iter);
+
+ if (!g_at_result_iter_next_number(&iter, &card_slot_count))
+ goto done;
+
+ /* Set num slots */
+ ofono_sim_set_card_slot_count(sim, card_slot_count+1);
+
+done:
+ /* enable reporting of MSIM remap status information
+ and enable automatic acceptance of MSIM Remap
+ acknowledgement. */
+ g_at_chat_send(sd->chat, "AT+XCMSRS=2", none_prefix,
+ NULL, NULL, NULL);
+
+ /* Query active card slot */
+ g_at_chat_send(sd->chat, "AT+XCMSCSC?", xcmscsc_prefix,
+ xcmscsc_query_cb, sim, NULL);
+}
+
static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
void *data)
{
@@ -1938,6 +2010,14 @@ static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
if (at_clck_cpwd_fac[i])
sd->passwd_type_mask |= (1 << i);
+ /* set default values */
+ ofono_sim_set_card_slot_count(sim, 1);
+ ofono_sim_set_active_card_slot(sim, 1);
+
+ if (sd->vendor == OFONO_VENDOR_XMM)
+ return g_at_chat_send(sd->chat, "AT+XCMSCSC=?", xcmscsc_prefix,
+ at_xcmscsc_test_cb, sim, NULL) ? 0 : -1;
+
/* Query supported <fac>s */
return g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
at_clck_query_cb, sim, NULL) ? 0 : -1;
@@ -1957,6 +2037,38 @@ static void at_sim_remove(struct ofono_sim *sim)
g_free(sd);
}
+static void xcmscsc_cb(gboolean ok, GAtResult *result,
+ gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_sim_set_active_card_slot_cb_t cb = cbd->cb;
+ struct ofono_error error;
+
+ decode_at_error(&error, g_at_result_final_response(result));
+
+ if (cb)
+ cb(&error, cbd->data);
+}
+
+static void at_set_active_card_slot(struct ofono_sim *sim, unsigned int index,
+ ofono_sim_set_active_card_slot_cb_t cb, void *data)
+{
+ struct sim_data *sd = ofono_sim_get_data(sim);
+ struct cb_data *cbd = cb_data_new(cb, data);
+ char cmd[43];
+
+ /* Enable single SIM mode for indicated card slot id */
+ snprintf(cmd, sizeof(cmd), "AT+XCMSCSC=1,0,%u,1", index);
+
+ if (g_at_chat_send(sd->chat, cmd, none_prefix, xcmscsc_cb,
+ cbd, g_free) > 0)
+ return;
+
+ g_free(cbd);
+
+ CALLBACK_WITH_FAILURE(cb, data);
+}
+
static const struct ofono_sim_driver driver = {
.name = "atmodem",
.probe = at_sim_probe,
@@ -1982,7 +2094,8 @@ static const struct ofono_sim_driver driver = {
.session_read_binary = at_session_read_binary,
.session_read_record = at_session_read_record,
.session_read_info = at_session_read_info,
- .logical_access = at_logical_access
+ .logical_access = at_logical_access,
+ .set_active_card_slot = at_set_active_card_slot
};
static const struct ofono_sim_driver driver_noef = {
--
1.9.1
1 year, 9 months
[PATCH 3/5] sim: handling of dual sim single active feature
by Antara Borwankar
Added implementation for handling CardSlotCount and ActiveCardSlot
properties for DSSA use case.
---
src/sim.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/src/sim.c b/src/sim.c
index c6ea4b0..7750f99 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -131,6 +131,10 @@ struct ofono_sim {
struct ofono_atom *atom;
unsigned int hfp_watch;
+ unsigned int card_slot_count;
+ unsigned int active_card_slot;
+ unsigned int pending_active_card_slot;
+
GSList *aid_sessions;
GSList *aid_list;
char *impi;
@@ -473,6 +477,13 @@ static DBusMessage *sim_get_properties(DBusConnection *conn,
get_pin_retries(sim, &pin_retries_dict, &dbus_retries);
ofono_dbus_dict_append_dict(&dict, "Retries", DBUS_TYPE_BYTE,
&pin_retries_dict);
+
+ ofono_dbus_dict_append(&dict, "CardSlotCount", DBUS_TYPE_UINT32,
+ &sim->card_slot_count);
+
+ ofono_dbus_dict_append(&dict, "ActiveCardSlot", DBUS_TYPE_UINT32,
+ &sim->active_card_slot);
+
g_free(pin_retries_dict);
g_free(dbus_retries);
@@ -657,6 +668,28 @@ static gboolean set_own_numbers(struct ofono_sim *sim,
return TRUE;
}
+static void sim_set_slot_callback(const struct ofono_error *error, void *data)
+{
+ struct ofono_sim *sim = data;
+ DBusMessage *reply;
+
+ if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
+ DBG("Error setting radio access mode");
+
+ sim->pending_active_card_slot = sim->active_card_slot;
+
+ reply = __ofono_error_failed(sim->pending);
+ __ofono_dbus_pending_reply(&sim->pending, reply);
+
+ return;
+ }
+
+ sim->active_card_slot = sim->pending_active_card_slot;
+
+ reply = dbus_message_new_method_return(sim->pending);
+ __ofono_dbus_pending_reply(&sim->pending, reply);
+}
+
static DBusMessage *sim_set_property(DBusConnection *conn, DBusMessage *msg,
void *data)
{
@@ -724,6 +757,36 @@ error:
if (set_ok)
return NULL;
+ } else if (!strcmp(name, "ActiveCardSlot")) {
+ dbus_uint32_t value;
+
+ dbus_message_iter_next(&iter);
+
+ if (sim->driver->set_active_card_slot == NULL)
+ return __ofono_error_not_implemented(msg);
+
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
+ return __ofono_error_invalid_args(msg);
+
+ dbus_message_iter_recurse(&iter, &var);
+
+ if (dbus_message_iter_get_arg_type(&var) != DBUS_TYPE_UINT32)
+ return __ofono_error_invalid_args(msg);
+
+ dbus_message_iter_get_basic(&var, &value);
+
+ if (value <= 0 || value > sim->card_slot_count)
+ return __ofono_error_invalid_args(msg);
+
+ if (sim->active_card_slot == value)
+ return dbus_message_new_method_return(msg);
+
+ sim->pending = dbus_message_ref(msg);
+ sim->pending_active_card_slot = value;
+
+ sim->driver->set_active_card_slot(sim, value-1, sim_set_slot_callback, sim);
+ /* will be saved in simmanager on success response*/
+ return NULL;
}
return __ofono_error_invalid_args(msg);
@@ -3803,3 +3866,16 @@ int ofono_sim_logical_access(struct ofono_sim *sim, int session_id,
return 0;
}
+
+void ofono_sim_set_card_slot_count(struct ofono_sim *sim, unsigned int val)
+{
+ if (sim)
+ sim->card_slot_count = val;
+}
+
+void ofono_sim_set_active_card_slot(struct ofono_sim *sim, unsigned int val)
+{
+ if (sim)
+ sim->active_card_slot = val;
+}
+
--
1.9.1
1 year, 9 months
[PATCH 2/5] sim: Added set function for CardSlotCount and ActiveCardSlot
by Antara Borwankar
Adding set function definition for CardSlotCount and ActiveCardSlot
properties.
---
include/sim.h | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/include/sim.h b/include/sim.h
index fad4c0d..0a6b879 100644
--- a/include/sim.h
+++ b/include/sim.h
@@ -132,6 +132,9 @@ typedef void (*ofono_sim_close_channel_cb_t)(const struct ofono_error *error,
typedef void (*ofono_sim_logical_access_cb_t)(const struct ofono_error *error,
const unsigned char *resp, unsigned int len, void *data);
+typedef void (*ofono_sim_set_active_card_slot_cb_t)(const struct ofono_error *error,
+ void *data);
+
struct ofono_sim_driver {
const char *name;
int (*probe)(struct ofono_sim *sim, unsigned int vendor, void *data);
@@ -205,6 +208,8 @@ struct ofono_sim_driver {
void (*logical_access)(struct ofono_sim *sim, int session_id,
const unsigned char *pdu, unsigned int len,
ofono_sim_logical_access_cb_t cb, void *data);
+ void (*set_active_card_slot)(struct ofono_sim *sim, unsigned int index,
+ ofono_sim_set_active_card_slot_cb_t cb, void *data);
};
int ofono_sim_driver_register(const struct ofono_sim_driver *d);
@@ -219,6 +224,9 @@ void ofono_sim_remove(struct ofono_sim *sim);
void ofono_sim_set_data(struct ofono_sim *sim, void *data);
void *ofono_sim_get_data(struct ofono_sim *sim);
+void ofono_sim_set_card_slot_count(struct ofono_sim *sim, unsigned int val);
+void ofono_sim_set_active_card_slot(struct ofono_sim *sim,
+ unsigned int val);
const char *ofono_sim_get_imsi(struct ofono_sim *sim);
const char *ofono_sim_get_mcc(struct ofono_sim *sim);
--
1.9.1
1 year, 9 months
[PATCH 1/5] sim: Added new properties to simmanager for DSSA
by Antara Borwankar
Adding two new properties to sim manager interface to handle
dual SIM single active use case.
CardSlotCount [readonly]
Contains the count of number of SIM card slots available.
ActiveCardSlot [readwrite]
Contains the index of the currently active SIM card slot
for dual SIM single active mode.
---
doc/sim-api.txt | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/doc/sim-api.txt b/doc/sim-api.txt
index bce47c1..c69cc74 100644
--- a/doc/sim-api.txt
+++ b/doc/sim-api.txt
@@ -205,3 +205,15 @@ Properties boolean Present [readonly]
Contains the SIM's ImsPrivateIdentity, read from the
ISIM.
+
+ uint32 CardSlotCount [readonly]
+
+ Contains the count of number of SIM card slots available.
+
+ uint32 ActiveCardSlot [readwrite]
+
+ Contains the index of the currently active SIM card slot
+ for dual SIM single active mode.
+
+ This property will range from 1 (default) to
+ CardSlotCount (max) value.
--
1.9.1
1 year, 9 months
[PATCH 5/5] xmm7modem: Changes in plugin for DSSA functionality
by Antara Borwankar
Changed the sim driver vendor for xmm7modem from
OFONO_VENDOR_IFX to OFONO_VENDOR_XMM to handle DSSA functionality.
---
plugins/xmm7xxx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/xmm7xxx.c b/plugins/xmm7xxx.c
index 90e52fb..23a7d4e 100644
--- a/plugins/xmm7xxx.c
+++ b/plugins/xmm7xxx.c
@@ -1223,7 +1223,7 @@ static void xmm7xxx_pre_sim(struct ofono_modem *modem)
DBG("%p", modem);
ofono_devinfo_create(modem, OFONO_VENDOR_IFX, "atmodem", data->chat);
- data->sim = ofono_sim_create(modem, OFONO_VENDOR_IFX, "atmodem",
+ data->sim = ofono_sim_create(modem, OFONO_VENDOR_XMM, "atmodem",
data->chat);
}
--
1.9.1
1 year, 9 months
[PATCH 5/6] xmm7modem: handling of dual sim single active feature
by Antara Borwankar
Handled DSSA use case for xmm7modem. Added driver function
to switch between available card slots for SIM.
Only one SIM will be active at a given time. On calling this
function the active SIM will be removed and the card slot made
inactive and SIM in the other card slot will be made active.
Use case is similar to a SIM swap/change where one SIM is replaced
another SIM in the same slot.
---
drivers/atmodem/sim.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 79 insertions(+), 1 deletion(-)
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c
index 5f66a09..88e3898 100644
--- a/drivers/atmodem/sim.c
+++ b/drivers/atmodem/sim.c
@@ -75,6 +75,7 @@ static const char *cuad_prefix[] = { "+CUAD:", NULL };
static const char *ccho_prefix[] = { "+CCHO:", NULL };
static const char *crla_prefix[] = { "+CRLA:", NULL };
static const char *cgla_prefix[] = { "+CGLA:", NULL };
+static const char *csus_prefix[] = { "+CSUS:", NULL};
static const char *none_prefix[] = { NULL };
static void append_file_path(char *buf, const unsigned char *path,
@@ -1160,6 +1161,7 @@ static void at_pin_retries_query(struct ofono_sim *sim,
DBG("");
switch (sd->vendor) {
+ case OFONO_VENDOR_XMM:
case OFONO_VENDOR_IFX:
if (g_at_chat_send(sd->chat, "AT+XPINCNT", xpincnt_prefix,
xpincnt_cb, cbd, g_free) > 0)
@@ -1920,6 +1922,41 @@ static void at_logical_access(struct ofono_sim *sim, int session_id,
CALLBACK_WITH_FAILURE(cb, NULL, 0, data);
}
+static void at_csus_query_cb(gboolean ok, GAtResult *result, gpointer user)
+{
+ struct ofono_sim *sim = user;
+ struct sim_data *sd = ofono_sim_get_data(sim);
+ GAtResultIter iter;
+ int num_slots;
+
+ if (!ok)
+ goto done;
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, "+CSUS:"))
+ goto done;
+
+ /* Set num slots */
+ g_at_result_iter_next_number(&iter, &num_slots);
+
+ ofono_sim_set_card_slot_num(sim, num_slots);
+
+ /* SIM1 slot will be active by default */
+ ofono_sim_set_active_card_slot_num(sim, 1);
+
+ /* enable reporting of MSIM remap status information
+ and enable automatic acceptance of MSIM Remap
+ acknowledgement. */
+ g_at_chat_send(sd->chat, "AT+XCMSRS=2", none_prefix,
+ NULL, NULL, NULL);
+
+done:
+ /* Query supported <fac>s */
+ g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
+ at_clck_query_cb, sim, NULL);
+}
+
static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
void *data)
{
@@ -1938,6 +1975,10 @@ static int at_sim_probe(struct ofono_sim *sim, unsigned int vendor,
if (at_clck_cpwd_fac[i])
sd->passwd_type_mask |= (1 << i);
+ if (sd->vendor == OFONO_VENDOR_XMM)
+ return g_at_chat_send(sd->chat, "AT+CSUS=?", csus_prefix,
+ at_csus_query_cb, sim, NULL) ? 0 : -1;
+
/* Query supported <fac>s */
return g_at_chat_send(sd->chat, "AT+CLCK=?", clck_prefix,
at_clck_query_cb, sim, NULL) ? 0 : -1;
@@ -1957,6 +1998,42 @@ static void at_sim_remove(struct ofono_sim *sim)
g_free(sd);
}
+static void at_set_active_sim_cb(gboolean ok, GAtResult *result,
+ gpointer user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_sim_active_slot_change_cb_t cb = cbd->cb;
+ struct ofono_error error;
+
+ decode_at_error(&error, g_at_result_final_response(result));
+
+ if (cb)
+ cb(&error, cbd->data);
+}
+
+static void at_set_active_sim(struct ofono_sim *sim, unsigned int index,
+ ofono_sim_active_slot_change_cb_t cb, void *data)
+{
+ struct sim_data *sd = ofono_sim_get_data(sim);
+ struct cb_data *cbd = cb_data_new(cb, data);
+ char cmd[43];
+
+ /* AT+XCMSCSC=[<n>][,<mode>,<slot_id>,<power_options>]
+ <n> Enable +XCMSCSCI URC reporting,
+ <mode> single sim modem (SSIM),
+ <slot_id> Indicates SIM slot id,
+ <power_options> keep both slots powered. */
+ snprintf(cmd, sizeof(cmd), "AT+XCMSCSC=1,0,%u,1", index);
+
+ if (g_at_chat_send(sd->chat, cmd, none_prefix, at_set_active_sim_cb,
+ cbd, g_free) > 0)
+ return;
+
+ g_free(cbd);
+
+ CALLBACK_WITH_FAILURE(cb, data);
+}
+
static const struct ofono_sim_driver driver = {
.name = "atmodem",
.probe = at_sim_probe,
@@ -1982,7 +2059,8 @@ static const struct ofono_sim_driver driver = {
.session_read_binary = at_session_read_binary,
.session_read_record = at_session_read_record,
.session_read_info = at_session_read_info,
- .logical_access = at_logical_access
+ .logical_access = at_logical_access,
+ .set_active_sim = at_set_active_sim
};
static const struct ofono_sim_driver driver_noef = {
--
1.9.1
1 year, 9 months
[PATCH 3/6] sim: Added set function for CardSlotCount and ActiveCardSlot
by Antara Borwankar
Adding set function definition for CardSlotCount and ActiveCardSlot
properties.
---
include/sim.h | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/include/sim.h b/include/sim.h
index fad4c0d..be5d82f 100644
--- a/include/sim.h
+++ b/include/sim.h
@@ -132,6 +132,9 @@ typedef void (*ofono_sim_close_channel_cb_t)(const struct ofono_error *error,
typedef void (*ofono_sim_logical_access_cb_t)(const struct ofono_error *error,
const unsigned char *resp, unsigned int len, void *data);
+typedef void (*ofono_sim_active_slot_change_cb_t)(const struct ofono_error *error,
+ void *data);
+
struct ofono_sim_driver {
const char *name;
int (*probe)(struct ofono_sim *sim, unsigned int vendor, void *data);
@@ -205,6 +208,8 @@ struct ofono_sim_driver {
void (*logical_access)(struct ofono_sim *sim, int session_id,
const unsigned char *pdu, unsigned int len,
ofono_sim_logical_access_cb_t cb, void *data);
+ void (*set_active_sim)(struct ofono_sim *sim, unsigned int index,
+ ofono_sim_active_slot_change_cb_t cb, void *data);
};
int ofono_sim_driver_register(const struct ofono_sim_driver *d);
@@ -219,6 +224,9 @@ void ofono_sim_remove(struct ofono_sim *sim);
void ofono_sim_set_data(struct ofono_sim *sim, void *data);
void *ofono_sim_get_data(struct ofono_sim *sim);
+void ofono_sim_set_card_slot_num(struct ofono_sim *sim, unsigned int val);
+void ofono_sim_set_active_card_slot_num(struct ofono_sim *sim,
+ unsigned int val);
const char *ofono_sim_get_imsi(struct ofono_sim *sim);
const char *ofono_sim_get_mcc(struct ofono_sim *sim);
--
1.9.1
1 year, 10 months