aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2024-08-31 17:20:54 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2024-09-11 11:01:18 +0000
commit8a5aab8be559feba7ef25f9cfae9c329fe7a0208 (patch)
tree825e5747b9381557fdd337b346253b305a98abd8 /src/plugins
parent58f25ec5f9ad90f4cc66abff6ed5ff19d434be0f (diff)
fibocom: L850 specific hack when using an AT&T 310280 SIM card
L850 modems running a firmware version less than 18500.5001.0.7 and using AT&T SIM cards with MCCMNC 310280 do not support specifying "partner" settings in the MBIM operation to set the LTE attach configuration.
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.c162
-rw-r--r--src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.h2
2 files changed, 159 insertions, 5 deletions
diff --git a/src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.c b/src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.c
index 7fdf60a7..9ea560b4 100644
--- a/src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.c
+++ b/src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.c
@@ -27,12 +27,148 @@
#include "mm-broadband-modem-mbim-xmm-fibocom.h"
#include "mm-shared-fibocom.h"
-static void shared_fibocom_init (MMSharedFibocomInterface *iface);
+static void iface_modem_init (MMIfaceModemInterface *iface);
static void iface_modem_firmware_init (MMIfaceModemFirmwareInterface *iface);
+static void shared_fibocom_init (MMSharedFibocomInterface *iface);
+
+static MMIfaceModemInterface *iface_modem_parent;
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemMbimXmmFibocom, mm_broadband_modem_mbim_xmm_fibocom, MM_TYPE_BROADBAND_MODEM_MBIM_XMM, 0,
- G_IMPLEMENT_INTERFACE (MM_TYPE_SHARED_FIBOCOM, shared_fibocom_init)
- G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_FIRMWARE, iface_modem_firmware_init))
+ G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)
+ G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_FIRMWARE, iface_modem_firmware_init)
+ G_IMPLEMENT_INTERFACE (MM_TYPE_SHARED_FIBOCOM, shared_fibocom_init))
+
+struct _MMBroadbandModemMbimXmmFibocomPrivate {
+ gboolean custom_att_310280_attach;
+};
+
+/******************************************************************************/
+
+/* Custom AT&T attach operation in MBIM where the partner settings are fully
+ * skipped, while the non-partner ones are given. */
+#define CUSTOM_ATT_310280_ATTACH_UNNEEDED_VERSION 18500, 5001, 0, 7
+
+static inline gboolean
+compare_l850_version (guint A1, guint A2, guint A3,
+ guint A4, guint A5, guint A6,
+ guint B1, guint B2, guint B3, guint B4)
+{
+ return ((A1 == B1) && (A2 == B2) && (A4 >= B4));
+}
+
+static void
+process_version_features (MMBroadbandModemMbimXmmFibocom *self,
+ const gchar *revision)
+{
+ g_auto(GStrv) split = NULL;
+ guint A1;
+ guint A2;
+ guint A3;
+ guint A4;
+ guint A5;
+ guint A6;
+
+ /* Exit early if not L850 */
+ if (!(mm_base_modem_get_vendor_id (MM_BASE_MODEM (self)) == 0x2cb7 &&
+ mm_base_modem_get_product_id (MM_BASE_MODEM (self)) == 0x0007)) {
+ return;
+ }
+
+ split = g_strsplit_set (revision, "._", -1);
+ if (!split || g_strv_length (split) < 6) {
+ mm_obj_warn (self, "failed to process firmware version string: splitting failed");
+ return;
+ }
+
+ if (!mm_get_uint_from_str (split[0], &A1) ||
+ !mm_get_uint_from_str (split[1], &A2) ||
+ !mm_get_uint_from_str (split[2], &A3) ||
+ !mm_get_uint_from_str (split[3], &A4) ||
+ !mm_get_uint_from_str (split[4], &A5) ||
+ !mm_get_uint_from_str (split[5], &A6)) {
+ mm_obj_warn (self, "failed to process firmware version string: failed to convert to integer");
+ return;
+ }
+
+ /* Check if fix for ATT attach APN for 310/280 is supported on L850 */
+ self->priv->custom_att_310280_attach = !compare_l850_version (A1, A2, A3, A4, A5, A6, CUSTOM_ATT_310280_ATTACH_UNNEEDED_VERSION);
+ mm_obj_info (self, "custom attach logic for AT&T 310280 %s needed",
+ self->priv->custom_att_310280_attach ? "is" : "not");
+}
+
+/******************************************************************************/
+
+static gchar *
+load_revision_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (res), error);
+}
+
+static void
+parent_load_revision_ready (MMIfaceModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+ gchar *revision;
+
+ revision = iface_modem_parent->load_revision_finish (self, res, &error);
+ if (!revision) {
+ g_task_return_error (task, error);
+ } else {
+ process_version_features (MM_BROADBAND_MODEM_MBIM_XMM_FIBOCOM (self), revision);
+ g_task_return_pointer (task, revision, g_free);
+ }
+ g_object_unref (task);
+}
+
+static void
+load_revision (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_assert (iface_modem_parent->load_revision);
+ g_assert (iface_modem_parent->load_revision_finish);
+ iface_modem_parent->load_revision (self,
+ (GAsyncReadyCallback)parent_load_revision_ready,
+ g_task_new (self, NULL, callback, user_data));
+}
+
+/******************************************************************************/
+
+static MMBroadbandModemMbimSetInitialEpsBearerSettingsFlag
+load_set_initial_eps_bearer_settings_mask (MMBroadbandModemMbim *_self)
+{
+ MMBroadbandModemMbimXmmFibocom *self = MM_BROADBAND_MODEM_MBIM_XMM_FIBOCOM (_self);
+ MMBroadbandModemMbimSetInitialEpsBearerSettingsFlag mask = MM_BROADBAND_MODEM_MBIM_SET_INITIAL_EPS_BEARER_SETTINGS_FLAG_DEFAULT;
+ g_autoptr(MMBaseSim) modem_sim = NULL;
+ const gchar *operator_identifier = NULL;
+
+ if (!self->priv->custom_att_310280_attach)
+ return mask;
+
+ g_object_get (self,
+ MM_IFACE_MODEM_SIM, &modem_sim,
+ NULL);
+
+ if (modem_sim)
+ operator_identifier = mm_gdbus_sim_get_operator_identifier (MM_GDBUS_SIM (modem_sim));
+
+ /* Fix for attach APN issue with ATT SIM cards MCC/MNC 310/280
+ * is available on L850 MR8. Execute custom attach logic only
+ * for old versions */
+ if (mm_base_modem_get_vendor_id (MM_BASE_MODEM (self)) == 0x2cb7 &&
+ mm_base_modem_get_product_id (MM_BASE_MODEM (self)) == 0x0007 &&
+ !g_strcmp0 (operator_identifier, "310280")) {
+ mm_obj_dbg (self, "requesting LTE attach configuration update without partner section");
+ mask &= ~MM_BROADBAND_MODEM_MBIM_SET_INITIAL_EPS_BEARER_SETTINGS_FLAG_UPDATE_PARTNER;
+ mask |= MM_BROADBAND_MODEM_MBIM_SET_INITIAL_EPS_BEARER_SETTINGS_FLAG_SKIP_PARTNER;
+ }
+
+ return mask;
+}
/******************************************************************************/
@@ -65,6 +201,18 @@ mm_broadband_modem_mbim_xmm_fibocom_new (const gchar *device,
static void
mm_broadband_modem_mbim_xmm_fibocom_init (MMBroadbandModemMbimXmmFibocom *self)
{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+ MM_TYPE_BROADBAND_MODEM_MBIM_XMM_FIBOCOM,
+ MMBroadbandModemMbimXmmFibocomPrivate);
+ self->priv->custom_att_310280_attach = FALSE;
+}
+
+static void
+iface_modem_init (MMIfaceModemInterface *iface)
+{
+ iface_modem_parent = g_type_interface_peek_parent (iface);
+ iface->load_revision = load_revision;
+ iface->load_revision_finish = load_revision_finish;
}
static void
@@ -89,10 +237,14 @@ shared_fibocom_init (MMSharedFibocomInterface *iface)
static void
mm_broadband_modem_mbim_xmm_fibocom_class_init (MMBroadbandModemMbimXmmFibocomClass *klass)
{
- MMBaseModemClass *base_modem_class = MM_BASE_MODEM_CLASS (klass);
- MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
+ MMBaseModemClass *base_modem_class = MM_BASE_MODEM_CLASS (klass);
+ MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
+ MMBroadbandModemMbimClass *broadband_modem_mbim_class = MM_BROADBAND_MODEM_MBIM_CLASS (klass);
+
+ g_type_class_add_private (G_OBJECT_CLASS (klass), sizeof (MMBroadbandModemMbimXmmFibocomPrivate));
base_modem_class->create_usbmisc_port = mm_shared_fibocom_create_usbmisc_port;
base_modem_class->create_wwan_port = mm_shared_fibocom_create_wwan_port;
broadband_modem_class->setup_ports = mm_shared_fibocom_setup_ports;
+ broadband_modem_mbim_class->load_set_initial_eps_bearer_settings_mask = load_set_initial_eps_bearer_settings_mask;
}
diff --git a/src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.h b/src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.h
index bfb0df7a..68a26782 100644
--- a/src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.h
+++ b/src/plugins/fibocom/mm-broadband-modem-mbim-xmm-fibocom.h
@@ -27,9 +27,11 @@
typedef struct _MMBroadbandModemMbimXmmFibocom MMBroadbandModemMbimXmmFibocom;
typedef struct _MMBroadbandModemMbimXmmFibocomClass MMBroadbandModemMbimXmmFibocomClass;
+typedef struct _MMBroadbandModemMbimXmmFibocomPrivate MMBroadbandModemMbimXmmFibocomPrivate;
struct _MMBroadbandModemMbimXmmFibocom {
MMBroadbandModemMbimXmm parent;
+ MMBroadbandModemMbimXmmFibocomPrivate *priv;
};
struct _MMBroadbandModemMbimXmmFibocomClass{