From 17bf6ac7c0b269bd7ac0678a6f43f920fa8f2fb3 Mon Sep 17 00:00:00 2001 From: Christophe Ronco Date: Wed, 17 Jul 2019 15:29:24 +0200 Subject: [PATCH] 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. --- drivers/qmimodem/network-registration.c | 53 ++++++++++++++++--------- 1 file 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; + status = remember_ss_info(data, status, lac, cellid, roaming); - if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED && - data->is_roaming) - status = NETWORK_REGISTRATION_STATUS_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; + status = remember_ss_info(data, status, lac, cellid, roaming); - if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED && - data->is_roaming) - status = NETWORK_REGISTRATION_STATUS_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);