Here are logs for SIM insertion:

2017-07-11T10:27:30.292312-07:00 INFO ModemManager[3598]: <debug>
Received notification (service 'basic-connect', command
'subscriber-ready-status')
2017-07-11T10:27:30.292411-07:00 INFO ModemManager[3598]: <debug>
Releasing SIM hot swap ports context
2017-07-11T10:27:30.292490-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) device open count is 0 (close)
2017-07-11T10:27:30.292571-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) closing serial port...
2017-07-11T10:27:30.298906-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) serial port closed
2017-07-11T10:27:30.298970-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) device open count is 0 (close)
2017-07-11T10:27:30.299018-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) closing serial port...
2017-07-11T10:27:30.303705-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) serial port closed
2017-07-11T10:27:30.304335-07:00 INFO ModemManager[3598]: <debug>
[device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1] unexported
modem from path '/org/freedesktop/ModemManager1/Modem/0'
2017-07-11T10:27:30.304962-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) forced to close port
2017-07-11T10:27:30.306039-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) forced to close port
2017-07-11T10:27:30.306255-07:00 INFO ModemManager[3598]: <info>
[device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1] creating modem
with plugin 'Generic' and '7' ports
2017-07-11T10:27:30.306381-07:00 INFO ModemManager[3598]: <debug>
MBIM-powered generic modem found...

after which the modem initializes as you would expect with the SIM
inserted, and connects to the network. When a SIM is removed:

2017-07-11T10:27:52.809700-07:00 INFO ModemManager[3598]: <debug>
Received notification (service 'basic-connect', command
'subscriber-ready-status')
2017-07-11T10:27:52.809813-07:00 INFO ModemManager[3598]: <debug>
Releasing SIM hot swap ports context
2017-07-11T10:27:52.809895-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) device open count is 1 (close)
2017-07-11T10:27:52.809970-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) device open count is 1 (close)
2017-07-11T10:27:52.810267-07:00 INFO ModemManager[3598]: <info>
Modem /org/freedesktop/ModemManager1/Modem/1: state changed (connected
-> disabling)
2017-07-11T10:27:52.811251-07:00 INFO ModemManager[3598]: <debug>
Disconnecting bearer '/org/freedesktop/ModemManager1/Bearer/0'
2017-07-11T10:27:52.811345-07:00 INFO ModemManager[3598]: <debug>
Launching disconnection on data port (net/wwan0)
[...]
2017-07-11T10:27:53.153117-07:00 INFO ModemManager[3598]: <info>
Modem /org/freedesktop/ModemManager1/Modem/1: 3GPP Registration state
changed (home -> unknown)
2017-07-11T10:27:53.153377-07:00 INFO ModemManager[3598]: <debug>
Bearer not allowed to connect, not registered in 3GPP network
2017-07-11T10:27:53.153476-07:00 INFO ModemManager[3598]: <debug>
Modem /org/freedesktop/ModemManager1/Modem/1: access technology
changed (hsdpa, hsupa -> unknown)
2017-07-11T10:27:53.153980-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) device open count is 0 (close)
2017-07-11T10:27:53.154071-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) closing serial port...
2017-07-11T10:27:53.157973-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) serial port closed
2017-07-11T10:27:53.158010-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) device open count is 0 (close)
2017-07-11T10:27:53.158039-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) closing serial port...
2017-07-11T10:27:53.160734-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) serial port closed
2017-07-11T10:27:53.160801-07:00 INFO ModemManager[3598]: <info>
Modem /org/freedesktop/ModemManager1/Modem/1: state changed (disabling
-> disabled)
2017-07-11T10:27:53.160926-07:00 INFO ModemManager[3598]: <info>
Simple connect state (3/8): Enable
2017-07-11T10:27:53.161566-07:00 INFO ModemManager[3598]: <debug>
Removing from DBus bearer at '/org/freedesktop/ModemManager1/Bearer/0'
2017-07-11T10:27:53.161627-07:00 INFO ModemManager[3598]: <debug>
[device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1] unexported
modem from path '/org/freedesktop/ModemManager1/Modem/1'
2017-07-11T10:27:53.162223-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) forced to close port
2017-07-11T10:27:53.162280-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) forced to close port
2017-07-11T10:27:53.162320-07:00 INFO ModemManager[3598]: <info>
[device /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1] creating modem
with plugin 'Generic' and '7' ports
2017-07-11T10:27:53.162352-07:00 INFO ModemManager[3598]: <debug>
MBIM-powered generic modem found...
[...]
2017-07-11T10:28:02.208920-07:00 INFO ModemManager[3598]: <debug>
Couldn't check if unlock required: 'SIM not inserted'
2017-07-11T10:28:02.209405-07:00 INFO ModemManager[3598]: <info>
Modem: state changed (unknown -> failed)
2017-07-11T10:28:02.210080-07:00 WARNING ModemManager[3598]: <warn>
Modem couldn't be initialized: Couldn't check unlock status: SIM not
inserted
2017-07-11T10:28:02.210410-07:00 INFO ModemManager[3598]: <debug>
Couldn't initialize interface: 'Firmware interface not available'
2017-07-11T10:28:02.210715-07:00 INFO ModemManager[3598]: <debug>
Creating ports context for SIM hot swap
2017-07-11T10:28:02.210822-07:00 INFO ModemManager[3598]: <debug>
(ttyACM0) device open count is 2 (open)
2017-07-11T10:28:02.210901-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) opening serial port...
2017-07-11T10:28:02.212760-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2): setting up baudrate: 57600
2017-07-11T10:28:02.213030-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2) device open count is 1 (open)
2017-07-11T10:28:02.213124-07:00 INFO ModemManager[3598]: <debug>
(ttyACM2): running init sequence...
2017-07-11T10:28:02.213300-07:00 INFO ModemManager[3598]: <info>  SIM
is missing, but the modem supports SIM hot swap. Waiting for SIM...

