On 11/07/17 19:58, Eric Caruso wrote:
> If an MBIM modem supports unsolicited notifications for
> subscriber ready status, we can use it to detect when SIM cards
> have been removed and reinserted. Upon detection we should re-
> probe the modem so that we can configure it for the new SIM.
> ---

Rebased the patch on top of git master (just one minor conflict) and pushed it.

I also pushed a follow up commit to remove the multiple 
MM_BROADBAND_MODEM_MBIM() casts that were used in this implementation.

>  src/mm-broadband-modem-mbim.c | 94 
> +++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 91 insertions(+), 3 deletions(-)
> 
> diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
> index 0d1126d4..60530f9e 100644
> --- a/src/mm-broadband-modem-mbim.c
> +++ b/src/mm-broadband-modem-mbim.c
> @@ -88,6 +88,10 @@ struct _MMBroadbandModemMbimPrivate {
>      /* Access technology updates */
>      MbimDataClass available_data_classes;
>      MbimDataClass highest_available_data_class;
> +
> +    /* For checking whether the SIM has been hot swapped */
> +    gboolean sim_hot_swap_on;
> +    MbimSubscriberReadyState last_ready_state;
>  };
>  
>  
> /*****************************************************************************/
> @@ -627,6 +631,8 @@ unlock_required_subscriber_ready_state_ready (MbimDevice 
> *device,
>          }
>      }
>  
> +    ctx->self->priv->last_ready_state = ready_state;
> +
>      /* Fatal errors are reported right away */
>      if (error) {
>          g_simple_async_result_take_error (ctx->result, error);
> @@ -2041,8 +2047,15 @@ basic_connect_notification_subscriber_ready_status 
> (MMBroadbandModemMbim *self,
>      if (ready_state == MBIM_SUBSCRIBER_READY_STATE_INITIALIZED)
>          mm_iface_modem_update_own_numbers (MM_IFACE_MODEM (self), 
> telephone_numbers);
>  
> -    /* TODO: handle SIM removal using 
> MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED */
> +    if ((self->priv->last_ready_state != 
> MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED &&
> +         ready_state == MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED) ||
> +        (self->priv->last_ready_state == 
> MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED &&
> +               ready_state != MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED)) 
> {
> +        /* SIM has been removed or reinserted, re-probe to ensure correct 
> interfaces are exposed */
> +        mm_broadband_modem_update_sim_hot_swap_detected (MM_BROADBAND_MODEM 
> (self));
> +    }
>  
> +    self->priv->last_ready_state = ready_state;
>      g_strfreev (telephone_numbers);
>  }
>  
> @@ -2340,7 +2353,8 @@ cleanup_unsolicited_events_3gpp (MMIfaceModem3gpp *self,
>  {
>      MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY;
>      MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_CONNECT;
> -    MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
> +    if (!MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on)
> +        MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
>      MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE;
>      common_setup_cleanup_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), 
> FALSE, callback, user_data);
>  }
> @@ -2526,6 +2540,74 @@ modem_3gpp_enable_unsolicited_registration_events 
> (MMIfaceModem3gpp *self,
>  }
>  
>  
> /*****************************************************************************/
> +/* Setup SIM hot swap */
> +
> +static gboolean
> +modem_setup_sim_hot_swap_finish (MMIfaceModem *self,
> +                                 GAsyncResult *res,
> +                                 GError **error)
> +{
> +    return g_task_propagate_boolean (G_TASK (res), error);
> +}
> +
> +static void
> +enable_subscriber_info_unsolicited_events_ready (MMBroadbandModemMbim *self,
> +                                                 GAsyncResult *res,
> +                                                 GTask *task)
> +{
> +    GError *error = NULL;
> +
> +    if (!common_enable_disable_unsolicited_events_finish (self, res, 
> &error)) {
> +        mm_dbg ("Failed to enable subscriber info events: %s", 
> error->message);
> +        self->priv->sim_hot_swap_on = FALSE;
> +        g_task_return_error (task, error);
> +        g_object_unref (task);
> +        return;
> +    }
> +
> +    g_task_return_boolean (task, TRUE);
> +    g_object_unref (task);
> +}
> +
> +static void
> +setup_subscriber_info_unsolicited_events_ready (MMBroadbandModemMbim *self,
> +                                                GAsyncResult *res,
> +                                                GTask *task)
> +{
> +    GError *error = NULL;
> +
> +    if (!common_setup_cleanup_unsolicited_events_finish (self, res, &error)) 
> {
> +        mm_dbg ("Failed to set up subscriber info events: %s", 
> error->message);
> +        self->priv->sim_hot_swap_on = FALSE;
> +        g_task_return_error (task, error);
> +        g_object_unref (task);
> +        return;
> +    }
> +
> +    self->priv->enable_flags |= PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
> +    common_enable_disable_unsolicited_events (self,
> +                                              
> (GAsyncReadyCallback)enable_subscriber_info_unsolicited_events_ready,
> +                                              task);
> +}
> +
> +static void
> +modem_setup_sim_hot_swap (MMIfaceModem *self,
> +                          GAsyncReadyCallback callback,
> +                          gpointer user_data)
> +{
> +    GTask *task;
> +
> +    task = g_task_new (self, NULL, callback, user_data);
> +
> +    MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on = TRUE;
> +    MM_BROADBAND_MODEM_MBIM (self)->priv->setup_flags |= 
> PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
> +    common_setup_cleanup_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self),
> +                                             TRUE,
> +                                             
> (GAsyncReadyCallback)setup_subscriber_info_unsolicited_events_ready,
> +                                             task);
> +}
> +
> +/*****************************************************************************/
>  /* Enable/Disable unsolicited events (3GPP interface) */
>  
>  static gboolean
> @@ -2543,7 +2625,8 @@ modem_3gpp_disable_unsolicited_events (MMIfaceModem3gpp 
> *self,
>  {
>      MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY;
>      MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_CONNECT;
> -    MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
> +    if (!MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on)
> +        MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
>      MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= 
> ~PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE;
>      common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM 
> (self), callback, user_data);
>  }
> @@ -3165,6 +3248,7 @@ mm_broadband_modem_mbim_new (const gchar *device,
>                           MM_BASE_MODEM_PLUGIN, plugin,
>                           MM_BASE_MODEM_VENDOR_ID, vendor_id,
>                           MM_BASE_MODEM_PRODUCT_ID, product_id,
> +                         MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, TRUE,
>                           NULL);
>  }
>  
> @@ -3251,6 +3335,10 @@ iface_modem_init (MMIfaceModem *iface)
>      /* Create MBIM-specific bearer */
>      iface->create_bearer = modem_create_bearer;
>      iface->create_bearer_finish = modem_create_bearer_finish;
> +
> +    /* SIM hot swapping */
> +    iface->setup_sim_hot_swap = modem_setup_sim_hot_swap;
> +    iface->setup_sim_hot_swap_finish = modem_setup_sim_hot_swap_finish;
>  }
>  
>  static void
> 


-- 
Aleksander
https://aleksander.es
_______________________________________________
ModemManager-devel mailing list
ModemManager-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel

Reply via email to