diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-10 10:14:25 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-23 19:10:58 +0200 |
commit | 88f08390df07b9bff9262647de628948014f668a (patch) | |
tree | d97494ef8594178be204f2ea4c2f1526b017a788 | |
parent | b0e676cb8ae60e6633fa595d67ac150f19d13598 (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.c | 80 |
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 */ |