aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-08-10 10:14:25 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-08-23 19:10:58 +0200
commit88f08390df07b9bff9262647de628948014f668a (patch)
treed97494ef8594178be204f2ea4c2f1526b017a788
parentb0e676cb8ae60e6633fa595d67ac150f19d13598 (diff)
broadband-modem-qmi: handle serving system output when selected network is unknown
Seems that sometimes we get 'selected network' as UNKNOWN, but we still have proper registration information. Try to handle those cases. [/dev/cdc-wdm0] Successfully got serving system: Registration state: 'registered' CS: 'detached' PS: 'attached' Selected network: 'unknown' Radio interfaces: '1' [0]: 'lte' Roaming status: 'off' Data service capabilities: '1' [0]: 'lte' Current PLMN: MCC: '311' MNC: '480' Description: 'Verizon Wireless' Roaming indicators: '1' [0]: 'off' (lte)
-rw-r--r--src/mm-broadband-modem-qmi.c80
1 files changed, 46 insertions, 34 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 206f5574..080c5cfd 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -3066,8 +3066,29 @@ common_process_serving_system_3gpp (MMBroadbandModemQmi *self,
&radio_interfaces,
NULL);
- /* Only process 3GPP info */
- if (selected_network != QMI_NAS_NETWORK_TYPE_3GPP) {
+ /* Build access technologies mask */
+ data_service_capabilities = NULL;
+ if (response_output)
+ qmi_message_nas_get_serving_system_output_get_data_service_capability (response_output, &data_service_capabilities, NULL);
+ else
+ qmi_indication_nas_serving_system_output_get_data_service_capability (indication_output, &data_service_capabilities, NULL);
+
+ if (data_service_capabilities)
+ mm_access_technologies =
+ qmi_data_capability_list_to_access_technologies (data_service_capabilities);
+ else
+ mm_access_technologies =
+ qmi_radio_interface_list_to_access_technologies (radio_interfaces);
+
+ /* Only process 3GPP info.
+ * Seen the case already where 'selected_network' gives UNKNOWN but we still
+ * have valid LTE info around. */
+ if (selected_network == QMI_NAS_NETWORK_TYPE_3GPP ||
+ (selected_network == QMI_NAS_NETWORK_TYPE_UNKNOWN &&
+ (mm_access_technologies & MM_IFACE_MODEM_3GPP_ALL_ACCESS_TECHNOLOGIES_MASK))) {
+ mm_dbg ("Processing 3GPP info...");
+ } else {
+ mm_dbg ("No 3GPP info given...");
g_free (self->priv->current_operator_id);
self->priv->current_operator_id = NULL;
g_free (self->priv->current_operator_description);
@@ -3100,20 +3121,6 @@ common_process_serving_system_3gpp (MMBroadbandModemQmi *self,
registration_state,
(roaming == QMI_NAS_ROAMING_INDICATOR_STATUS_ON));
- /* Build access technologies mask */
- data_service_capabilities = NULL;
- if (response_output)
- qmi_message_nas_get_serving_system_output_get_data_service_capability (response_output, &data_service_capabilities, NULL);
- else
- qmi_indication_nas_serving_system_output_get_data_service_capability (indication_output, &data_service_capabilities, NULL);
-
- if (data_service_capabilities)
- mm_access_technologies =
- qmi_data_capability_list_to_access_technologies (data_service_capabilities);
- else
- mm_access_technologies =
- qmi_radio_interface_list_to_access_technologies (radio_interfaces);
-
/* Get and cache operator ID/name */
if ((response_output &&
qmi_message_nas_get_serving_system_output_get_current_plmn (
@@ -4051,24 +4058,6 @@ common_process_serving_system_cdma (MMBroadbandModemQmi *self,
&radio_interfaces,
NULL);
- /* Only process 3GPP2 info */
- if (selected_network != QMI_NAS_NETWORK_TYPE_3GPP2) {
- mm_iface_modem_cdma_update_cdma1x_registration_state (MM_IFACE_MODEM_CDMA (self),
- MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
- 0, 0);
- mm_iface_modem_cdma_update_evdo_registration_state (MM_IFACE_MODEM_CDMA (self),
- MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
- mm_iface_modem_cdma_update_access_technologies (MM_IFACE_MODEM_CDMA (self),
- MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN);
- return;
- }
-
- /* Get SID/NID */
- if (response_output)
- qmi_message_nas_get_serving_system_output_get_cdma_system_id (response_output, &sid, &nid, NULL);
- else
- qmi_indication_nas_serving_system_output_get_cdma_system_id (indication_output, &sid, &nid, NULL);
-
/* Build access technologies mask */
data_service_capabilities = NULL;
if (response_output)
@@ -4086,6 +4075,29 @@ common_process_serving_system_cdma (MMBroadbandModemQmi *self,
mm_access_technologies =
qmi_radio_interface_list_to_access_technologies (radio_interfaces);
+ /* Only process 3GPP2 info */
+ if (selected_network == QMI_NAS_NETWORK_TYPE_3GPP2 ||
+ (selected_network == QMI_NAS_NETWORK_TYPE_UNKNOWN &&
+ (mm_access_technologies & MM_IFACE_MODEM_CDMA_ALL_ACCESS_TECHNOLOGIES_MASK))) {
+ mm_dbg ("Processing CDMA info...");
+ } else {
+ mm_dbg ("No CDMA info given...");
+ mm_iface_modem_cdma_update_cdma1x_registration_state (MM_IFACE_MODEM_CDMA (self),
+ MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
+ 0, 0);
+ mm_iface_modem_cdma_update_evdo_registration_state (MM_IFACE_MODEM_CDMA (self),
+ MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
+ mm_iface_modem_cdma_update_access_technologies (MM_IFACE_MODEM_CDMA (self),
+ MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN);
+ return;
+ }
+
+ /* Get SID/NID */
+ if (response_output)
+ qmi_message_nas_get_serving_system_output_get_cdma_system_id (response_output, &sid, &nid, NULL);
+ else
+ qmi_indication_nas_serving_system_output_get_cdma_system_id (indication_output, &sid, &nid, NULL);
+
/* TODO: Roaming flags */
/* Build registration states */