This shows the modem is brought up in the failed state, so we export
the right set of interfaces.

On Tue, Jul 11, 2017 at 2:35 AM, Aleksander Morgado
<aleksan...@aleksander.es> wrote:
> Hey Eric,
>
> Looks very good to me, just some minor coding style issues, see below.
> Also, I wouldn't mind debug logs when inserting the sim and removing
> the sim, for future reference.
>
> On Tue, Jul 11, 2017 at 3:09 AM, Eric Caruso <ejcar...@chromium.org> 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.
>> ---
>>  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..422f8ee4 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 (MMIfaceModem *self,
>
> common_enable_disable_unsolicited_events() receives a
> MMBroadbandModemMbim self pointer, and so the callback passed should
> have that as first argument. This will avoid the explicit cast when
> calling finish().
>
>> +                                                 GAsyncResult *res,
>> +                                                 GTask* task)
>
> The asterisk should be attached to the variable name above.
>
>> +{
>> +    GError *error = NULL;
>> +
>> +    if (!common_enable_disable_unsolicited_events_finish 
>> (MM_BROADBAND_MODEM_MBIM (self), res, &error)) {
>> +        mm_dbg ("Failed to enable subscriber info events: %s", 
>> error->message);
>> +        MM_BROADBAND_MODEM_MBIM (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 (MMIfaceModem *self,
>
> common_setup_cleanup_unsolicited_events() receives a
> MMBroadbandModemMbim self pointer, and so the callback passed should
> have that as first argument. This will avoid the explicit cast when
> calling finish() and also all the other casts you have in the method.
>
>> +                                                GAsyncResult *res,
>> +                                                GTask *task)
>> +{
>> +    GError *error = NULL;
>> +
>> +    if (!common_setup_cleanup_unsolicited_events_finish 
>> (MM_BROADBAND_MODEM_MBIM (self), res, &error)) {
>> +        mm_dbg ("Failed to set up subscriber info events: %s", 
>> error->message);
>> +        MM_BROADBAND_MODEM_MBIM (self)->priv->sim_hot_swap_on = FALSE;
>> +        g_task_return_error (task, error);
>> +        g_object_unref (task);
>> +        return;
>> +    }
>> +
>> +    MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags |= 
>> PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
>> +    common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM 
>> (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
>> --
>> 2.12.2
>>
>> _______________________________________________
>> ModemManager-devel mailing list
>> ModemManager-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel
>
>
>
> --
> 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