blob: 4f97bb65818f2644faa8c20fa112925f998b92ff [file]
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
*
* Copyright (C) 2012 Google, Inc.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc.
*/
#ifndef MM_MODEM_HELPERS_QMI_H
#define MM_MODEM_HELPERS_QMI_H
#include <config.h>
#include <ModemManager.h>
#include <libqmi-glib.h>
#include "mm-port.h"
#define MM_MODEM_CAPABILITY_MULTIMODE (MM_MODEM_CAPABILITY_GSM_UMTS | MM_MODEM_CAPABILITY_CDMA_EVDO)
/*****************************************************************************/
/* QMI/DMS to MM translations */
MMModemCapability mm_modem_capability_from_qmi_radio_interface (QmiDmsRadioInterface network,
gpointer log_object);
MMModemMode mm_modem_mode_from_qmi_radio_interface (QmiDmsRadioInterface network,
gpointer log_object);
MMModemLock mm_modem_lock_from_qmi_uim_pin_status (QmiDmsUimPinStatus status,
gboolean pin1);
gboolean mm_pin_enabled_from_qmi_uim_pin_status (QmiDmsUimPinStatus status);
QmiDmsUimFacility mm_3gpp_facility_to_qmi_uim_facility (MMModem3gppFacility mm);
GArray *mm_modem_bands_from_qmi_band_capabilities (QmiDmsBandCapability qmi_bands,
QmiDmsLteBandCapability qmi_lte_bands,
GArray *extended_qmi_lte_bands,
GArray *qmi_nr5g_bands,
gpointer log_object);
/*****************************************************************************/
/* QMI/NAS to MM translations */
MMModemAccessTechnology mm_modem_access_technology_from_qmi_radio_interface (QmiNasRadioInterface interface);
MMModemAccessTechnology mm_modem_access_technologies_from_qmi_radio_interface_array (GArray *radio_interfaces);
MMModemAccessTechnology mm_modem_access_technology_from_qmi_data_capability (QmiNasDataCapability cap);
MMModemAccessTechnology mm_modem_access_technologies_from_qmi_data_capability_array (GArray *data_capabilities);
MMModemMode mm_modem_mode_from_qmi_nas_radio_interface (QmiNasRadioInterface iface);
MMModemMode mm_modem_mode_from_qmi_radio_technology_preference (QmiNasRadioTechnologyPreference qmi);
QmiNasRadioTechnologyPreference mm_modem_mode_to_qmi_radio_technology_preference (MMModemMode mode,
gboolean is_cdma);
MMModemMode mm_modem_mode_from_qmi_rat_mode_preference (QmiNasRatModePreference qmi);
QmiNasRatModePreference mm_modem_mode_to_qmi_rat_mode_preference (MMModemMode mode,
gboolean is_cdma,
gboolean is_3gpp);
MMModemCapability mm_modem_capability_from_qmi_rat_mode_preference (QmiNasRatModePreference qmi);
QmiNasRatModePreference mm_modem_capability_to_qmi_rat_mode_preference (MMModemCapability caps);
GArray *mm_modem_capability_to_qmi_acquisition_order_preference (MMModemCapability caps);
GArray *mm_modem_mode_to_qmi_acquisition_order_preference (MMModemMode allowed,
MMModemMode preferred,
GArray *all);
MMModemCapability mm_modem_capability_from_qmi_radio_technology_preference (QmiNasRadioTechnologyPreference qmi);
QmiNasRadioTechnologyPreference mm_modem_capability_to_qmi_radio_technology_preference (MMModemCapability caps);
MMModemCapability mm_modem_capability_from_qmi_band_preference (QmiNasBandPreference qmi);
MMModemMode mm_modem_mode_from_qmi_gsm_wcdma_acquisition_order_preference (QmiNasGsmWcdmaAcquisitionOrderPreference qmi,
gpointer log_object);
QmiNasGsmWcdmaAcquisitionOrderPreference mm_modem_mode_to_qmi_gsm_wcdma_acquisition_order_preference (MMModemMode mode,
gpointer log_object);
GArray *mm_modem_bands_from_qmi_rf_band_information_array (GArray *info_array);
GArray *mm_modem_bands_from_qmi_band_preference (QmiNasBandPreference qmi_bands,
QmiNasLteBandPreference qmi_lte_bands,
const guint64 *extended_qmi_lte_bands,
guint extended_qmi_lte_bands_size,
const guint64 *qmi_nr5g_bands,
guint qmi_nr5g_bands_size,
gpointer log_object);
void mm_modem_bands_to_qmi_band_preference (GArray *mm_bands,
QmiNasBandPreference *qmi_bands,
QmiNasLteBandPreference *qmi_lte_bands,
guint64 *extended_qmi_lte_bands,
guint extended_qmi_lte_bands_size,
guint64 *qmi_nr5g_bands,
guint qmi_nr5g_bands_size,
gpointer log_object);
MMModem3gppRegistrationState mm_modem_3gpp_registration_state_from_qmi_registration_state (QmiNasAttachState attach_state,
QmiNasRegistrationState registration_state,
gboolean roaming);
MMModemCdmaRegistrationState mm_modem_cdma_registration_state_from_qmi_registration_state (QmiNasRegistrationState registration_state);
MMModemCdmaActivationState mm_modem_cdma_activation_state_from_qmi_activation_state (QmiDmsActivationState state);
MMNetworkError mm_modem_nw_error_from_qmi_nw_error (QmiNasRejectCause nw_error);
/*****************************************************************************/
/* QMI NAS System Info processor */
void mm_modem_registration_state_from_qmi_system_info (QmiMessageNasGetSystemInfoOutput *response_output,
QmiIndicationNasSystemInfoOutput *indication_output,
MMModem3gppRegistrationState *out_cs_registration_state,
MMModem3gppRegistrationState *out_ps_registration_state,
MMModem3gppRegistrationState *out_eps_registration_state,
MMModem3gppRegistrationState *out_5gs_registration_state,
guint16 *out_lac,
guint16 *out_tac,
guint32 *out_cid,
gchar **out_operator_id,
MMModemAccessTechnology *out_act,
gpointer log_object);
/*****************************************************************************/
/* QMI/WMS to MM translations */
QmiWmsStorageType mm_sms_storage_to_qmi_storage_type (MMSmsStorage storage);
MMSmsStorage mm_sms_storage_from_qmi_storage_type (QmiWmsStorageType qmi_storage);
MMSmsState mm_sms_state_from_qmi_message_tag (QmiWmsMessageTagType tag);
MMCbmState mm_cbm_state_from_qmi_message_tag (QmiWmsMessageTagType tag);
/*****************************************************************************/
/* QMI/WDS to MM translations */
QmiWdsAuthentication mm_bearer_allowed_auth_to_qmi_authentication (MMBearerAllowedAuth auth,
gpointer log_object,
GError **error);
MMBearerAllowedAuth mm_bearer_allowed_auth_from_qmi_authentication (QmiWdsAuthentication auth);
MMBearerIpFamily mm_bearer_ip_family_from_qmi_ip_support_type (QmiWdsIpSupportType ip_support_type);
MMBearerIpFamily mm_bearer_ip_family_from_qmi_pdp_type (QmiWdsPdpType pdp_type);
gboolean mm_bearer_ip_family_to_qmi_pdp_type (MMBearerIpFamily ip_family,
QmiWdsPdpType *out_pdp_type);
QmiWdsApnTypeMask mm_bearer_apn_type_to_qmi_apn_type (MMBearerApnType apn_type,
gpointer log_object);
MMBearerApnType mm_bearer_apn_type_from_qmi_apn_type (QmiWdsApnTypeMask apn_type);
/*****************************************************************************/
/* QMI/WDA to MM translations */
QmiDataEndpointType mm_port_net_driver_to_qmi_endpoint_type (const gchar *net_driver);
/*****************************************************************************/
/* QMI/OMA to MM translations */
MMOmaSessionType mm_oma_session_type_from_qmi_oma_session_type (QmiOmaSessionType qmi_session_type);
QmiOmaSessionType mm_oma_session_type_to_qmi_oma_session_type (MMOmaSessionType mm_session_type);
MMOmaSessionState mm_oma_session_state_from_qmi_oma_session_state (QmiOmaSessionState qmi_session_state);
MMOmaSessionStateFailedReason mm_oma_session_state_failed_reason_from_qmi_oma_session_failed_reason (QmiOmaSessionFailedReason qmi_session_failed_reason);
/*****************************************************************************/
/* Utility to gather current capabilities from various sources */
typedef struct {
/* Whether this is a multimode device or not */
gboolean multimode;
/* NAS System Selection Preference */
QmiNasRatModePreference nas_ssp_mode_preference_mask;
/* NAS Technology Preference */
QmiNasRadioTechnologyPreference nas_tp_mask;
/* DMS Capabilities */
MMModemCapability dms_capabilities;
} MMQmiCurrentCapabilitiesContext;
MMModemCapability mm_current_capability_from_qmi_current_capabilities_context (MMQmiCurrentCapabilitiesContext *ctx,
gpointer log_object);
/*****************************************************************************/
/* Utility to build list of supported capabilities from various sources */
typedef struct {
/* Whether this is a multimode device or not */
gboolean multimode;
/* NAS System Selection Preference */
gboolean nas_ssp_supported;
/* NAS Technology Preference */
gboolean nas_tp_supported;
/* DMS Capabilities */
MMModemCapability dms_capabilities;
} MMQmiSupportedCapabilitiesContext;
GArray *mm_supported_capabilities_from_qmi_supported_capabilities_context (MMQmiSupportedCapabilitiesContext *ctx,
gpointer log_object);
/*****************************************************************************/
/* Utility to build list of supported modes from various sources */
typedef struct {
/* Whether this is a multimode device or not */
gboolean multimode;
/* NAS System Selection Preference */
gboolean nas_ssp_supported;
/* NAS Technology Preference */
gboolean nas_tp_supported;
/* Mask with all supported modes */
MMModemMode all;
/* Current Capabilities */
MMModemCapability current_capabilities;
} MMQmiSupportedModesContext;
GArray *mm_supported_modes_from_qmi_supported_modes_context (MMQmiSupportedModesContext *ctx,
gpointer log_object,
GError **error);
/*****************************************************************************/
/* QMI unique id manipulation */
gchar *mm_qmi_unique_id_to_firmware_unique_id (GArray *qmi_unique_id,
GError **error);
GArray *mm_firmware_unique_id_to_qmi_unique_id (const gchar *unique_id,
GError **error);
/*****************************************************************************/
/* Common UIM Get Card Status parsing */
gboolean mm_qmi_uim_get_card_status_output_parse (gpointer log_object,
QmiMessageUimGetCardStatusOutput *output,
MMModemLock *o_lock,
QmiUimPinState *o_pin1_state,
guint *o_pin1_retries,
guint *o_puk1_retries,
QmiUimPinState *o_pin2_state,
guint *o_pin2_retries,
guint *o_puk2_retries,
guint *o_pers_retries,
GError **error);
/*****************************************************************************/
/* UIM Get Configuration parsing */
gboolean mm_qmi_uim_get_configuration_output_parse (gpointer log_object,
QmiMessageUimGetConfigurationOutput *output,
MMModem3gppFacility *o_lock,
GError **error);
gboolean qmi_personalization_feature_from_mm_modem_3gpp_facility (MMModem3gppFacility facility,
QmiUimCardApplicationPersonalizationFeature *o_feature);
/*****************************************************************************/
/* MM error translations */
void mm_register_qmi_errors (void);
GError *mm_error_from_wds_verbose_call_end_reason (QmiWdsVerboseCallEndReasonType vcer_type,
guint vcer_reason,
MMBearerIpFamily ip_type,
gpointer log_object);
gboolean mm_error_from_qmi_loc_indication_status (QmiLocIndicationStatus status,
GError **error);
#endif /* MM_MODEM_HELPERS_QMI_H */