summaryrefslogtreecommitdiff
path: root/drivers/qmimodem
diff options
context:
space:
mode:
authorChristophe Ronco <c.ronco@kerlink.fr>2019-07-17 15:29:24 +0200
committerDenis Kenzior <denkenz@gmail.com>2019-07-19 01:19:23 -0500
commit17bf6ac7c0b269bd7ac0678a6f43f920fa8f2fb3 (patch)
tree2bebecfa8ec7feca26f710b967467191c7a5be2f /drivers/qmimodem
parente98af8127fcffc54a6a3c969bbd9a4c5793395ad (diff)
downloadofono-17bf6ac7c0b269bd7ac0678a6f43f920fa8f2fb3.tar.gz
qmimodem: remember lac and cellid
Lac and cellid information are optional in ss_info notifications. Remember them in order to give a correct information each time a notification is received.
Diffstat (limited to 'drivers/qmimodem')
-rw-r--r--drivers/qmimodem/network-registration.c53
1 files changed, 35 insertions, 18 deletions
diff --git a/drivers/qmimodem/network-registration.c b/drivers/qmimodem/network-registration.c
index 1fccb573..04f20c66 100644
--- a/drivers/qmimodem/network-registration.c
+++ b/drivers/qmimodem/network-registration.c
@@ -42,6 +42,8 @@ struct netreg_data {
struct qmi_service *nas;
struct ofono_network_operator operator;
uint8_t current_rat;
+ int lac;
+ int cellid;
bool is_roaming;
};
@@ -166,6 +168,31 @@ static bool extract_ss_info(struct qmi_result *result, int *status,
return true;
}
+static int remember_ss_info(struct netreg_data *data, int status, int lac,
+ int cellid, enum roaming_status roaming)
+{
+ if (roaming == ROAMING_STATUS_ON)
+ data->is_roaming = true;
+ else if (roaming == ROAMING_STATUS_OFF)
+ data->is_roaming = false;
+
+ if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED) {
+ if (lac >= 0)
+ data->lac = lac;
+ if (cellid >= 0)
+ data->cellid = cellid;
+ } else {
+ data->lac = -1;
+ data->cellid = -1;
+ }
+
+ if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED &&
+ data->is_roaming)
+ status = NETWORK_REGISTRATION_STATUS_ROAMING;
+
+ return status;
+}
+
static void ss_info_notify(struct qmi_result *result, void *user_data)
{
struct ofono_netreg *netreg = user_data;
@@ -183,16 +210,10 @@ static void ss_info_notify(struct qmi_result *result, void *user_data)
&data->operator))
return;
- if (roaming == ROAMING_STATUS_ON)
- data->is_roaming = true;
- else if (roaming == ROAMING_STATUS_OFF)
- data->is_roaming = false;
-
- if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED &&
- data->is_roaming)
- status = NETWORK_REGISTRATION_STATUS_ROAMING;
+ status = remember_ss_info(data, status, lac, cellid, roaming);
- ofono_netreg_status_notify(netreg, status, lac, cellid, tech);
+ ofono_netreg_status_notify(netreg, status, data->lac, data->cellid,
+ tech);
}
static void get_ss_info_cb(struct qmi_result *result, void *user_data)
@@ -216,16 +237,10 @@ static void get_ss_info_cb(struct qmi_result *result, void *user_data)
return;
}
- if (roaming == ROAMING_STATUS_ON)
- data->is_roaming = true;
- else if (roaming == ROAMING_STATUS_OFF)
- data->is_roaming = false;
-
- if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED &&
- data->is_roaming)
- status = NETWORK_REGISTRATION_STATUS_ROAMING;
+ status = remember_ss_info(data, status, lac, cellid, roaming);
- CALLBACK_WITH_SUCCESS(cb, status, lac, cellid, tech, cbd->data);
+ CALLBACK_WITH_SUCCESS(cb, status, data->lac, data->cellid, tech,
+ cbd->data);
}
static void qmi_registration_status(struct ofono_netreg *netreg,
@@ -613,6 +628,8 @@ static int qmi_netreg_probe(struct ofono_netreg *netreg,
data->current_rat = QMI_NAS_NETWORK_RAT_NO_CHANGE;
data->is_roaming = false;
+ data->lac = -1;
+ data->cellid = -1;
ofono_netreg_set_data(netreg, data);